隔三差五看到頭條推送的關於 TCP 粘包拆包的文章,剛開始看到還覺得有點滑稽,看多了就覺得有點無奈。
粘包拆包這個說法是誰最先提出來的,無從考證,從字面上看好像數據一坨一坨的粘在一起,像極了那啥。
但是這個說法是錯誤的,錯誤的,錯誤的,重要事情說三遍。
解釋下原因:
- TCP 是流式協議,不是數據報協議(UDP);
- 流像根水管,一頭是客戶端,另一頭通往服務器,數據在管道中流動,而不是一坨數據包在管道中哐當哐當往下掉。
- 流動的東西是沒有邊界的,就好象水,抽刀斷水水更流;
- 協議棧保證了流動的順序問題,先流入的一定會先流出;
- 在流中傳輸結構化數據(消息或報文)需要自行處理,貌似這個就是他們所說的粘包拆包的問題點,如在數據前加 tag 帶長度、加結束符等等,各種騷操作應有盡有,但這跟 TCP 一毛錢關係都沒有;
- 以上幾點適用於各種數據流,如文件流、轉換流等;
也許某一天會繼續看到這樣的文章:TCP的粘包問題、讀文件的粘包問題、串口通信的粘包問題...
閱讀更多 熙爸愛釣魚 的文章