一、基礎知識
TCP(Transmission Control Protocol)是一種基於連接的、可靠的、面向位元組流的傳輸層協議。其在傳輸數據時,會將數據分割成若干個段進行傳輸,每個段都會被編號。而當接收端收到這些分段數據時,會將它們按照編號重新組合成原始數據。所以TCP是可靠的協議。
然而,當網絡中存在多條路徑時,TCP數據分別通過不同的路徑進行傳輸並重新組合,這就可能導致數據的亂序。當其中一些數據包到達接收端時,卻處於亂序狀態,就成了TCP Out-of-Order。
二、TCP重傳機制
TCP通過巧妙的重傳機制來保證數據可靠性。當發送端發送數據時,會等待接收端發送確認消息;如果發送端沒有接收到確認消息,則會重傳消息。這個等待確認消息的時間就叫做重傳超時時間,也稱RTO(Retransmission Timeout)。如果重傳次數超過一定數量,就會放棄發送數據。
然而當數據出現亂序時,TCP會等待將數據全部接收完畢之後再進行確認,這樣會導致超時時間的減少,從而增加了重傳的概率。
三、TCP快速重傳
TCP快速重傳是指當TCP檢測到數據包丟失時快速發送重傳請求,從而縮短超時時間。 至於何時判斷數據包丟失,一般情況下是根據數據包的到達順序判斷的。但是,TCP僅僅是通過是否收到ACK包來判斷是否發送重傳請求的,這就導致了TCP在存在亂序情況下不能及時發送重傳請求,從而降低了網絡的傳輸效率。
四、TCP亂序解決方法
1、基於定時器
在TCP通信時,分別再發送端和接收端維護一個定時器。發送端將數據按照序號依次發送,接收端在收到數據後將數據按照編號存儲,並對數據進行排序處理,每收到一個數據都會啟動定時器。當定時器時間到了,如果數據還沒有到達,則讓發送端重傳。如果數據接收到了,則將數據存儲起來供上層應用處理。
此方案可在簡化代碼實現上面得到改善,但還存在一定網絡延遲和數據量大的情況下執行效率下降。
2、基於SACK(Selective Acknowledgement)
SACK允許TCP接收端向發送端發送一個確認報文,其中包含對其中部分數據的確認。發送端只需嘗試發送缺少的部分數據即可。這個方案可以減少冗餘性的數據發送,從而提高傳輸效率。但是並不是所有TCP棧都支持SACK選項。
因此,SACK方案相對更為高效但可移植性較差。
五、總結
TCP Out-of-Order是TCP網絡通信中的一種常見問題。TCP發送數據前,會對數據進行分割,分割成一些有序的數據包序列,儘管TCP是可靠的傳輸協議,但是由於TCP數據往返過程中會遇到多條路徑,會導致數據包序列的混淆。對該問題,我們可以採用定時器或SACK等方法進行解決,這些方法能夠提高網絡的傳輸效率和數據傳輸的可靠性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/240963.html