在 TCP 這種字節流協議上作應用層分包
是網絡編程的基本需求。分包指的是在發生一個消息(message)或一幀(frame)數據時,經過必定的處理,讓接收方能從字節流中識別並截取(還原)出一個個消息。所以,「粘包問題」是個僞命題
html
對於短鏈接的 TCP 服務,分包不是一個問題,只要發送方主動關閉鏈接,就表示一個消息發送完畢,接收方 read() 返回0,從而知道消息的結尾編程
爲了提升 TCP 的傳輸效率,TCP 有一套本身的發送機制緩存
最大報文段長度 MSS
。只要緩存中存放的數據達到 MSS 字節時,就組裝成一個 TCP 報文段發送出去推送(push)
操做對於長鏈接的 TCP 服務,分包有四種方法網絡
<root>
...</root>
的配對,或者 JSON 格式中的 { ... } 的配對。解析這種消息格式一般會用到狀態機(state machine)假如消息格式很是簡單,「消息」自己是一個字符串,每條消息有一個4字節的頭部,以網絡序存放字符串的長度。消息直接沒有間隙,字符串也不要求以 '0' 結尾tcp
發送兩條消息「hello」和「smartboy」,打包後的字節流共有21字節code
0x00, 0x00, 0x00, 0x05, 'h', 'e', 'l', 'l', 'o', 0x00, 0x00, 0x00, 0x08, 's', 'm', 'a', 'r', 't', 'b', 'o', 'y'
假設數據最終都所有到達,數據解析邏輯至少能正確處理如下各類數據到達的次序htm
《TCP粘包拆包》 原文連接:https://blog.maplemark.cn/2019/04/tcp粘包拆包.html?utm=sfblog