首页 > 技术文章 > tcp最大包长度的一次学习过程

sap-George 2019-12-09 11:22 原文

 

 

 

 

 

以太网包的长度(mtu)是1500,加上前后字节是1518,wireshark不计算后4个字节,所以是1514。这个长度是物理特性导致的,跟什么都没有关系。

ip包最大长度应该是2的16次方,只不过以太网支持不了,所以以太网上的ip包分包后最大长度是1500了。ip层,tcp层应该会取这个值,来对自己的数据大小进行合理的分割。

如果路由器,交换机不能支持目前的mtu,我估计它会直接丢弃包。

ip层收到的包也可能是分割的,所以它会等待一个ip包完全接收到。

ip层有每一个包的identification,如果一个tcp或者udp包,只接收了其中的几个部分,ip层也会直接丢弃该包。

tcp协议会有自动重发机制,发送端发现接收端一直不返回确认收到的包,会重发。

用wireshark测试,发现tcp包很少有ip分包的现象,我估计是tcp层自己将包改成很小的值了。

tcp有自己的包发送确认机制,所以就不需要ip层等待判断是不是接收全了。ip层接收到一个tcp包之后,逻辑上就可以交给上层了。

wireshark自动将ip包粘包了,不知道如何打开。

 其实这是两个ip包,第一个包有udp层的端口号,第二个包没有。所以单纯只收到第二个包,没有办法进行任何逻辑处理。所以ip层应该会等待第一个包。ip层半包攻击的原理在此。

 

进行测试mss被更改的例子如下。

mss最大为1460,但是wireshark里发现没有到这个长度的,都是1434的

 这是为什么呢?从网上文章得知ip分包的最大值mss会被更改。

https://wenku.baidu.com/view/47561ded551810a6f524865a.html

于是找两台主机测试一下。

 

 上面的一次连接,本方mss1460,对方要求1380。

从对方的监控看一下

 

 对方收到封包的mss值果真被更改了。

看来经过外网的时候果真有个设备更改了mss值。

 

另外纯本地局域网测试了一下,mss值没有被更改。

 

推荐阅读