再聊t-io網路程式設計架構的基礎知識:半包和粘包

manong發表於2021-10-12

半包

顧名思義,就是收到了半個包,這個時候不足以組成一個應用層的包。就像你要對你喜歡的人說 “我喜歡你”,但是因為喝水嚥著了,第一次只說了“我”字,第二次說了個“喜”字,第三個次了個“歡你”,那麼就發生了半包問題,對方只有等待你說完這 4 個字後才知道你是想說“我喜歡你”!

 

http 協議為例,展示半包場景

粘包

粘包與半包相反,就是把多個想說的話,一口氣說完了,對方反應不過來,得把你的話拆開一條一條地理解

 

http協議為例,展示粘包場景

說明:http協議是一來一回的,所以正常場景是不會有粘包的,但pipeline模式下是允許一方連續發多個請求的,所以會有粘包產生

為何坑人無數

初涉網路程式設計的同學,往往認為每次收到的資料剛好是一個完整的資料包

 

於是當網路不好,或是訊息包過大時,半包的情況就發生了,而程式並沒有考慮到半包的情況,結果就是解碼失敗,導致訊息丟失

 

當通訊的對方把多條業務資料包放在一個 TCP包中發過來時,粘包就產生了,而程式沒有考慮到一次TCP收包會收到多個業務包,從而解析到第一個業務包後把後面的業務包丟棄了

 

百度一下半包粘包,一定會搜到很多記錄,這也證明這倆貨確實坑人無數,所以看完本節內容,你還會繼續犯半包粘包的錯嗎?

 

具體請參考:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70006579/viewspace-2795474/,如需轉載,請註明出處,否則將追究法律責任。

相關文章