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

姚善之


目前我們的計算機網絡體系是一種分層結構,一共七層!下層為上層提供服務!比如連接,傳輸等!而TCP屬於第四層傳輸層!傳輸層的任務就是網絡上提供完整的數據傳送!



TCP是一個面向連接的可能的傳輸層協議!來自上層的數據到達傳輸層後首先雙方發送同步數據包建立連接,再有TCP分組分片!把整個的數據分成符合大小的塊,然後分別傳送,在TCP的頭部有記錄順序的序列號,有控制傳送速度的滑動窗口,校驗和等信息!一個或多個塊到達接收端後,由接收端檢驗數據包的正確性,然後發送相應序列號的確認,沒有被確認的序列號數據塊將被重新傳送來保證數據的完整性!


同時接收端可以根據自己的緩衝區大小,發送改變相應的滑動窗口數據值以避免發送端發送速率過快而是接受端沒有緩衝而丟包!


風來了156


一、回答這個問題之前,要考慮TCP協議為什麼會丟包,在什麼樣的情況下會丟包。

1、TCP協議定義(Transimission Control Protocol)是以一種面向連接的、可靠的、基於字節流的傳輸層通信協議。

2、TCP是基於不可靠的網路實現可靠傳輸,肯定會存在丟包問題。

3、如果在通信過程中,發現缺少數據或者丟包,那邊麼最大的可能性是程序發送過程或者接受過程中出現問題。

例如:我有2臺服務器 ,A和B服務器。

A服務器發送數據給B服務器頻率過高時,B服務器來不及處理,造成數據丟包。(原因可能是程序邏輯問題,多線程同步問題,緩衝區溢出問題)

如果A服務器不對發送頻率進行控制,或者數據進行重發的話,那麼B服務器收到數據就會少。就會造成丟失數據

二、TCP協議丟包後,如何解決丟包的問題

為了滿足TCP協議不丟包。TCP協議有如下規定

1、數據分片:發送端對數據進行分片,接受端要對數據進行重組,由TCP確定分片的大小並控制分片和重組

2、到達確認:接收端接收到分片數據時,根據分片數據序號向發送端發送一個確認

3、超時重發:發送方在發送分片時設置超時定時器,如果在定時器超時之後沒有收到相應的確認,重發分片數據

4、滑動窗口:TCP連接的每一方的接受緩衝空間大小固定,接收端只允許另一端發送接收端緩衝區所能接納的數據,TCP在滑動窗口的基礎上提供流量控制,防止較快主機致使較慢主機的緩衝區溢出

5、失序處理:作為IP數據報來傳輸的TCP分片到達時可能會失序,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層;

6、重複處理:作為IP數據報來傳輸的TCP分片會發生重複,TCP的接收端必須丟棄重複的數據;

7、數據校驗:TCP將保持它首部和數據的檢驗和,這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到分片的檢驗和有差錯,TCP將丟棄這個分片,並不確認收到此報文段導致對端超時並重發




Linux運維技術之路


長話短說

第一,tcp協議本身就有丟包重傳的功能,鏈路有少量丟包,tcp可以自動重傳無需干涉。

第二 ,如果鏈路質量非常不好,tcp重傳三次失敗,tcp自動會發送rst斷開鏈接,tcp會話會中斷,必須再次三次握手建會話。

解決丟包要先調研丟包原因,丟包往往都不是tcp或會話層引發,原因往往是由於鏈路質量不好,網絡出口帶寬擁塞等,所以提高鏈路質量,有效改善擁塞的網絡環境才是治理丟包有效的方法。


欽賜太醫


根據定位問題到解決問題的思路:

1.確認網絡鏈路問題,ping測和traceroute確認鏈路是否健康。如果鏈路有問題,找對應網絡管理員排查網絡。

2.確認系統問題,通過wireshark或者tcpdump在應用系統兩端抓包,定位問題所在,排查是發送或者接受系統網卡、性能問題

3.從tcp應用本身排查,通過在程序上添加調試代碼,核查是否應用邏輯處理問題

4.如果上述步驟無法定位問題,請教附近同事幫忙分析下,避免自己陷入固定思維而忽略了什麼細節,導致問題複雜化了。


運維的榕樹


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

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

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

關於send函數的問題:

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

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

常見的解決方案包括拆包、添加包頭和發送組合包。如果服務器或客戶端斷開連接,一般會使用心跳測試。

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

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

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





拋開想象空間



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


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

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


關於send函數的問題:

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

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


常見的解決方案包括拆包、添加包頭和發送組合包。如果服務器或客戶端斷開連接,一般會使用心跳測試。


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


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


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


青蓮網絡雲服務


回答這個問題之前,要從以下兩個方面去排查:

一、TCP協議為什麼會丟包,在什麼樣的情況下會丟包。

1、TCP協議定義(Transimission Control Protocol)是以一種面向連接的、可靠的、基於字節流的傳輸層通信協議。

2、TCP是基於不可靠的網路實現可靠傳輸,肯定會存在丟包問題。

3、如果在通信過程中,發現缺少數據或者丟包,那邊麼最大的可能性是程序發送過程或者接受過程中出現問題。

舉個栗子:假如我有2臺服務器 ,a和b服務器。

a服務器發送數據給B服務器頻率過高時,b服務器來不及處理,造成數據丟包。(原因可能是程序邏輯問題,多線程同步問題,緩衝區溢出問題)

如果a服務器不對發送頻率進行控制,或者數據進行重發的話,那麼b服務器收到數據就會少。就會造成丟失數據

二、TCP協議丟包後,如何解決丟包的問題

為了滿足TCP協議不丟包。TCP協議有如下規定

1、數據分片:發送端對數據進行分片,接受端要對數據進行重組,由TCP確定分片的大小並控制分片和重組

2、到達確認:接收端接收到分片數據時,根據分片數據序號向發送端發送一個確認

3、超時重發:發送方在發送分片時設置超時定時器,如果在定時器超時之後沒有收到相應的確認,重發分片數據

4、滑動窗口:TCP連接的每一方的接受緩衝空間大小固定,接收端只允許另一端發送接收端緩衝區所能接納的數據,TCP在滑動窗口的基礎上提供流量控制,防止較快主機致使較慢主機的緩衝區溢出

5、失序處理:作為IP數據報來傳輸的TCP分片到達時可能會失序,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層;

6、重複處理:作為IP數據報來傳輸的TCP分片會發生重複,TCP的接收端必須丟棄重複的數據;

7、數據校驗:TCP將保持它首部和數據的檢驗和,這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到分片的檢驗或有差錯,TCP將丟棄這個分片,並不確認收到此報文段導致對端超時並重發

TCP三次握手,四次釋放圖:


IT技術宅


TCP,傳輸協議為了提高效率並不保證完整性,也就是說在網絡不好的情況下隨時會丟包。

因此如果你要防止丟包的話,就應該做好校驗工作,遇到接收有誤的情況,讓發送端重新發送。


分享到:


相關文章: