關於 TCP 編程的錯誤理解

隔三差五看到頭條推送的關於 TCP 粘包拆包的文章,剛開始看到還覺得有點滑稽,看多了就覺得有點無奈。


粘包拆包這個說法是誰最先提出來的,無從考證,從字面上看好像數據一坨一坨的粘在一起,像極了那啥。


但是這個說法是錯誤的,錯誤的,錯誤的,重要事情說三遍。

解釋下原因:

  • TCP 是流式協議,不是數據報協議(UDP);
  • 流像根水管,一頭是客戶端,另一頭通往服務器,數據在管道中流動,而不是一坨數據包在管道中哐當哐當往下掉。
  • 流動的東西是沒有邊界的,就好象水,抽刀斷水水更流;
  • 協議棧保證了流動的順序問題,先流入的一定會先流出;
  • 在流中傳輸結構化數據(消息或報文)需要自行處理,貌似這個就是他們所說的粘包拆包的問題點,如在數據前加 tag 帶長度、加結束符等等,各種騷操作應有盡有,但這跟 TCP 一毛錢關係都沒有;
  • 以上幾點適用於各種數據流,如文件流、轉換流等;

也許某一天會繼續看到這樣的文章:TCP的粘包問題、讀文件的粘包問題、串口通信的粘包問題...



分享到:


相關文章: