網絡最大傳輸單元與粘包

對於 網絡最大傳輸單元與粘包 沒有引起學習者的重視在這裏我給大家簡單的介紹介紹

一、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協議的問題,其實就是“如何設計應用層協議的問題

更多的關於網絡編程我會在下面的文章中陸續的分享,也可以關注‘奇牛學院’

來一起討論

 

 

 

 

 

 

 

 

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