tcpdump抓包,数据长度超过mtu是怎么回事
TSO 介绍和操作
0. 概述
在定位网络问题的时候,MTU 这个参数经常会让我们特别关注,有时它会影响我们无法 SSH 到我们的远端服务器,有时它会让我们的网络延迟加长,甚至于有时还会让我们的服务器变卡,你以为我这里会来说 MTU,那不好意思,我不想说 MTU,我想说的是和 MTU 有关的 TSO。
如果你不知道什么是 MTU 的话,那么可以想象一下如果你有一辆小货车,核载量是 1 吨吧,然后你有 2 吨的多的货物需要运送,那么很显然,你是不可能一次性将这些货物都运完的(什么?超载?那是不可能的)。所以常见的做法就是一吨一吨地运,这么的一吨就是 MTU,但是,需要再补充一点的是,你的 MTU 不一定就是你的承载量,例如,你只是一个转运的工人,你需要把货物运给另外一个运送的人,但是那个人的货车却只能装载 800 KG,那么你就不能一次性运过去一吨的货物了,不然你剩下 200 KG放在原地吗?这个时候你的 MTU 又变成 800 KG 了,所以 MTU 是可以根据实际情况变化的,但是前提就是减少中间环节的卡顿,也就是不要产生货物堆积。
MTU 就简短得介绍完了,那么什么是 TSO 呢,TSO 的全称是 TCP segmentation Offload,中文叫:TCP段卸载,算了,还是忘记中文翻译吧,记住英文就好了;是的,有 TCP 也有 UDP 的 USO,原理类似,不多赘述。TSO 的作用在于减轻 CPU 的负担,将货物的分割工作交给网卡来完成。
例如,我们要传输一个 20M 的数据,因为 MTU 的存在,我们每次最多传输 1500-20 = 1480 bytes,那么就需要将数据分割成 N 份 1480 bytes,那么如果这个工作让 CPU 来做,有点浪费 CPU 的资源,于是就出现了 TSO,直接将数据交给网卡驱动,让网卡驱动去完成分割工作,从而达到减轻 CPU 工作的目的,就是这么简单。
1. 实操
查看 TSO 是否开启:
root@liqiang.io:~# ethtool --show-offload wlp3s0
Features for wlp3s0:
... ...
tcp-segmentation-offload: off
tx-tcp-segmentation: off [fixed]
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp-mangleid-segmentation: off [fixed]
tx-tcp6-segmentation: off [fixed]
udp-fragmentation-offload: off
generic-segmentation-offload: on
... ...
这里的第一段就可以看出来,我的系统是没有开启 TSO 的。
2. 开启关闭 TSO
2.1 开启 TSO
root@liqiang.io:~# ethtool -K eth0 tso on
root@liqiang.io:~# ethtool -K eth0 gso on
注意,这里没有开启 gso,只开启 tso 是没用的,因为只有开启了 gso 才会检测是否支持 tso。
2.2 关闭 TSO
root@liqiang.io:~# ethtool -K eth0 tso off
root@liqiang.io:~# ethtool -K eth0 gso off
3. 验证 TSO
如果开启了 TSO,使用 tcpdump 分析网络流量看到的数据是不一样的,下面给个对比。
- 开启 TSO:在发送数据侧抓包,数据包长度length值很大,远超1448.
- 关闭 TSO:在发送数据侧抓包,数据包长度length最大值是1448.
4. Ref
5. tcpdump抓包丢包和抓包不完整
tcpdump -i eth0 -B 40960 -w test.pcap
-B:缓存大小。默认情况下缓存小,会有丢包。
不使用-B参数时,有丢包
使用-B参数后,不丢包
原文链接:https://liqiang.io/post/tcp-segmentation-offload-introduction-and-operation-2f0b8949