Open WALL-E opened 7 years ago
tcpdump -i any port 1919 -s0 -tttt
tcpdump -i any port 1919 -s0 -tttt
从网络中接收数据,然后丢弃
sock -si 0.0.0.0 1919
发送12kbytes数据,然后退出
sock -i -n12 -w1024 192.168.1.102 1919
之后观察终端1和终端3的输出
终端1的输出截取
2017-07-10 03:34:18.361863 IP 192.168.1.150.50062 > 192.168.1.102.can-dch: Flags [.], seq 4097:6993, ack 1, win 115, options [nop,nop,TS val 30182584 ecr 30174889], length 2896
终端3的输出截取
2017-07-10 03:34:13.160862 IP 192.168.1.150.50062 > 192.168.1.102.can-dch: Flags [.], seq 4097:5545, ack 1, win 115, options [nop,nop,TS val 30182584 ecr 30174889], length 1448 2017-07-10 03:34:13.160934 IP 192.168.1.150.50062 > 192.168.1.102.can-dch: Flags [.], seq 5545:6993, ack 1, win 115, options [nop,nop,TS val 30182584 ecr 30174889], length 1448
看起来发送端的两个TCP分节, 到达服务端后变成一个TCP分节了,长度是2896,超过MTU的1500大小,为什么呢?
其实,在这里操作系统隐藏了网卡一个特性,一般叫做TSO/GSO,是它把两个TCP分节合并为一个,然后在服务端TCPdump就只抓到了一个包。
查看当前系统的网卡是否有这个功能,并且是否开启
[root@localhost ~]# ethtool -k eth1 | grep offload
tcp-segmentation-offload: on
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
rx-vlan-offload: on [fixed]
tx-vlan-offload: on [fixed]
关闭这个功能
ethtool -K eth1 gro off
ethtool -K eth1 tso off
ethtool -K eth1 gso off
然后重复上面的实验,就会看到,服务端和客户端TCPdump捕获到的TCP分节大小都是1024的。
这两个值是由最初以太网线路的电气性质所决定的,详细参考知乎https://www.zhihu.com/question/21524257
实验前置条件