網絡基本功(十):細說TCP確認機制

網絡基本功(十):細說TCP確認機制算法

 

轉載請在文首保留原文出處:EMC中文支持論壇https://community.emc.com/go/chinese p_w_picpath001.gifapi

 

 

介紹

 

在TCP確認機制中,沒法有效處理非連續TCP片斷。確認號代表全部低於該編號的sequence number已經被髮送該編號的設備接收。若是咱們收到的字節數落在兩個非連續的範圍內,則沒法只經過一個編號來確認。這可能致使潛在嚴重的性能問題,特別是高速或可靠性較差的網絡。服務器


更多信息

 

仍是如下圖爲例,服務器發送了4個片斷並收到1條回覆,確認號爲201。所以,片斷1和片斷2被當成已確認。它們從重傳隊列中移出,同時容許服務器發送窗口向右移動200字節,從而發送數據增長200個字節。微信


然而,再次假設片斷3,從sequence number201開始,在發送過程當中丟失了。因爲客戶端從沒有收到這一片斷,因此它也沒法發送確認號高於201的確認信息,從而致使滑動窗口停滯。服務器能夠繼續發送其餘片斷直到填滿客戶端的接收窗口,可是直到客戶端發送另外一條確認信息,服務器的發送窗口都不會滑動。網絡


另外一個問題是若是片斷3丟失了,客戶端將沒法告知服務器是否收到後續的片斷。在客戶端接收窗口填滿以前,頗有可能客戶端已經接收到片斷4以及以後的片斷。可是客戶端沒法發送值爲501的確認信息以代表接收到片斷4,由於這意味着片斷3也接收到了ide

p_w_picpath002.jpg

這裏咱們看到了TCP單編號,累積確認機制的缺點。咱們能夠想象一個最差的狀況,服務器被告知它有一個10,000字節窗口,20個片斷每一個片斷500字節。第一個片斷丟失了,其餘19個被接收到了。可是因爲第一個片斷從沒有接收到,其餘19個也沒法確認。性能

 

 

未確認片斷處理策略:url

 

咱們怎樣處理丟失片斷以後的片斷呢?本例中,當服務器片斷3重傳超時,它必須決定怎樣處理片斷4,它不知道客戶端是否已經接收到。在上述最差狀況下,第一個片斷丟失後,其他19個可能或可能沒法被客戶端接收到。spa

處理這種狀況有兩種可能的方式:.net


僅重傳超時片斷:這是一種更加保守的方式,僅重傳超時的片斷,但願其餘片斷都可以成功接收。若是該片斷以後的其餘片斷實際上接收到了,這一方式是最佳的,若是沒接收到,就沒法正常執行。後者的狀況每個片斷須要單獨計時並重傳。假設上述最壞狀況下,全部20個500字節片斷都丟失了。咱們須要等片斷1超時並重傳。這一片斷也許會獲得確認,但以後咱們須要等待片斷2超時並重傳。這一過程會重複屢次。


重傳全部片斷:這是一種更激進或者說更悲觀的方式。不管什麼時候一個片斷超時了,不只重傳該片斷,還有全部其餘還沒有確認的片斷。這一方式確保了任什麼時候間都有一個等待確認的停頓時間,在全部未確認片斷丟失的狀況下,會刷新所有未確認片斷,以使對端設備多一次接收機會。在全部20個片斷都丟失的狀況下,相對於第一種方式節省了大量時間。這種方式的問題在於可能這些重傳是沒必要要的。若是第一個片斷丟失而其餘19個實際上接收到了,也得重傳那9500字節數據。


因爲TCP不知道其餘片斷是否接收到,因此它也沒法確認哪一種方法更好,但只能選擇一種方式。上圖示例了保守的方式,而下圖顯示的是激進的方式:

p_w_picpath003.jpg

問題的關鍵在於沒法確認非連續片斷。解決方式是對TCP滑動窗口算法進行擴展,添加容許設備分別確認非連續片斷的功能。這一功能稱爲選擇確認(selective acknowledgment, SACK)。

 

 

選擇確認:

 

經過SACK,鏈接的兩方設備必須同時支持這一功能,經過鏈接時使用的SYN片斷來協商是否容許SACK。這一過程完成以後,任一設備均可以在常規TCP片斷中使用SACK選項。這一選項包含一個關於已接收但未確認片斷數據sequence number範圍的列表,因爲它們是非連續的。

各設備對重傳隊列進行修改,若是該片斷已被選擇確認過,則該片斷中的SACK比特位置爲1。該設備使用圖2中激進方式的改進版本,一個片斷重傳以後,以後全部片斷也會重傳,除非SACK比特位爲1


例如,在4個片斷的狀況下,若是客戶端接收到片斷4而沒有接收到片斷3,當它發回確認號爲201(片斷1和片斷2)的確認信息,其中包含一個SACK選項指明:「已接收到字節361至500,但還沒有確認」。若是片斷4在片斷1和2以後到達,上述信息也能夠經過第二個確認片斷來完成。服務器確認片斷4的字節範圍,併爲片斷4打開SACK位。當片斷3重傳時,服務器看到片斷4的SACK位爲1,就不會對其重傳。以下圖所示。


在片斷3重傳以後,片斷4的SACK位被清除。這是爲了防止客戶端出於某種緣由改變片斷4已接收的想法。客戶端應當發送確認號爲501或更高的確認信息,正式確認片斷3和4接收到。若是這一狀況沒有發生,服務器必須接收到片斷4的另外一條選擇確認信息才能將它的SACK位打開,不然,在片斷3重傳時或計時器超時的狀況下會對其自動重傳。

p_w_picpath004.jpg

  • 0

相關文章
相關標籤/搜索