13.TCP的超時與重傳

TCP提供可靠的運輸層。它使用的方法之一就是確認從另外一端收到的數據。但數據和確認都有可能會丟失。TCP經過在發送時設置一個定時器來解決這種問題。若是當定時器溢出時尚未收到確認,它就重傳該數據。算法

對於實現而言,關鍵之處就在於超時和重傳的策略,即怎樣決定超時間隔和如何肯定重傳頻率緩存

TCP管理4種不一樣的定時器:網絡

  • 重傳定時器:當但願收到另外一端的確認時使用。
  • 堅持定時器:使窗口信息保持不斷流動,即便另外一端關閉了其接收窗口。
  • 保活定時器:檢測一個空閒鏈接的另外一端什麼時候崩潰或重啓。
  • 2MSL定時器:測量一個鏈接處於TIME_WATI狀態的時間。

指數退避:書中檢查連續重傳之間不一樣的時間差,它們取整後分別是一、三、六、十二、2四、48和多個64秒,其中第一次發送後設置的超時時間設置爲1.5秒。(2的N次方*1.5秒)併發

1.往返時間測量性能

RTT(往返時間):指發送端發送TCP報文段開始到接收到對方的肯定所使用的時間。測試

TCP超時與重傳中最重要的部分就是對一個給定鏈接的往返時間的測試。因爲路由器和網絡流量均會變化,所以咱們認爲這個時間可能常常會發生變化,TCP應該跟蹤這些變化並相應地改變其超時時間。spa

RTO(超時重傳時間):發送端發送TCP報文段後,在RTO時間內沒有收到對方肯定,即重傳該報文段。orm

最先的TCP曾經用了一個很是簡單的公式來估計當前網絡的情況,以下:blog

R<-aR+(1-a)M
RTP=Rb

 

其中a是一個經驗係數爲0.9,稱爲平滑因子,b一般爲2。這個數值是能夠被修改的。這個公式是說用舊的RTT(R)和新的RTT(M)綜合到一塊兒來考慮新的RTT(R)的大小。每次進行新測量時,這個被平滑的RTT將獲得更新。每一個新估計的90%來自前一個估計,而10%則取自新的測試。路由

可是,在RTT變化範圍很大時,使用這個方法沒法跟上這種變化,從而引發沒必要要的重傳。當網絡已經處於飽和狀態時,沒必要要的和重傳會增長網絡的負載,對網絡而言就像在火上澆油。因而就有下面的修正公式:

Err=M-A
A<-A+gErr
D<-D+h(|Err|-D)
RTO=A+4D
  • A 平滑的RTT(均值估計器)
  • D 平滑的方差
  • g 增量
  • h 方差的增益

RTO值基於RTT的均值和方差,這更好的響應了RTT的變化。

 

karn算法(重傳多義性)

假如發送一個分組,當發生超時,RTO指數退避,重傳該分組,而後收到ACK。此時但並不能肯定這個ACK是針對第一個分組仍是重傳分組,這就是重傳多義性問題。

karn算法針對這個問題

(1)對於超時重傳的數據報的確認,不更新RTT。
(2)要注意的是:重傳的狀況下,RTO不用上面的公式計算,而採用一種叫作「指數退避」的方式。RTO指數退避,下一次傳送就使用這個RTO值。
(3)重傳數據確認以後,再次發送的數據若是正常被肯定,恢復
Jacobson 1988公式,更新RTO和RTT。


2.擁塞避免算法

該算法假定因爲分組受到損壞引發的丟失是很是少的,所以分組丟失就意味着源主機和目的主機之間的某處網絡上發生了擁塞。有兩種分組丟失的指示:

  • 發生超時
  • 接收到重複的確認

數據在傳輸的時候不能只使用一個窗口協議,咱們還須要有一個擁塞窗口來控制數據的流量,使得數據不會一會兒都跑到網路中引發「擁塞」。也曾經提到過,擁塞窗口最初使用指數增加的速度來增長自身的窗口,直到發生超時重傳,再進行一次微調。可是沒有提到,如何進行微調,擁塞避免算法和慢啓動門限就是爲此而生。

