网卡的SG和TSO

TSO

网卡中的TSO(TCP Segmentation Offload)技术是一种利用网卡的硬件能力来减轻CPU负担的技术。它的主要作用是处理TCP数据包的分段工作,这项工作通常由CPU完成。当启用TSO时,网卡会接管这一任务,从而提高网络性能并减少CPU的负载。
具体来说,TSO技术允许网卡将大的TCP数据包分割成多个小的数据包,这些小数据包的尺寸适合于网络传输,而无需CPU介入。在没有TSO的情况下,当TCP数据包超过网卡的最大传输单元(MTU)时,操作系统需要将这些数据包分割成更小的单元,这个过程会增加CPU的负担。通过使用TSO,这部分工作被转移到了网卡上,从而释放了CPU资源,让它可以处理其他任务。
TSO技术需要网卡硬件及驱动的支持。在使用TSO时,TCP层会逐渐增大最大段大小(MSS),当TCP层向下发送大块数据时,它仅计算TCP头,而网卡接收到来自IP层的大数据包后,会自行将其分成多个IP数据包,并添加IP头,复制TCP头,并重新计算校验和等相关数据。
此外,还有一些与TSO相关的技术,例如GSO(Generic Segmentation Offload),它是一种更为通用的分片技术,可以在不支持TSO的硬件上实现类似的功能。
在Linux系统中,可以使用ethtool命令来查看和配置网卡是否支持TSO。例如,使用ethtool -k eth0可以查看网卡eth0的TSO支持状态,而使用ethtool -K eth0 tso off可以关闭TSO功能。

SG

网卡的SG( Scatter Gather )功能是一种重要的网络技术,它允许网卡在一次 DMA(直接内存访问)操作中处理多个物理上不连续的数据块。这种技术在提高数据传输效率和减少CPU负担方面发挥着关键作用。
具体来说,Scatter Gather DMA 允许网卡在一次传输中处理多个物理上不连续的数据块。与传统的 Block DMA 不同,后者一次只能传输物理上连续的一个块的数据。在 Scatter Gather DMA 中,数据可以分散存储在不连续的内存块中,然后通过网卡进行聚合或分散处理。这种操作方式减少了中断的次数,从而提高了数据传输的效率。
在网络子系统中,Skb_buff(socket buffer)结构在链路层的数据传输中扮演着重要角色。Skb_buff 不仅包含了数据本身,还包含了关于数据包的元信息,如头部信息、数据长度等。在 Skb_buff 的结构中,skb_shared_info 是一个重要的组成部分,它用于 Scatter Gather I/O(分散/聚集 I/O)的实现。Scatter Gather I/O 允许数据从非连续的内存区域直接传递到硬件,减少了数据复制的开销,提高了性能。对于不支持 Scatter Gather I/O 的网卡,数据必须先被线性化才能进行 DMA 操作,而支持 Scatter Gather I/O 的网卡则可以避免这一额外的拷贝步骤。
此外,Scatter Gather 功能也是某些高级网络技术(如 TSO,即 TCP 分段卸载)的必要条件之一。这些技术可以进一步减轻 CPU 的负担,提高网络通信的效率。
总的来说,网卡的 Scatter Gather 功能是现代网络通信中的一项关键技术,它通过优化数据传输过程,提高了系统的整体性能。