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

2021-08-09 22:38:24 字數 690 閱讀 2368

**:

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

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

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

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

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

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

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

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

socket實現TCP通訊

tcp是一種可靠的,面向連線的協議。在socket中,建立tcp連線的過程大致如下 伺服器端 1.初始化套接字 2.建立伺服器socket 3.將本機位址與伺服器socket繫結在一起 4.伺服器開始監聽 5.伺服器確認請求 確認之前時一種阻塞的狀態 accept 函式生成乙個新的socket。6....

Tcp通訊 Socket)初學

第一次接觸socket的時候覺得挺好玩的,在閒暇之餘寫下了這個第乙個socket專案 使用於初學著 不喜勿噴 客戶端 suppresswarnings resource public static void main string args throws exception in.close 根據節...

python 進行socket 通訊

socket是應用層於tcp ip協議族通訊的中間軟體抽象層,它是一組介面。socket組織資料,以求符合指定的協議。server端 伺服器端 import socket sk socket.socket 括號內預設不加引數就是進行tcp連線 sk.bind 127.0.0.1 8898 把位址繫結...