Notes about network checksum offload
本文将mark下network checksum offload技术的相关notes。
软件协议checksum
很多网络协议,例如IP、TCP、UDP都有自己的校验和(checksum)。
TCP checksum
TCP校验和计算三部分:TCP头部、TCP数据和TCP伪头部。TCP校验和是必须的。
UDP checksum
UDP校验和计算三部分:UDP头部、UDP数据和UDP伪头部。UDP校验和是可选的。
IP checksum
IP校验和只计算检验IP数据报的首部,但不包括IP数据报中的数据部分。
checksum offload
传统上,校验和的计算(发送数据包)和验证(接收数据包)是通过CPU完成的。这对CPU的影响很大,因为校验和需要每个字节的数据都参与计算。对于一个100G带宽的网络,需要CPU最多每秒计算大约12G的数据。
为了减轻这部分的影响,现在的网卡,都支持校验和的计算和验证。系统内核在封装网络数据包的时候,可以跳过校验和。网卡收到网络数据包之后,根据网络协议的规则,进行计算,再将校验和填入相应的位置。
因为Checksum offload的存在,在用tcpdump之类的抓包分析工具时,有时会发现抓到的包提示校验和错误(checksum incorrect)。tcpdump抓到的网络包就是系统内核发给网卡的网络包,如果校验和放到网卡去计算,那么tcpdump抓到包的时刻,校验和还没有被计算出来,自然看到的是错误的值。
virtio-net
VIRTIO_NET_F_CSUM (0)
Device handles packets with partial checksum. This “checksum offload” is a common feature on modern network cards.
VIRTIO_NET_F_HOST_TSO4
Requires VIRTIO_NET_F_CSUM.
由上述描述可知TSO需要Checksum offload的支持。因为在enable TSO时,TCP/IP协议栈并不知道最终的网络数据包是什么样,自然也没办法完成校验和计算。
参考资料: