栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++高并发服务器开发(一) - 网络基础】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++高并发服务器开发(一) - 网络基础】

1、网卡
网络适配器  :作用  收发数据
mac地址  作用: 用来标识一块网卡   6个字节  物理地址	(前 3 位是 厂商ID)
网卡中英文对照


2、IP
ip用来标识一台主机  逻辑地址
iPv4 :     ip地址是4字节 32位
ipv6 :     128位   16字节
子网id     ip中被子网掩码中1连续覆盖的位
主机id     ip中被子网掩码中0连续覆盖的位


网段地址: 192.168.1.0
广播地址: 192.168.1.255
子网掩码 netmask: 用来区分子网id 和主机id

3、端口
作用: 用来标识应用程序(进程)
port: 2个字节  0-65535
知名端口	   	  0-1023 
自定义端口     1024 - 65535
查看端口命令   netstat
4、OSI七层模型
物理层:   	双绞线接口类型, 光纤的传输速率等等
数据链路层:  mac 负责收发数据
网络层: 	ip 给两台主机提供路径选择
传输层: 	port  区分数据递送到哪一个应用程序
会话层: 	建立链接
表示层: 	解码 
应用层

在 TCP/IP 模型中,不细分为 7 层,只需要 4 层即可。


传输层: 端口标识 (进程 — 进程)
网络层: IP 标识 (主机 — 主机)
链路层: Mac 标识 (设备 — 设备)

5、协议

规定了数据传输的方式和格式

应用层协议:  
FTP:  文件传输协议
HTTP: 超文本传输协议
NFS:  网络文件系统
传输层协议:
TCP:  传输控制协议
UDP:  用户数据报协议
网络层:
IP:	   英特网互联协议
ICMP:  英特网控制报文协议  ping
IGMP:  英特网组管理协议
链路层协议:
ARP:   地址解析协议 通过ip找mac地址
RARP:  反向地址解析协议 通过mac找ip

6、网络通信过程
从上到下组包,从下往上拆包

7、ARP协议
ARP:地址解析协议 	(通过 IP 地址寻找主机 MAC 地址)
广播发送 ARP 请求,对应主机收到 ARP 请求后,单播回应发送方


ARP 请求包

8、网络设计模式
B/S  browser/ server			(B/S模式 有浏览器,只能选择 http 协议)
C/S  cilent/server 				(C/S模式 协议选择灵活)

c/s   优缺点:性能较好 客户端容易篡改数据   开发周期较长
b/s   优缺点:性能低   客户端安全  		  开发周期短
9、进程间通信
无名管道、命名管道、mmap、文件、信号、消息队列、共享内存等 只能用于本机的进程间通信

进程间的通信需要使用: socket		(socket 必须成对出现)

10、字节序
0x0102: 低地址 02  高地址 01
小端: 低位存低地址,高位存高地址
大端: 低位存高地址,高位存低地址
网络字节序规定用大端存储
主机间通讯: 主机字节序 —— 网络字节序 —— 主机字节序

11、ip转换
#include 
int inet_pton(int af, const char *src, void *dst);

功能: 将点分十进制串 转成32位网络大端的数据(“192.168.1.2” ==> )
参数:

 af : 
    AF_INET         IPV4
    AF_INET6        IPV6

src: 点分十进制串的首地址
dst : 32位网络数据的地址
成功返回1

#include 
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

功能: 将32位大端的网络数据转成点分十进制串
参数:

af   :  AF_INET
src  :  32位大端的网络数 地址
dst  :  存储点分十进制串 地址
size :  存储点分制串数组的大小  

返回值: 存储点分制串数组首地址

12、网络通信解决三大问题
协议、ip、端口
通过命令 man 7 ip 查看 IPv4 协议的结构体


ipv4 套接字结构体

struct sockaddr_in {
               sa_family_t    sin_family; 
               in_port_t      sin_port;   
               struct in_addr sin_addr;   
           };
       
       struct in_addr {
           uint32_t       s_addr;     
       };

sin_family :    协议  AF_INET
sin_portL  :    端口
sin_addr   :    ip 地址

ipv6套接字结构体

struct sockaddr_in6 {
    unsigned short int sin6_family;        
    __be16 sin6_port;                 	   
    __be32 sin6_flowinfo;             	   
    struct in6_addr sin6_addr;        	   
    __u32 sin6_scope_id;             	   
};

struct in6_addr {
    union {
        __u8 u6_addr8[16];
        __be16 u6_addr16[8];
        __be32 u6_addr32[4];
    } in6_u;
    #define s6_addr        in6_u.u6_addr8
    #define s6_addr16      in6_u.u6_addr16
    #define s6_addr32     in6_u.u6_addr32
};
 
#define UNIX_PATH_MAX 108
    struct sockaddr_un {
    __kernel_sa_family_t sun_family;   
    char sun_path[UNIX_PATH_MAX];	   
};

通用套接字结构体

struct sockaddr {
    sa_family_t sa_family;     
    char sa_data[14];          
};
13、tcp
传输控制协议
特点 :   出错重传 每次发送数据对方都会回ACK, 可靠 
建立连接   使用连接   关闭连接
(1)创建套接字 API
#include 
int socket(int domain, int type, int protocol);

创建套接字

参数:
domain : AF_INET
type: SOCK_STREAM 流式套接字 用于 TCP 通信 (字节流)
	  SOCK_DGRAM  报式套接字 用于 UDP 通信 (字节报)
protocol : 0

成功返回文件描述符,失败返回-1

使用 man socket 命令查看创建 套接字API 的方法

(2)连接服务器
使用 man connect 命令查看 连接
若提示 “无 connect 的手册条目”,则执行命令 sudo apt-get install manpages-posix-dev

#include 
int connect(intsockfd , const struct sockaddr *addr, socklen_t addrlen);

功能: 连接服务器

sockfd :  socket套接字
addr   :  ipv4套接字结构体的地址
addrlen:  ipv4套接字结构体的长度

eg:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869154.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号