1. 程式人生 > >TCP傳輸協議中如何解決丟包問題

TCP傳輸協議中如何解決丟包問題

 

TCP在不可靠的網路上實現可靠的傳輸,必然會有丟包。TCP是一個“流”協議,一個詳細的包將會被TCP拆分為好幾個包上傳,也是將會把小的封裝成大的上傳,這就是說TCP粘包和拆包難題。

但是許多人有不同的理解。TCP協議本身確保傳輸的資料不會丟失完整性。如果在傳輸過程中發現數據丟失或資料包丟失,最大的可能性是在傳送或接收程式的過程中出現問題。

 

 

 例如,伺服器向客戶端傳送大量資料,並且傳送頻率非常高,因此傳送連結中很可能會出現錯誤(1、程式處理邏輯錯誤;2、多執行緒同步問題;3、緩衝區溢位等)如果傳送失敗得不到處理,那麼客戶端收到得資料將少於理論資料,這將導致資料丟失與資料包丟失。這種現象,其實本質上來說不是丟包,也不是丟資料,只是因為程式處理有錯誤,導致有些資料沒有成功地被socket傳送出去。

關於send函式的問題:

首先必須明確send函式做了什麼。 他是將資料傳遞給本地TCP層,還是將資料傳遞給應用層,確認接收方TCP層後再返回。在後者的情況下,你說的沒錯,其實不然。 那是由於nagle演算法不能使用了,即該演算法將send函式接收的小資料彙總成大資料包傳送。

即使send函式能進行資料傳送,對方也不一定被接受。 TCP協議只是在傳輸層履行義務,send函式只是應用層起到向TCP層傳遞資料的作用,除此之外與TCP層沒有任何關係。

常見的解決方案包括拆包、新增包頭和傳送組合包。如果伺服器或客戶端斷開連線,一般會使用心跳測試。

心跳測試:每隔一段時間向伺服器傳送資料包。為了節省資源,通常會發送空資料包。如果傳送失敗表明套接字已斷開,此時需要根據特定條件釋放資源並重新連線。

 

 

TCP傳輸可以保證資料交換的可靠性,這意味著一臺主機將資料正確地傳輸到目標計算機,目標計算機的協議棧有一定的限制,如果不及時處理在目標計算機上接收到的資料,堆疊就會溢位。

這種溢位不是由TCP協議本身引起的,而是由系統的IP協議棧的緩衝區溢位引起的!