wireshark抓包发现1506字节包
以太网的MTU最大为1506字节,但是抓包的时候我却发现大量的1506的字节包,这让我百思不得其解
1,TCP的MTU是哪里来的?
TCP的MTU一般使用默认值,当然,程序员也可以自己设定。我们这里讨论的是以太网的MTU值,以太网的MTU值为1500。
2,以太网的MTU为1500,为什么包长度达到了1506?
以太网的最大传输单元是1500,但这个长度是不包含链路层的,这个值是链路层针对网络层的设计,我们可以看看链路层的帧结构
这里我们讨论最常见的以太网帧封装结构,网络上99%以上都是以太网帧封装结构
由以太网帧结构,我们很容易就看出数据链路层针对网络层数据进行了限制,而wireshark的length项是整个帧的长度。
即14+20+20+1452 = 1506
1452这个值我们很容易从抓包的TCP层获取到
由此,我们得出,TCP层三次握手时候的MSS交换的值取决于网络层,受限于数据链路层协议。
在以太网数据帧中,开始的那部分是变长的字段(IP首部和TCP首部,数据部分是固定的,但不影响),把它们移动到尾部(CRC之前),这样把数据复制到内核时,就可以
把数据帧中的DATA部分映射到一个硬件页面,节省内存到内存的复制过程。也就是说CRC之后不必要再将已经在内存的DATA再重复复制一遍来使用。TCP数据报的长度是512字节的
整数倍,正好可以用内核中的页表来处理。
我们注意到一个细节,CRC并未被计数到链路层数据长度
CRC是在数据发送期间进行计算的,是对整个帧的校检,也就是说,当一个帧封流出之后,CRC校检也随即完成,故,CRC是不计入链路层的。我们设想,如果把CRC放在帧头部,或帧中,那就需要对整个帧进行2次
操作方可完成,因为帧校检完成之后,若不附在尾部,必然要进行数据的插入操作。
同时我们也知道,一个以太网数据流,最大可达到1500 + 18 即1518字节。
END!