WALL-E / tcp-ip-labs

tcp ip labs
2 stars 1 forks source link

局域网内发现MTU大于1500bytes,这是怎么回事 #6

Open WALL-E opened 7 years ago

WALL-E commented 7 years ago

实验前置条件

WALL-E commented 7 years ago

终端说明

WALL-E commented 7 years ago

实验步骤

  1. 【终端1】
    tcpdump -i any port 1919 -s0 -tttt
  2. 【终端3】
    tcpdump -i any port 1919 -s0 -tttt
  3. 【终端2】
    从网络中接收数据,然后丢弃
    sock -si 0.0.0.0 1919
  4. 【终端4】
    发送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的。

WALL-E commented 7 years ago

以太网帧长度上下限

这两个值是由最初以太网线路的电气性质所决定的,详细参考知乎https://www.zhihu.com/question/21524257