tcp/ip 詳解之超時重傳與擁塞避免

重讀一遍《tcp/ip詳解》,感受比第一遍學的時候領悟又深了一些,作點記錄。算法

1、首先是關於tcp超時重傳的問題,簡單來講,tcp在發送完一份數據包以後會設定一個定時器,當定時器超時以前尚未關於這份報文的ACK到達的話,tcp就會認爲這份報文超時,從而進行重傳。可是如今的一個主要問題就是,超時定時器如何設定,設定值太大的話,丟失的數據包不能被及時發送,過小的話,原本沒有丟失的數據包也被重傳,也會影響網絡性能。如今咱們須要一個算法來肯定RTO(retransmission timeout)。網絡

算法1:RTT = αRTT + (1 - α)Mtcp

           RTO = βRTTide

其中α推薦取值爲0.9,β推薦取值爲2,M爲RTT的測量值,RTT爲往返時延估計值性能

算法2:Err = M - Aip

           A = A + g·Errit

           D = D + h·(|Err| - D)io

           RTO = A + 4·Dclass

其中M爲RTT測量值,A爲估計值定時器

當報文被髮送出去以後,超時定時器啓動,通過一個RTO以後若是沒有相應的ACK到達,則重發報文,而後超時定時器被定爲2RTO,以後若是仍是沒有收到ACK,則超時時延被定爲4RTO,以後是8RTO。。。,可是Karn等人在1987年提出,若是一個報文在超時重傳以後又收到了ACK,此時不能更新RTT和RTO,由於不知道此ACK是第一個報文的仍是第二個報文的。

2、再有就是tcp擁塞避免的問題。

在tcp協議中,有兩個算法幫助實現擁塞避免,一個是慢啓動算法,另外一個是擁塞避免算法。

慢啓動算法:在tcp鏈接開始時,發送方初始化一個大小爲一個最大報文段(MSS)的窗口,稱爲擁塞窗口,在此後的過程當中,發送方每收到一個ACK就將擁塞窗口加1,而後將此窗口和滑動窗口的最小值做爲發送窗口。

擁塞避免算法:跟慢啓動算法相似,此算法也是在收到ACK時更新擁塞窗口的值,所不一樣的是它並非在收到一個ACK後將窗口加1,而是加1/cwnd(擁塞窗口)。具體算法是,cwnd(t+1) = cwnd(t) + mss*mss/cwnd(t)。

下面描述下完整的tcp擁塞避免算法:

對於一個tcp連接,初始化cwnd爲1個最大報文段長度,ssthresh爲65535字節。而後開始執行慢啓動,直到cwnd的值大於ssthresh的值,此後執行擁塞避免。期間若是發生重傳(超時或者收到重複的ACK),則將ssthresh的值更新,ssthresh = max(min(cwnd,awnd)/2,2*mss),基本是將ssthresh的值減半,而後分狀況討論,若是是超時致使的重傳,則將cwnd變爲1,從新開始慢啓動,若是是重複ACK致使的重傳,則將cwnd變爲ssthresh的值,繼續往下走,若是cwnd大於ssthresh執行擁塞避免,若是小於則執行慢啓動。

相關文章
相關標籤/搜索