所謂的慢啓動門限就是說,當擁塞窗口超過這個門限的時候,就使用擁塞避免算法,而在門限之內就採用慢啓動算法。因此這個標準才叫作門限,一般,擁塞窗口記作cwnd,慢啓動門限記作ssthresh。下面咱們來看看擁塞避免和慢啓動是怎麼一塊兒工做的。

擁塞避免算法和慢啓動算法是兩個目的不一樣、獨立的算法。咱們但願下降分組進入網絡的傳輸速率,因而能夠調用慢啓動來做到這一點,擁塞避免算法和慢啓動算法一般一塊兒使用:
每一個鏈接維持兩個變量: 擁塞窗口( cwnd )  慢啓動門限( ssthresh )[下圖中假設爲16]

算法概要:

  1. 對一個給定的鏈接,初始化cwnd爲1個報文段,ssthresh爲65535個字節。
  2. TCP輸出例程的輸出不能超過cwnd和接收方通告窗口的大小。擁塞避免是發送方使用的流量控制,而通告窗口則是接收方進行的流量控制。前者是發送方感覺到的網絡擁塞的估計,然後者則與接收方在該鏈接上的可用緩存大小有關。
  3. 當擁塞發生時(超時或收到重複確認),ssthresh被設置爲當前窗口大小的一半[下圖中的12](cwnd 和接收方通告窗口大小的最小值,但最少爲2個報文段)。此外,若是是超時引發了擁塞,則 cwnd被設置爲1個報文段(這就是慢啓動)。
  4. 當新的數據被對方確認時,就增長cwnd,但增長的方法依賴於咱們是否正在進行慢啓動或擁塞避免。若是cwnd小於或等於ssthresh,則正在進行慢啓動,不然正在進行擁塞避免。 慢啓動一直持續到咱們回到當擁塞發生時所處位置的半時候才中止(由於咱們記錄了在步驟2 中給咱們製造麻煩的窗口大小的一半),而後轉爲執行擁塞避免。


cwnd增長方式
慢啓動初始cwnd爲1,每收到一個肯定就加1,成指數增加。
擁塞避免算法在每一個RTT內增長 1/cwnd 個報文,成線性增加。
慢啓動根據收到的ACK次數增長cwnd,而擁塞避免算法在一個RTT無論收有多少ACK也只增長一次。

 

3.快速重傳和快速恢復算法

若是收到3個重複ACK,可認爲該報文段已經丟失,此時無需等待超時定時器溢出,直接重傳丟失的包,這就叫快速重傳算法。而接下來執行的不是慢啓動而是擁塞避免算法,這就叫快速恢復算法。
(1)當收到第3個重複的ACK時,將ssthresh設置爲當前擁塞窗口cwnd的一半,重傳丟失的報文段,設置cwnd爲ssthresh加上3倍的報文段大小。
(2)每次收到另外一個重複的ACK時,cwnd增長1個報文段大小併發送1個分組(若是新的cwnd容許發送)。
(3)當下一個確認新數據的ACK到達時,設置cwnd爲ssthresh(在第1步中設置的值)。這個ACK應該是在進行重傳後的一個往返時間內對步驟1中重傳的確認。另外,這個ACK也應該是對丟失的分組和收到的第1個重複的ACK之間的全部中間報文段的確認。這一步採用的是擁塞避免,由於當分組丟失時咱們將當前的速率減半。


4.ICMP(Internet Control Message Protocol)Internet控制報文協議)差錯

TCP可以遇到的最多見的ICMP差錯就是源站抑制、主機不可達和網絡不可達。

(1)源站抑制的ICMP將擁塞窗口cwnd置爲1個報文段,併發起慢啓動,慢啓動門限ssthresh不變,窗口將打開直至開放了全部的通路(受窗口大小和往返時間的限制)或者發生了擁塞。

(2)主機不可達或網絡不可達的ICMP將被忽略,由於這兩上差錯都被認爲是短暫現象。

 

5.從新分組

當TCP超時並重傳時,它不必定須要重傳一樣的報文段。相反,TCP容許進行從新分組而發送一個較大的報文段,這將有助於提升性能(固然,這個較大的報文段不可以超過接收方聲明的MSS)

相關文章
相關標籤/搜索