好幾天沒有更新文章了,感覺對不起小夥伴了,因為實在是太忙了,抱歉。今天咱們來分析下TCP粘包問題,然後提供怎麼去解決問題思路。
什麼是TCP粘包?
指發送方發送的若干包數據到接收方接收時粘成一包,從接收緩衝區看,後一包數據的頭緊接著前一包數據的尾。
什麼情況下需要考慮粘包問題?
- 如果利用tcp每次發送數據,就與對方建立連接,然後雙方發送完一段數據後,就關閉鏈接,是不用考慮粘包問題的。
- 如果發送的數據是無結構的,比如文件的傳輸,對發送方來說只管發送就行了,接受方只管接受就OK了
- UDP是不需要考慮的,因為是數據報的方式傳輸
什麼原因造成粘包呢?
可以簡單的總結兩點:
- 發送端延遲發送
- 接收方不及時接收緩衝區的數據
遇到這種問題有什麼辦法解決呢?
解決方法
- 關閉Nagle算法
如下場景考慮關閉Nagle算法:
(1) 對端不向本端發送數據,並且對延時比較敏感的操作;這種操作沒法捎帶ack;
(2) 如上寫-寫-讀操作;對於此種情況,優先使用其他方式,而不是關閉Nagle算法:
- 採用分隔符的方式隔離數據,我們在封裝要發送的數據包的時候,採用固定的字符作為結尾符,例如\r\n,
這種方式適合於文本傳輸的數據,不能使用在二進制數據傳輸上。二進制數據保證不了數據內容有\r\n.
- 採用在數據前添加數據頭的方式。
缺點:解析會比較麻煩
- TCP採用短連接處理粘包
缺點:
1,效率比較低;
2,速度比較慢;
優點:
1,簡單方便使用;
總結
上面提供的幾種方法也是各有利弊,當然還存在其他的解決方案,也歡迎提出。使用數據頭的方式在一般的場景下是用的最為廣泛。
ps:感謝小夥伴的支持!
閱讀更多 cpp軟件架構獅 的文章