28 tcp可靠傳輸 滑動視窗

2021-08-19 14:22:32 字數 3016 閱讀 4393

前面我們在學習tcp可靠傳輸時,講了停止等待和連續arq兩種可靠傳輸的協議方式,其中連續arq協議還使用了滑動視窗來保證資料的可靠傳輸和通訊效率,可見滑動視窗是非常重要的。

對於滑動視窗我們可以分成視窗和滑動來進行理解。

所謂視窗就是一段可以被傳送或接收的位元組資料,其連續範圍稱之為「視窗」

滑動則是這個「可以傳送的範圍」(也就是視窗)可以在資料的傳送過程中而變化的,也就是按照一定的速度滑動。

如果你現在還是不太理解也沒關係,下面將會詳細介紹滑動視窗。

圖1-分組編號

在圖1中總共有12個分組,每個分組都是100位元組,紅色數字表示每個分組的序號。比如:第1個分組1 - 100,其中1表示分組的序號,它的分組編號為1。第2個分組的序號是101,編號為2,其他以此類推。這裡我們只需記住每個分組的編號和序號就行了,因為我們在講解滑動視窗中需要用到分組的序號和編號。

滑動視窗是面向位元組流的,為了講述可靠傳輸原理方便,我們假設資料傳輸只在乙個方向上進行,即a傳送資料,b給出確認。這樣我們只討論兩個視窗,即傳送方a的傳送視窗和接收方的接收視窗。

圖2-滑動視窗

1. 在圖2中,a計算機和b計算機在進行資料傳輸前之前先建立tcp連線,a計算機會根據b計算機的接收視窗的大小400位元組,來調整自己的傳送視窗,設定為400位元組。

2. a計算機傳送應用程序將要傳輸的800位元組資料以位元組流寫入傳送緩衝區,說明有8個分組。第1,2,3,4個分組在傳送視窗內(這四個分組是將要傳送的資料)。

圖33. 在圖3中,a計算機將第1,2,3,4四個分組的tcp首部的序號進行填充(第1個分組的tcp首部中的序號為1,第2個分組的tcp首部中的序號為101,其他以此類推),並按順序傳送給b計算機,這時a計算機的傳送視窗中的這4個分組在沒有收到b的確認,就不能從傳送視窗中刪除,因為分組丟失或出差錯還需要重傳。

4. b計算機將收到的四個分組放入快取中的接收視窗,按每個分組的tcp首部的序號(seq)進行排序組織,同時接收視窗向前移動並騰出空間接收資料,接收應用程序按順序讀取接收視窗外連續的位元組(注意b計算機應用程序從接收緩衝區中讀取資料的位置),讀取完畢再把資料清除掉(第1,2,3,4,分組)。

然後b計算機向a計算機傳送乙個確認,圖中大寫的ack = 1代表tcp首部ack標誌位置為1,表示b計算機已經收到a計算機傳送的分組資料,其中小寫的ack = 401是確認號,該序號有2個作用,一是確認b計算機已經收到401位元組前面的資料了,二是期望a計算機下一次開始傳送資料的位置是第401個位元組。

圖45. a計算機收到b計算機的ack確認包時,得到資料報中tcp首部中的確認號是401,接收視窗為400位元組,這時傳送視窗向前移動,401後面的位元組就進入傳送視窗,即第5,6,7,8四個分組進入傳送視窗,然後從傳送視窗中移出已經確認傳送成功的第1,2,3,4四個分組,就可以從快取中刪除掉了,傳送應用程序可以向騰出的空間存放後面的位元組資料,然後往傳送緩衝區中寫入第9,10分組。

然後a計算機在傳送第5,6,7,8這四個分組的過程中,由於網路問題導致第7個分組出現丟失或出現錯誤。

這時b計算機只能收到第5,6,8三個分組,因為第7個分組已經丟失了,所以b計算機的接收視窗只能向前移200個位元組,接收應用程式就可以從接收快取中讀取第5,6分組的位元組,讀取完畢後將第5,6個分組移出接收視窗,騰出的空間可以被重複利用。

