网络最大传输单元与粘包

对于 网络最大传输单元与粘包 没有引起学习者的重视在这里我给大家简单的介绍介绍

一、MTU和MSS的含义

1.网络.上层调用send (1024KB),下层会把这1024KB封装成多个TCP包进行发送。单个TCP包每次打包1448字节的数据进行发送。

2.以太网Ethernet最大的数据帧是1518字节。

3.MTU(Maximum Transmission Unit,MTU):以太网帧的帧头14字节和帧尾CRC校验4字节(共占18字节),剩下承载. 上层协议的地方也就是Data域最大就只剩1500字节.这个值我们就把它称之为MTU。

4.MSS(MaximumSegmentSize,最大报文段大小)为1460,由1500-20 (IP头) -20 (TCP头)计算出的。实际场景下,TCP包头中会带有12字节的时间戳。于是单个TCP包实际传输的最大量就缩减为1448字节。1448=1500-20 (IP头)-32 (20字节TCP头和12字节TCP选项时间戳)。

5.MSS就是TCP数据包每次能够传输的最大量,在建立连接的时候通常要协商双方的MSS值。

如图:

是不是觉得豁然开朗(嘿嘿)

接下来我们来聊聊粘包的问题

二、粘包

出现的原因:

 TCP发了两个数据: A数据长度18Byte; B数据长度14Byte。接受端一-下子读了32Byte。(意思就是说接收端把他们当成了一个包了 把排在第二个包的帧头当成数据传给了上层)

解决方法:

:每段数据前加一个2Byte的长度,用来表示这个数据段的长度。A数据: 2Byte (表示A数据长度) + 16Byte (A的实际数据)。接受端先读2Byte得出剩下数据长度18,再读18Byte那么就是A的数据了。这个问题并不是TCP协议的问题,其实就是“如何设计应用层协议的问题

更多的关于网络编程我会在下面的文章中陆续的分享,也可以关注‘奇牛学院’

来一起讨论

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章