Linux系统中tcp-segmentation-offload(TSO)的工作机制是怎样的?
TCP分段卸载(TSO)工作原理详解
TCP分段卸载(tcp-segmentation-offload,简称TSO)是网卡硬件卸载特性的一种,核心作用是把原本需要内核TCP协议栈完成的数据包分段工作转移到网卡硬件执行,从而降低CPU负载、提升大流量场景下的网络吞吐量。
核心工作逻辑(解决路由前无法判断网卡支持性的问题)
- 应用层提交TCP发送数据时,内核协议栈不会提前做分段,而是先构造最大可达64KB甚至更大的socket buffer(简称skb),远大于常规1500字节的MTU值,此时只会给skb打上
SKB_GSO_TCPV4/SKB_GSO_TCPV6的通用分段卸载(GSO)标记,不会直接调用硬件TSO能力。 - 路由判决完成、确定最终出站的网络接口后,内核才会检查该网卡的TSO支持位:
- 若网卡已开启TSO支持,内核直接将带GSO标记的超大skb传递给网卡驱动,由硬件自动完成分段、每段TCP校验和计算、IP头+TCP头封装,最终将符合MTU的标准帧发送到链路
- 若网卡不支持TSO,内核会在软件层执行GSO分段,把超大skb拆成符合MTU的小包后再传给网卡发送
- 这种先打GSO标记、路由后再判断是否启用硬件TSO的设计,正好解决了路由判决前无法感知网卡TSO能力的问题。
TSO的性能收益
- 大幅降低内核CPU占用:原本需要CPU处理数十次小包的头封装、校验和计算,现在仅需要处理1次超大包,剩余计算全部由网卡硬件完成
- 提升PCIe总线传输效率:减少了内核和网卡之间的小包交互次数,总线带宽利用率更高
- 10G及以上速率的网卡,开启TSO通常能带来20%以上的吞吐量提升
常用操作命令
查看网卡TSO开启状态:
ethtool -k <网卡名> | grep tcp-segmentation-offload
手动开启网卡TSO:
ethtool -K <网卡名> tso on
手动关闭网卡TSO:
ethtool -K <网卡名> tso off
注意事项
- TSO仅对TCP出站流量生效,入站方向对应的同类特性是LRO(大接收卸载)
- 虚拟化场景下,需要宿主机物理网卡和虚拟机虚拟网卡同时开启TSO,才能真正生效
- 部分老旧网卡的驱动存在TSO兼容性问题,开启后可能出现丢包、校验错误等异常,遇到此类问题可临时关闭TSO排查
内容的提问来源于stack exchange,提问作者Mr Pang
相关产品推荐
相关产品推荐