6. 然後b計算機向a計算機傳送乙個確認(注意:這是乙個選擇確認sack),確認號是601,告訴a計算機已經成功接收到600以前的位元組,可以從601個位元組開始傳送了(因為第七個分組沒有接收到)。

注意:tcp在建立連線時,客戶端就和伺服器協商了是否支援選擇確認(sack),如果都支援選擇確認,以後通訊過程中傳送的確認,除了包含確認號601,同時還包含了已經收到的分組(第8個分組)的邊界,這樣傳送方就不再重**送第8個分組了,這裡大家只需記住就行了,關於選擇確認後面會詳細介紹,到時候大家再回過頭來看滑動視窗就會理解了。

圖57. a計算機收到b計算機傳送的確認資料報後,發現這是乙個選擇確認包,然後根據選擇tcp首部中的確認號ack = 601,設定傳送視窗向前移動了200位元組,也就是讓視窗滑動到601的位置(601是第七個分組的起始位元組的位置),讓第9,10個分組就進入傳送視窗了,並按順序傳送這兩個分組後就停止傳送,傳送視窗不再向前滑動(因為要重傳第7個分組,所以不能再向前滑動)並等待確認b計算機是否有收到第9,10分組,當第7個分組超時後,就重傳第7個分組(注意:如果a計算機收到的不是選擇確認,那麼將重傳第7,8分組)。

8. b計算機收到第9,10分組後,接著又收到了重傳的第7分組,接收視窗向前移動,然後接收方應用程序就可以讀取接收視窗外的分組資料,讀取完畢並把第7,8,9,10分組從接受緩衝區中清除掉,然後b計算機傳送確認,將tcp首部中的ack標誌位置1,確認號為1001,相當於告訴a計算機:1001之前的資料已經都接收到了,下一次可以從第1001位元組開始傳送了。

9. 同理,a計算機收到b計算機的確認後,傳送視窗向前移動,因為傳送緩衝區中只有第11,12分組,這時傳送視窗中只有200位元組資料,a計算機將這兩個分組資料傳送出去。

注意:上述只是用畫圖單純的介紹滑動窗**術原理,而實際上滑動視窗是迴圈利用的,滑動視窗的大小也是會隨著網路狀況而動態變化的,這裡為了方便介紹,沒有考慮這些情況(分明就是懶~),所以圖中會有一些出入(這也是我強烈建議大家結合書本一起看的原因),但是大家自己一定要分清楚!!!另外,在tcp流量控制,還會再介紹滑動視窗

TCP可靠傳輸 滑動視窗

tcp是如何保證可靠傳輸的?來看看滑動視窗 1 什麼是滑動視窗?tcp的滑動視窗是以位元組為單位的。現假定a收到了b發來的確認報文段,其中視窗是20位元組,而確認號是31.根據這兩個資料,a構造出了自己的傳送視窗 傳送方a的傳送視窗表示 在沒有收到b的確認的情況下,a可以連續把視窗內的資料都傳送出去...

滑動視窗 TCP可靠傳輸的實現

1 視窗機制 滑動視窗協議的基本原理就是在任意時刻,傳送方都維持了乙個連續的允許傳送的幀的序號,稱為傳送視窗 同時,接收方也維持了乙個連續的允許接收的幀的序號,稱為接收視窗。傳送視窗和接收視窗的序號的上下界不一定要一樣,甚至大小也可以不同。不同的滑動視窗協議視窗大小一般不同。傳送方視窗內的序列號代表...

TCP的可靠傳輸之滑動視窗

tcp中的滑動視窗是以位元組為單位來傳送的。假設現在有兩個視窗a和b,其中a視窗向b視窗傳送資料,b視窗接收到資料並返回乙個確認報文。其中用紅色框框出來的位元組數就是滑動視窗的大小,滑動視窗的大小取決於b視窗快取區的大小。滑動視窗越大,說明效率越高。就像拿杯子去接水一樣,杯子越大,水管的水流量就越粗...