tcp下面的ip層是盡最大努力的交付,是不可靠的,所以tcp需要靠自己去完成可靠傳輸。下面,我們先從簡單的停止等待協議來講解可靠傳輸的如何實現的。需要注意可靠傳輸的幾個特點:不丟失、不重復、按序到達。
注意,TCP并不使用停止等待協議來實現可靠傳輸。
停止等待協議
傳輸層的數據傳輸單元稱為段。下面,為了方便,都稱為分組。
停止等待協議的原理非常簡單,發送一個分組后就停止繼續發送,等待收到上一個分組的確認后,再繼續發送后面的分組。
下面通過幾個不同情況來分析:
無差錯情況
無差錯情況非常簡單,如下圖。每發送完一個分組后,就停止發送,等待收到該分組的確認后,再繼續發送后面的分組。
出現差錯
出現差錯分兩種情況,第一種是發送的分組沒有交付成功到目的地址,另一種情況是傳送的數據包有差錯。通過圖例,我們來分析兩種情況
首先來看看B的操作:A發送M1分組,該分組如果是錯誤的,B收到后會丟棄該數分組,然后什么也不做(不會通知A收到了錯誤分組)。如果B沒有收到M1分組,那么它什么也不知道,也不會去做任何動作。
接下來看A是如何做的:A發完分組后,遲遲收不到B對M1分組的確認后,當等待的時間超時了,那么就需要重新發送該M1分組。要實現超時重傳,就需要設置一個超時計時器,當發送的一個分組在超時時間前收到了確認,那么就重置超時計時器,否則的話就需要重傳分組。
有幾點是需要注意的:
-
A在發送完一個分組后,必須還要保存該分組的副本,以便超時重傳。當收到這個分組的確認后,就可以丟棄該分組的副本了。
-
需要給每一個分組做編號,這樣才知道是各個分組的到達情況。
-
超時時間應該設置的比平均傳輸時間稍長一些,以免引起不必要的重傳。
確認丟失和確認遲到
除了分組在傳送過程中會出現差錯,在返回確認的時候,也會出現差錯——確認丟失和確認遲到。
首先看確認丟失情況,A的分組B收到了,并給A發送了確認,但該確認丟失了,A沒有收到。因為A沒有收到M1的確認,那么等待超過超時后,就會向B重傳M1。這個時候B收到了重復的分組M1,需要做兩個操作:
-
將重復的分組M1丟棄
-
向A發送M1的確認。因為既然A重傳了M1,就表示A沒有收到M1的分組。所以B需要繼續發送對M1的確認。
再來看另一種情況,對M1的分組確認遲到了(超過超時時間后才收到)。A在收到重復的確認后,會丟棄,其他什么也不做。
通過上述的超時重傳機制,就可以實現在不可靠的網絡傳輸上實現可靠的傳輸。
信道利用率
上述的停止等待協議簡單,但它有一個非常大的缺點——信道的利用率太低。在等待收到確認的這段時間,信道是完全空閑的,十分浪費。
為了提高信道利用率,可以使用流水線傳輸,流水線傳輸可以連續發送多個分組,這樣就可以大大提高信道利用率了。
采用流水線傳輸的協議有連續arQ協議和窗口滑動協議。而TCP就是采用滑動窗口協議來完成可靠傳輸的。