众所周知,网络数据包的传输是受到链路的MTU限制的。传统的TCP/IP协议中,IP层会根据PMTU(Path MTU)对数据包进行分片,并投递到链路上,最终发到目的地。目的地收到分片后,再组合成一个完整的数据包。现在linux的实现中,充分利用了硬件网卡的校验功能,对数据包延迟分片,提升性能。本章主要介绍linux内核中的这个技术,并重点介绍了offload软分片技术。分别对应TCP,UDP这两个传输层协议来介绍TSO(Tcp Segmentation Offload),UFO(Udp Fragmentation Offload)。最后给出实验数据,说明这个特性的优势。
IP分片
IP头部的定义见表1。分片的技术就是利用了IP头部中的认证,标志,和段偏移量这3个字段来完成的。属于同一个包的所有分片,认证字段必须是相同的。段偏移量则记录了该分片在原始包中的位置。这些字段在重组的时候也是必要要用到的。至于如何分片的不再讨论范围。
图1给出了IP分片后的效果。
网卡分片
高速网卡设备(千兆网卡以上)不仅可以自动的计算数据包的校验和,而且可以根据不同的协议自动的对数据包进行分片。由于MTU的限制,原先只能通过IP协议对大的数据包进行分片,现在网卡设备硬件本身就可以分片,并自动计算出校验和。同时,在接收处理方面,也有一些智能的功能,比如可以硬件确认数据包的校验和是否正确,可以接收大的数据包。
通过ethtool命令,可以看到网卡所支持的特性,例如:david@david