TCP通訊丟包原因總結

2021-07-26 03:39:40 字數 690 閱讀 1157

出處:

今天在公司問老大,公司的專案底層,是使用的tcp,因為可靠,自動斷線重連,在底層都實現了,但是我記得tcp也會有掉包的問題,所以這文章就誕生了——關於tcp掉包的問題,tcp是基於不可靠的網路實現可靠的傳輸,肯定也會存在掉包的情況。

如果通訊中發現缺少資料或者丟包,那麼,最大的可能在於程式傳送的過程或者接收的過程出現問題。

例如伺服器給客戶端發大量資料,send的頻率很高,那麼就有可能在send時發生錯誤(原因可能是又多種,可能是程式處理邏輯問題,多執行緒同步問題,緩衝區溢位問題等等),如果沒有對send失敗做處理重發資料,那麼客戶端收到的資料就會比理論應該收到的少,就會造成丟資料,丟包的現象。

這種現象,其實本質上來說不是丟包,也不是丟資料,只是因為程式處理有錯誤,導致有些資料沒有成功地被socket傳送出去。

常用的解決方法如下:拆包、加包頭、傳送,組合包,如果客戶端、服務端掉線,常採用心跳測試。

tcp是乙個「流」的協議,乙個完整的包可能會被tcp拆分成多個包進行傳送,也可能把小的封裝成乙個大的資料報傳送,這就是所謂的tcp粘包和拆包問題。

假設客戶端分別傳送資料報d1和d2給服務端,由於服務端一次性讀取到的位元組數是不確定的,所以可能存在以下4種情況。

由於底層的tcp無法理解上層的業務邏輯,所以在底層是無法確保資料報不被拆分和重組的,這個問題只能通過上層的應用協議棧設計來解決,根據業界的主流協議的解決方案,歸納如下:

TCP通訊丟包原因總結

今天在公司問老大,公司的專案底層,是使用的tcp,因為可靠,自動斷線重連,在底層都實現了,但是我記得tcp也會有掉包的問題,所以這文章就誕生了 關於tcp掉包的問題,tcp是基於不可靠的網路實現可靠的傳輸,肯定也會存在掉包的情況。如果通訊中發現缺少資料或者丟包,那麼,最大的可能在於程式傳送的過程或者...

通過socket進行TCP通訊丟包原因總結

今天在公司問老大,公司的專案底層,是使用的tcp,因為可靠,自動斷線重連,在底層都實現了,但是我記得tcp也會有掉包的問題,所以這文章就誕生了 關於tcp掉包的問題,tcp是基於不可靠的網路實現可靠的傳輸,肯定也會存在掉包的情況。如果通訊中發現缺少資料或者丟包,那麼,最大的可能在於程式傳送的過程或者...

UDP丟包原因

一 主要丟包原因 1 接收端處理時間過長導致丟包 呼叫recv方法接收端收到資料後,處理資料花了一些時間,處理完後再次呼叫recv方法,在這二次呼叫間隔裡,發過來的包可能丟失。對於這種情況可以修改接收端,將包接收後存入乙個緩衝區,然後迅速返回繼續recv。2 傳送的包巨大丟包 雖然send方法會幫你...