首页 >> 知识 >> 用户空间协议栈设计和netmap综合指南,将网络效率提升到新高度

用户空间协议栈设计和netmap综合指南,将网络效率提升到新高度

一、协议概念 1.1、七层网络模型和五层网络模型

应用层: 最接近用户的一层,为用户程序提供网络服务。主要协议有HTTP、FTP、TFTP、SMTP、DNS、POP3、DHCP等。表示层: 数据的表示、安全、压缩。管理数据的解密和加密。会话层: 负责在网络中的两个节点之间的建立、维持和终止通信。传输层: 模型中最重要的一层,负责传输协议的流控和差错校验。数据包离开网卡后进入的就是传输层;主要协议有:TCP、UDP等。网络层: 将网络地址翻译成对应的物理地址。主要协议有:ICMP、IP等。数据链路层: 建立逻辑连接、进行硬件地址寻址、差错校验等功能,解决两台相连主机之间的通信问题。主要协议有SLIP、以太网协议/MAC帧协议、ARP和RARP等。物理层: 模型的最低层,建立、维护、断开物理连接,传输比特流。常见的物理媒介有光纤、电缆、中继器等。主要协议有RS232等。

1.2、以太网

以太网不是一种网络,而是一种局域网技术,它既有数据链路层内容,也有一些物理层内容。局域网技术除了以太网外,还有令牌环网、无线LAN/WAN等。以太网的网线必须是双绞线,以太网中的所有主机共享一个通信通道; 当局域网中一台主机发送数据后,该局域网的所有设备都会收到该数据。因为共用一个通信通道,因此同一时刻只允许一台主机发送数据;如果同一时刻不只有一个主机发送数据,为避免干扰,该主机会执行碰撞避免算法(等待一段时间后再进行数据重发)。以太网帧格式如下:

源地址和目的地址是指网卡MAC地址,长度是48 bit(6字节)。帧协议类型字段有三种,分别对应IP协议、ARP协议和RARP协议。帧末尾是CRC校验码。

定义一个以太网头结构体示例代码:

#define ETHER_ADDR_LEN 6struct etherhdr { unsigned char dst_mac[ETHER_ADDR_LEN]; unsigned char src_mac[ETHER_ADDR_LEN]; unsigned short protocol;};

输出它的大小:

sizeof(struct etherhdr) = 14 1.3、IP协议

IP协议全称Internet Protocol,即网际互连协议,存在于网络层,负责数据在网络中传输。IP协议格式如下:

0 |1 |2 |3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-------+-------+---------------+-------------------------------+|version|hdr_len| Type Of Server| total length |+-------------------------------+-----+-------------------------+| ID |flag | framegament offset |+---------------+---------------+-------------------------------+| TTL | Protocol | header CRC |+---------------------------------------------------------------+| Source IP |+---------------------------------------------------------------+| Destination IP |+---------------------------------------------------------------+| Option (if have) |+---------------------------------------------------------------+| Data || ... |+---------------------------------------------------------------+

定义一个IP协议头结构体示例代码:

struct iphdr { unsigned char version : 4, hdrlen : 4; unsigned char tos; unsigned short totlen; unsigned short id; unsigned short flag : 3, offset : 13; unsigned char ttl; unsigned char protocol; unsigned short check; unsigned int sip; unsigned int dip;}; 1.4、ARP协议

ARP协议全称Address Resolution Protocol,即地址解析协议,是根据IP地址获取MAC地址的一个TCP/IP协议。

ARP协议的作用:在同一个局域网中要给对方发消息,就必须得知道对方的MAC地址,而实际大部分情况下只知道对方的IP地址,因此需要通过ARP协议来根据IP地址来获取目标主机的MAC地址。ARP的数据格式如下:

0 |1 |2 |3 |4 |5 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7+-----------------------------------------------------------------------------------------------+| Ethernet Destination IP |+-----------------------------------------------------------------------------------------------+| Ethernet Source IP |+-------------------------------+-------------------------------+-------------------------------+| framegament type | harware address tpye | Protocol address type |+---------------+---------------+-------------------------------+-------------------------------+| HW_addr_length|Pro_addr_len | op code | Source MAC |+---------------------------------------------------------------+-------------------------------|| Source MAC | Source IP |+-------------------------------+---------------------------------------------------------------|| Source IP | Destination MAC | +-------------------------------+---------------------------------------------------------------+| Destination MAC | Destination IP |+-----------------------------------------------------------------------------------------------+| || PAD || |+-----------------------------------------------------------------------------------------------+

可以看出,ARP是MAC帧协议的上层协议,前3个字段和最后一个字段对应的就是以太网头部。由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段。定义一个arp协议头结构体示例代码:

