對於 網絡最大傳輸單元與粘包 沒有引起學習者的重視在這裏我給大家簡單的介紹介紹
一、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協議的問題,其實就是“如何設計應用層協議的問題
更多的關於網絡編程我會在下面的文章中陸續的分享,也可以關注‘奇牛學院’
來一起討論