本文将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协议栈并不知道最终的网络数据包是什么样,自然也没办法完成校验和计算。


参考资料:

  1. 常见网络加速技术浅谈(一)
  2. Wireshark 提示和技巧 | Checksum Offload
  3. RFC 9293: Transmission Control Protocol
  4. RFC 768: User Datagram Protocol
  5. RFC 791: INTERNET PROTOCOL
  6. Virtual I/O Device (VIRTIO) Version 1.2