1. 程式人生 > >TCP可靠傳輸的實現原理

TCP可靠傳輸的實現原理

(這一節提到的可靠傳輸協議並不是TCP採用的,在這裡提到只是為了對後面的TCP可靠傳輸的講解起到鋪墊的作用)

       我們知道,TCP傳送的報文段是交給IP層傳送的。但IP層只能提供盡最大努力服務,也就是說,TCP下面的網路所提供的是不可靠的傳輸。因此,TCP必須採用適當的措施才能使兩個運輸層之間的通訊變得可靠。

       理想的傳輸條件有以下兩個特點:

1) 傳輸通道不產生差錯。

2) 不管傳送以多快的速度傳送資料,接收方總是來得及處理收到的資料。

       在這樣理想的傳輸條件下,不需要採取任何措施就能實現可靠傳輸。

       然而實際的網路都不具備以上兩個理想條件。但我們可以使用一些可靠的傳輸協議,當出現差錯讓傳送方重傳出現的差錯的資料,同時在接收方來不及處理收到的資料時,及時告訴傳送方適當降低傳送資料的速度,這樣一來,本來不可靠的傳輸通道就能夠實現可靠傳輸了。下面我們從最簡單的停止等待協議講起(運輸層並不使用這種協議)。

停止等待協議

       全雙工通訊雙方既是傳送方也是接收方。下面我們僅考慮A傳送資料而B接受資料併發送確認。因此A叫做傳送方,而B叫做接收方。這裡是討論可靠傳輸的原理,因此把傳送資料單元都稱為分組,而並不是考慮資料是在哪一個層次上傳送的(運輸層傳送的協議資料單元叫做報文段,網路層傳送的協議資料單元叫做IP資料報。但在一般討論問題時,都可以把他們簡稱為分組。)。“停止等待”就是每傳送完一個分組就停止傳送,等待對方的確認。在收到確認再發送下一個分組。

1. 無差錯情況

      停止等待可用圖(a)來說明。圖(a)是最簡單的無差錯情況。A在傳送分組M1,傳送完後就暫停傳送,等待B的確認。B收到了M1就向A傳送確認。A在收到了對M1的確認後,就再發送下一個分組M2。同樣,在收到B對M2的確認後,再發送M3。

2. 出現差錯

       圖(b)是分組在傳輸過程中出現差錯的情況。B接收到了M1時檢測出了差錯,就丟棄M1,其他什麼也不做(不通知A收到有差錯的分組)。也可能是M1在傳輸過程中丟失了,這時B當然什麼也不知道。在這兩種情況下,B都不會發出任何資訊。可靠傳輸協議是這樣設計的:A只要超過一段時間仍然沒有收到確認,就認為剛才傳送的分組丟失了,因而重傳前面的傳送過的分組。這就叫做超時重傳。要實現超時重傳,就在每傳送完一個分組時設定一個超時計時器。如果在超市計時器到期之前收到了對方的確認,就撤銷自己設定的超時計時器。其實在圖(a)中,A為每一個已傳送的分組都設定了一個超時計時器,為了簡單起見,在圖(a)中都省略了。

       這裡注意三點:

第一、A在傳送完一個分組後,必須暫時保留已傳送的分組的副本(在傳送超時重傳時使用)。只有在收到相應的確認後才能清除暫時保留的分組副本。

第二、 分組和確認分組都必須進行編號。這樣才能明確是哪一個傳送出去的分組收到了確認,而哪一個分組還沒有收到確認。

第三、 超時計時器設定的重傳時間應當比資料在分組時傳輸的平均往返時間更長一些。

3. 確認丟失和確認遲到

       下圖(a1)說明的是另一種情況,B傳送的對M1的確認丟失了。A在設定的超時重傳時間內沒有收到確認,並無法知道是自己傳送的分組出錯、丟失,或者是B傳送的確認丟失了。因此A在超時計時器到期後就要重傳M1。現在注意B的動作。假定B又收到了重傳的分組M1,這時應採取兩個行動。

第一、 丟棄這個重複的分組M1,不向上層交付。

第二、 向A傳送確認。不能認為已經發送過確認就不再發送,因為A之所以重傳M1.就表示A沒有收到對M1的確認。

       上圖(b1)也是可能出現的一種情況。傳輸過程中沒有出現差錯,但B對分組M1的確認遲到了。A會收到重複的確認。對重複的確認的處理很簡單:收下後丟棄,B仍然會收到重複的M1,並且同樣要丟棄重複的M1,並重傳確認分組。

      通常A最終總是可以收到對所有發出的分組的確認。如果A不斷重傳分組但總是收不打確認,就說明通訊線路太差,不能進行通訊。

像上述的這種可靠傳輸協議常稱為自動重傳請求ARQ(Automatic Repeat reQuest)。意思是重傳的請求時自動進行的,接收方不需要請求傳送方重傳某個出錯的分組。

停止等待協議一個顯著的特點是效率太低,通道利用率太低。我們可以使用下面介紹的連續ARQ協議。

連續ARQ協議

       連續ARQ協議規定,傳送方每收到一個確認,就把傳送視窗向前滑動一個分組的位置。下圖表示傳送方收到對第1個分組的確認,於是把傳送視窗向前移動一個分組的位置。如果原來已經發送了前5個分組,那麼現在就可以傳送視窗內的第6個分組了。

      接收方一般都是採用累積確認的方式,也就是說,接收方不必對收到的分組逐個傳送確認,而是在收到幾個分組後,對按序到達的最後一個分組傳送確認,這就表示:到這個分組分組為止的所有分組都已正確收到了。

       累計確認優點:容易實現,即使確認丟失也不必重傳。缺點:不能向傳送方反映出接收方已經正確收到所有的分組的資訊。

      例如,如果傳送方傳送了前5個分組,而中間的第3個分組丟失了。這時接收方只能對前兩個分組發出確認。傳送方無法知道後面三個分組的下落,而只好把後面的三個分組都再重傳一次。這就叫做Go-back-N(回退N),表示需要再退回來重傳已經發送過的N個分組。可見,當通訊線路質量不好時,連續ARQ協議會帶來負面影響。