TCP系列26—重傳—16、重組包


一、介紹

在TCP重傳的時候,並沒有限制TCP只能重傳與初傳完全相同的報文段大小,TCP允許執行重組包(repacketization),發送一個更大的TCP報文段,進而增加性能。TCP在重傳時候允許重組包同時提供了一種判別虛假重傳的方法。在linux中參數/proc/sys/net/ipv4/tcp_retrans_collapse為非0值的時候打開重傳重組包功能,為0的時候關閉重傳重組包功能。

二、wireshark示例

我們來看兩個wireshark示例,這次我們在ubuntu16.04的默認配置下進行測試,除了修改自增的內核參數tcp_discard_on_port=9877以便進行測試外,其他參數保持默認設置。默認設置下的tcp_retrans_collapse為1

1、TLP后RTO,然后重組包

client與server端建立連接后,client發送一次數據,server正常回復ACK

接着server發送兩個數據包No6和No7,當前緩存中沒有待發數據了,設置TLP定時器為(2*RTT)

在TLP定時器超時的時候,重傳No7數據包(即No8數據包),進行loss probe探測,同時設置RTO定時器

接着RTO定時器超時,進行指數回退過程,即No9-No12,在這個指數回退過程中,server應用層寫入8bytes的數據,但是由於擁塞控制,這個數據暫時只能放在server端緩存中而沒能發出去,從這里我們可以看到linux重傳重組包的過程中並不會把之前未發送的數據一起組包發送

接着client回復No13確認包,server端收到這個ACK確認包后重傳結束,並把剛剛積壓在緩存中的數據發出去(No14)

client端回復ACK確認包,整個傳輸過程結束。

2、SACK重傳下的重組包

在重傳重組包的過程中,遇到已經被SACK確認的數據包就會結束重組包過程

如下圖所示No12數據包通過ack number確認了No6數據包,通過SACK信息確認了No9數據包,在隨后的RTO超時過程中,No7和No8兩個數據包一起重傳,No10數據包單獨重傳。


補充信息:

1、linux下重傳重組包代碼點tcp_retrans_try_collapse







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM