網路基本功(九) 細說TCP重傳

2021-06-26 05:02:15 字數 2010 閱讀 4309

emc中文支援論壇

tcp的主要任務是很簡單:打包和傳送資料。tcp與其他協議的不同之處在於使用滑動視窗來管理基本資料收發過程,同時確保資料流的有效及可靠傳輸,從而不致傳送速率明顯快於接收速率。本文將描述tcp是如何確保裝置可靠、有效地進行傳輸的。首先闡述tcp檢測丟失片段以及重傳的基本方法,之後介紹tcp如何判斷乙個片段為丟失片段。

tcp片段重傳計時器以及重傳佇列:

檢測丟失片段並對之重傳的方法概念上是很簡單的。每一次傳送乙個片段,就開啟乙個重傳計時器。計時器有乙個初始值並隨時間遞減。如果在片段接收到確認之前計時器超時,就重傳片段。tcp使用了這一基本技術,但實現方式稍有不同。原因在於為了提高效率需要一次處理多個未被確認的片段,以保證每乙個在恰當的時間重傳。tcp按照以下特定順序工作:

放置於重傳佇列中,計時器開始包含資料的片段一經傳送,片段的乙份複製就放在名為重傳佇列的資料結構中,此時啟動重傳計時器。因此,在某些時間點,每乙個片段都會放在佇列裡。佇列按照重傳計時器的剩餘時間來排列,因此tcp軟體可追蹤那幾個計時器在最短時間內超時。

確認處理如果在計時器超時之前收到了確認資訊,則該片段從重傳佇列中移除。

重傳超時如果在計時器超時之前沒有收到確認資訊,則發生重傳超時,片段自動重傳。當然,相比於原片段,對於重傳片段並沒有更多的保障機制。因此,重傳之後該片段還是保留在重傳佇列裡。重傳計時器被重啟,重新開始倒計時。如果重傳之後沒有收到確認,則片段會再次重傳並重複這一過程。在某些情況下重傳也會失敗。我們不想要tcp永遠重傳下去,因此tcp只會重傳一定數量的次數,並判斷出現故障終止連線。

但是我們怎樣知道乙個片段被完全確認呢?重傳是基於片段的,而tcp確認資訊是基於序列號累積的。每次當裝置a傳送片段給裝置b,裝置b檢視該片段的確認號字段。所有低於該字段的序列號都已經被裝置a接收了。因此,當片段中所傳送的所有位元組的序列號都比裝置a到裝置b的最後乙個確認號小的時候,乙個從裝置b發到裝置a的片段被認為是確認了。這是通過計算片段中最後乙個序列號結合片段的資料字段來實現的。

讓我們以下圖為例來說明一下確認和重傳是怎樣工作的。假設連線中的伺服器發出了四個連續片段(號碼從1開始)

片段1序列號字段是1片段長度80。所以片段1中最後乙個序列號是80。

片段2序列號是81片段長度是120。片段2中最後乙個序列號是200。

片段3序列號是201片段長度是160。片段3中最後乙個序列號是360。

片段4序列號是361片段長度是140。片段3中最後乙個序列號是500。

這些片段是乙個接乙個傳送的,而無需等待前乙個傳送得到確認。這是tcp滑動視窗的乙個主要優勢(細說tcp滑動視窗)。

假設客戶端接收到前兩個傳輸,它會發回一條確認訊息確認號為201。從而告知伺服器前兩個片段已經被客戶端成功接收了,它們從重傳佇列中移除(並且伺服器傳送視窗右移200位元組)。在接收到確認號361或更高的片段之前,片段3會保留在重傳佇列中;片段4需要確認號501或更高。

現在,讓我們進一步假設傳輸過程中片段3丟失了,但片段4被接收到了。客戶端將片段4儲存在接收buffer中,但是不需要確認,因為tcp是累積確認機制——確認片段4表示片段3也接收到了,但實際上並沒有。因此,客戶端需要等待片段3。實際上,伺服器端片段3的重傳計時器會超時,伺服器之後重傳片段3。之後客戶端收到,然後傳送片段3和4的確認資訊給伺服器。

還有乙個重要的問題,伺服器將如何處理片段4呢?雖然客戶端在等待片段3,伺服器沒有收到反饋,所以它並不知道片段3丟失了,同樣它也不知道片段4發生了什麼(以及接下來傳輸的資料)。很有可能客戶端已經接收到了片段4但是不能確認,也有可能片段4也丟失了。一些實現中會選擇僅僅重傳片段3,也有些會把3和4都重傳。

最後乙個問題是重傳佇列中所使用片段重傳計時器的值。如果設定過低,會發生過量重傳,如果設定過高,重傳丟失片段會減弱效能。必須通過乙個稱為自適應重傳的過程來動態調整這個值,接下來的章節會講到。

網路基本功(九) 細說TCP重傳

網路基本功 九 細說tcp重傳 emc中文支援論壇 tcp的主要任務是很簡單 打包和傳送資料。tcp與其他協議的不同之處在於使用滑動視窗來管理基本資料收發過程,同時確保資料流的有效及可靠傳輸,從而不致傳送速率明顯快於接收速率。本文將描述tcp是如何確保裝置可靠 有效地進行傳輸的。首先闡述tcp檢測丟...

網路基本功(九) 細說TCP重傳

tcp的主要任務是很簡單 打包和傳送資料。tcp與其他協議的不同之處在於使用滑動視窗來管理基本資料收發過程,同時確保資料流的有效及可靠傳輸,從而不致傳送速率明顯快於接收速率。本文將描述tcp是如何確保裝置可靠 有效地進行傳輸的。首先闡述tcp檢測丟失片段以及重傳的基本方法,之後介紹tcp如何判斷乙個...

網路基本功一 細說網路傳輸

常言道 欲練神功,必先練好基本功。之前做了乙個關於ip路由,預設閘道器和掩碼的問答貼,做完這個帖子覺得如果對網路知識點做乙個系統的闡述,應該會很有幫助。本系列文章著重於講解網路管理實際應用中常常涉及的重要知識點,盡量以實用為主。準備寫的幾個章節暫時有 可能會有增減 首先來看乙個例子 示例 網路伺服器...