TCP

TCP

一、tcp粘包/拆包:
  1、服務端分兩次讀取到兩個獨立的數據包,分別是D1和D2,沒有粘包和拆包。
  2、服務端一次接收到兩個數據包,D1和D2粘合在一起,被稱爲TCP粘包。
  3、服務端分兩次讀取到了兩個數據包,第一次讀取到了完整的D1包和D2包的部分內容,第二次讀取到了D2包的剩餘內容,這被稱爲TCP拆包。
  4、服務端分兩次讀取到了兩個數據包,第一次讀取到了D1包的部分內容D1_1,第二次讀取到了D1包的剩餘內容D1_2和D2包的整包。
  如果此時服務端TCP接收滑窗非常小,而數據包D1和D2比較大,很有可能會發生第5種可能,即服務端分多次才能將D1和D2包接收完全,期間發生多次拆包。
二、MTU與MSS的區別:
  MTU是網絡傳輸最大報文包,MSS是網絡傳輸數據最大值。
  1、MSS加包頭數據就等於MTU 簡單說拿TCP包做例子。 報文傳輸1400字節的數據的話,那麼MSS就是1400,再加上20字節IP包頭,20字節tcp包頭,那麼MTU就是1400+20+20. 當然傳輸的時候其他的協議還要加些包頭在前面,總之MTU就是總的最後發出去的報文大小。MSS就是你需要發出去的數據大小。(MSS <=MTU-40(IPv4)或MTU-60(IPv6))
  2、MSS: Maxitum Segment Size 最大分段大小,MSS最大傳輸大小的縮寫,是TCP協議裏面的一個概念,MSS就是TCP數據包每次能夠傳輸的最大數據分段。
  3、爲了達到最佳的傳輸效能TCP協議在建立連接的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時候往往用MTU值代替(需要減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes)所以往往MSS爲1460。通訊雙方會根據雙方提供的MSS值得最小值確定爲這次連接的最大MSS值。
三、粘包問題的解決策略:
  1、消息定長,例如每個報文的大小爲固定長度200字節,如果不夠,空位補空格;
  2、在包尾增加回車換行符進行分割,例如FTP協議;
  3、將消息分爲消息頭和消息體,消息頭中包含表示消息總長度(或者消息體長度)的字段,通常設計思路爲消息頭的第一個字段試用int32來 表示消息的總長度;
  4、更復雜的應用層協議。

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