struct arphdr{ unsigned short h_type; unsigned short h_proto; unsigned char h_addrlen; unsigned char protolen; unsigned short oper; unsigned char smac[ETH_ALEN]; unsigned int sip; unsigned char dmac[ETH_ALEN]; unsigned int dip; // pad}; 1.4.1、ARP攻击原理

arp攻击得到主要目的是使网络无法正常通信。 向局域网中的所有主机发送ARP应答,其中包含网关IP地址和虚假的MAC地址。局域网中的主机收到ARP应答跟新ARP表后,再发送数据时,就会发送到虚假的MAC地址导致通信故障,就无法和网关正常通信,导致无法访问互联网。

1.4.2、ARP欺骗原理

ARP欺骗并不会使网络无法正常通信,而是通过冒充网关或其他主机 使得 到达网关或主机的数据流量通过攻击主机进行转发。

比如冒充网关:ARP欺骗发送arp应答给局域网中其他的主机,其中包含网关的IP地址和进行ARP欺骗的主机MAC地址;并且也发送了ARP应答给网关,其中包含局域网中所有主机的IP地址和进行arp欺骗的主机MAC地址。当局域网中主机和网关收到ARP应答跟新ARP表后,主机和网关之间的流量就需要通过攻击主机进行转发。冒充主机的过程和冒充网关相同。

1.5、ICMP协议

ICMP全称Internet Control Message Protocol,即互联网控制消息协议,位于 IP 报文的数据段。虽然ICMP是网络层协议,但它不直接传递数据到数据链路层,而是封装成IP数据包再传递到数据链路层,IP数据包中的协议类型字段为1就表示ICMP报文。ICMP协议的类型主要有两类:查询报文和差错报文。ICMP报文格式如下:

0 |1 |2 |3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+---------------+---------------+-------------------------------+| type | code | CRC |+-------------------------------+-------------------------------+| ID | Sequence Number |+---------------------------------------------------------------+| mask |+---------------------------------------------------------------+ 标识 含义 type 类型,0 代表应答 ICMP 报文、8 代表请求 ICMP 报文。 code 代码,type= 8 && code= 0 表示回显请求(ping 请求);type= 0 && code= 0 表示回显应答(ping 应答);type = 11 && code = 0 表示超时。 CRC 校验和,包括数据在内的整个 ICMP 数据报的检验和 ID 标识符,将发送进程的 ID 号放置在标识符字段,这样即使在主机上运行了多个 ping 程序,ping 程序也可以识别出返回的信息。 Sequence Number 序列号,从 0 开始,每发送一次心得回显请求就加 1 。 mask 子网掩码

定义一个ICMP协议头结构体示例代码:

// ICMPstruct icmphdr { unsigned char type; unsigned char code; unsigned short check; unsigned short identifier; unsigned short sep; unsigned cahr data[32];};

ICMP的应用:(1)ping命令。向目的服务器发送回显请求,目的服务器发送回显应答;计算发送回显请求数据包的时间与接收到回显应答数据包的时间差,就是数据包一去一回所需要的时间。(2)traceroute命令。traceroute命令利用 ICMP 差错报文类型,用作追踪路由信息。前提条件是路由器没有禁用 ICMP。

1.6、MTU概念

MTU,全称Maximum Transmission Unit,即最大传输单元。说明一次数据帧可以发送或接收的最大数据量;以字节为单位,一般是是1500,不同网络类型的MTU不同。

(1)如果一次发送要发送的数据超过MTU,需要在IP层对数据进行分片。数据分片和组装在IP层,因为不同网络的MTU不同,不仅源主机可能需要对数据进行分片,数据传输过程中的路由器也可能对数据分片。

(2)以太网规定数据的最小长度为46字节,如果发送数据小于46字节,需要填充,比如ARP数据包就需要填充才能发送。

(3)对于UDP,是定长的8字节报头,如果IP报头没有携带可选项字段,那么UDP一次携带的数据最大为1500-20-8=1472字节,如果超出这个大小就需要在IP层进行分片。分片带来的后果是增加UDP的丢包率。

(4)分片也会增加TCP的丢包率,不过TCP有重传机制;因此需要尽可能避免分片,降低TCP重传次数。

1.7、MSS概念

MSS,全称Maximum Segment Size,即最大报文段大小。表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要提供各自的MSS。通过协商确定MSS的值(双方MSS的最小值)以避免TCP分片。如果没有分段发生, MSS越大越好。

1.8、TTL概念

TTL,全称Time To Live,即存活时间;指一个数据包可传递的最长距离(跃点数)。当一个数据包经过一个路由器时,TTL减一;当TTL=0时路由器就会取消数据包的转发。草莓视频在线观看APP知道网络是有 环 存在的,设计TTL的目的是防止数据包因为不正确的路由表等原因造成无线循环而无法送达导致耗尽网络资源。

二、数据传输框图

网络上所有的数据传输都要经过网卡,网卡将模拟信号转换为数字信号,也就是将物理层信号转换为数据链路层信号。

注意:(1)send()返回成功不代表发送成功,send()只是包数据拷贝到写缓冲区,真正发送数据由协议栈完成。如果客户端宕机而服务端一直执行send(),那么在一段时间后send()会返回-1;因为写缓冲区中的数据没有发送出去导致写缓冲区爆满。(2)协议栈就是数据根据七层网络模型,自顶向下一层一层的协议头包住数据;接收端也是根据七层网络模型,自底向上一层层的解析协议。(3)驱动如何把数据传递到协议栈?在Linux kernel有一个sk_buffer结构,sk_buffer将驱动获取的数据通过sk_buffer传递到协议栈中。关于整个过程的执行流程可以参考这篇文章:

网站地图