TCP粘包問題分析和解決方案總結,不要錯過!

好幾天沒有更新文章了,感覺對不起小夥伴了,因為實在是太忙了,抱歉。今天咱們來分析下TCP粘包問題,然後提供怎麼去解決問題思路。

什麼是TCP粘包?

指發送方發送的若干包數據到接收方接收時粘成一包,從接收緩衝區看,後一包數據的頭緊接著前一包數據的尾。

什麼情況下需要考慮粘包問題?

  1. 如果利用tcp每次發送數據,就與對方建立連接,然後雙方發送完一段數據後,就關閉鏈接,是不用考慮粘包問題的。
  2. 如果發送的數據是無結構的,比如文件的傳輸,對發送方來說只管發送就行了,接受方只管接受就OK了
  3. UDP是不需要考慮的,因為是數據報的方式傳輸

什麼原因造成粘包呢?

可以簡單的總結兩點:

  1. 發送端延遲發送
  2. 接收方不及時接收緩衝區的數據

遇到這種問題有什麼辦法解決呢?

解決方法

  • 關閉Nagle算法

如下場景考慮關閉Nagle算法:

(1) 對端不向本端發送數據,並且對延時比較敏感的操作;這種操作沒法捎帶ack;

(2) 如上寫-寫-讀操作;對於此種情況,優先使用其他方式,而不是關閉Nagle算法:

  • 採用分隔符的方式隔離數據,我們在封裝要發送的數據包的時候,採用固定的字符作為結尾符,例如\r\n,

這種方式適合於文本傳輸的數據,不能使用在二進制數據傳輸上。二進制數據保證不了數據內容有\r\n.

  • 採用在數據前添加數據頭的方式。

缺點:解析會比較麻煩

  • TCP採用短連接處理粘包

缺點:

1,效率比較低;

2,速度比較慢;

優點:

1,簡單方便使用;

總結

上面提供的幾種方法也是各有利弊,當然還存在其他的解決方案,也歡迎提出。使用數據頭的方式在一般的場景下是用的最為廣泛。

ps:感謝小夥伴的支持!


分享到:


相關文章: