这是图解系列之网络Offload
关注阅读更多图解
网络应用程序如果要发送很大的数据包,经过内核协议栈的时,大包会被分片成多个不超过MTU长度的包。这个分片比较费CPU资源。Offload技术可以把这些分片和合并的工作进行优化处理,也可以直接Offload到网卡上。
了解MTU
MTU是一个二层的概念,即最大传输单元(Maximum Transmission Unit,MTU),它不包含二层以太网头尾数据。网卡发送数据包的大小都是限制在MTU内的。
以太网头和尾数据包含:2bit的以太网类型+6bit的DMAC+6bit的SMAC+4bit的FCS
Offload涉及到四个概念:TSO、GSO、LRO、GRO。(当然还有UDP的UFO,以及一些checksum的Offload,在这里不讨论。)
TSO
TSO(TCP Segmentation Offload) 是一种利用网卡对大数据包进行分片,从而减小 CPU 负荷的一种技术。其作用通过两个图来对比:
TSO off和GSO off 状态数据包的发送过程:
TSO on状态数据包的发送过程:
一个大的网络包直到进入网卡内部后才由网卡进行了分片。
GSO
GSO(Generic Segmentation Offload)是延缓分片技术。它比 TSO 更通用,原因在于它不需要硬件的支持就可以进行分片。
其过程是:首先查询网卡是否支持TSO 功能,如果硬件支持TSO则使用网卡的硬件分片能力执行分片;如果网卡不支持 TSO 功能,则将分片的执行,延缓到了将数据推送到网卡的前一刻执行。
网卡关闭TSO时,GSO on状态数据包的发送过程:
一个大的网络包直到进入网卡前的最后一步才进行了分片。
TSO和GSO对应数据发送过程,对应数据接收过程的是LRO和GRO。
LRO
LRO(Large Receive Offload)是将网卡接收到的多个数据包合并成一个大的数据包,然后再传递给网络协议栈处理的技术。这样提系统接收数据包的能力,减轻CPU负载。
LRO off和GRO off 状态数据包的接收过程:
LRO on状态数据包的接收过程:
数据一进入网卡立刻进行了合并。
GRO
GRO (Generic Receive Offload)是 LRO 的软件实现,只是GRO 的合并条件更加的严格和灵活。
GRO on状态数据包的接收过程:
以上的网络offload是网络协议栈配合网卡完成的,在现在的很多智能网卡上可以直接offload整个网络协议栈,即把网络协议的处理放到了智能网卡上。
毕竟网络协议的处理本来就不该在内核中。
关于智能网卡offload和dpdk这种旁路协议处理的方式,我后面会再图解。
这是图解系列之网络Offload
关注阅读更多图解