|
1.概述 為方便描述可靠傳輸原理,假定數(shù)據(jù)傳輸只在一個方向上進(jìn)行,即A發(fā)送數(shù)據(jù),B給出確認(rèn)
2.以字節(jié)為單位的滑動窗口
TCP的滑動窗口是以字節(jié)為單位的。為了便于說明,字節(jié)編號取得很小。先假定A收到B發(fā)來的確認(rèn)報文字段,其中窗口是20字節(jié),而確認(rèn)號是31字節(jié)。(表明B期望接收到的下一個序號是31,序號30之前的數(shù)據(jù)已經(jīng)收到了)。如圖所示。
![]()
發(fā)送窗口有如下特點:
1)發(fā)送窗口里面的序號表示允許發(fā)送的序號(如31~50)
2)發(fā)送窗口的位置由窗口的前沿和后沿的位置共同確定。發(fā)送窗口的后沿可能不動(沒有收到確認(rèn)),或者前移(收到新的確認(rèn))。發(fā)送窗口的前沿通常是不斷的向前移動,但也可能不動。
![]() 現(xiàn)在假定A發(fā)送了序號為31-41的數(shù)據(jù),如上圖所示,圖種可以看出要描述一個發(fā)送窗口的狀態(tài)需要三個指針P1, P2, P3。
小于P1的是已發(fā)送并收到確認(rèn)的部分,大于P3的是不允許發(fā)送部分。
P3-P1 = A的發(fā)送窗口(又稱為通知窗口)
P2-P1 = 已發(fā)送但尚未收到確認(rèn)的字節(jié)數(shù)
P3-P2 = 允許發(fā)送但尚未收到的字節(jié)數(shù)(又稱為可用窗口或有效窗口)
![]() 如圖所示,B收到了32和33的數(shù)據(jù)。這些數(shù)據(jù)沒有按序到達(dá),因為序號為31的數(shù)據(jù)沒有收到。由于B只能對按序到達(dá)的數(shù)據(jù)中的最高序號給出確認(rèn),因此B的發(fā)送的確認(rèn)號仍然是31,而不能是32或33?,F(xiàn)在假定B收到序號為31的數(shù)據(jù)并把序號為31-33的數(shù)據(jù)交付給主機(jī),然后B刪除這些數(shù)據(jù)。接著把接收窗口向前移動3個序號,同時給A發(fā)出確認(rèn)。其窗口值仍未20,但確認(rèn)號34,表明B已經(jīng)接收到序號33為止的數(shù)據(jù)。而B收到的37 38 40的數(shù)據(jù)沒有按序到達(dá),先暫存在接收窗口中。
如果按照以上的方式進(jìn)行發(fā)送數(shù)據(jù)。當(dāng)發(fā)送窗口已滿,可用窗口減小到0,因此發(fā)送停止。如果發(fā)送窗口內(nèi)所有數(shù)據(jù)都正確到達(dá)B,而發(fā)出的確認(rèn)由于網(wǎng)絡(luò)問題沒有到達(dá)A,為保證傳輸,此時A只能認(rèn)為B還沒有收到這部分?jǐn)?shù)據(jù)。于是A經(jīng)過一段時間過(由超時計時器控制)重傳這部分?jǐn)?shù)據(jù),直到收到B的確認(rèn)為止。
3.緩存機(jī)制
發(fā)送方的應(yīng)用進(jìn)程把字節(jié)流寫入了TCP的發(fā)送緩存,接收方的應(yīng)用進(jìn)程從TCP的接受緩存中讀取字節(jié)流。下面進(jìn)一步談?wù)摯翱谂c緩存的關(guān)系。注:緩存空間和序號空間都是有限的并且循環(huán)使用的。
![]() 發(fā)送緩存用來暫時存放:1.發(fā)送應(yīng)用程序傳送給發(fā)送方TCP準(zhǔn)備的數(shù)據(jù)2.TCP已發(fā)送但尚未收到確認(rèn)的數(shù)據(jù)。
發(fā)送窗口通常只是發(fā)送緩存的一部分。已被確認(rèn)的數(shù)據(jù)應(yīng)當(dāng)從發(fā)送緩存中刪除,因此發(fā)送緩存與發(fā)送窗口的后沿是重合的。發(fā)送應(yīng)用程序必須控制寫入緩存的速率,不能太快,否則發(fā)送緩存就會沒有存放數(shù)據(jù)的空間。
![]() 接收緩存用來暫時存放:1.按序到達(dá)的,但尚未被接收應(yīng)用程序讀取的數(shù)據(jù)。2,未按序到達(dá)的數(shù)據(jù)。
如果收到的分組檢測出有差錯,則要丟棄。如果接收應(yīng)用程序來不及讀取收到的數(shù)據(jù),接收緩存最終就會被填滿。使接收窗口減小到0.反之,接收應(yīng)用程序能夠及時從接收緩存中讀取收到數(shù)據(jù),接收窗口就會變大,但最大也不能超過接收緩存的大小。
4.超時重傳的時間選擇
TCP每發(fā)送一個報文段,就對這個報文段設(shè)置一次計時器。只要計時器設(shè)置的重傳時間到還沒有收到確認(rèn),就要重傳這個報文段。由于數(shù)據(jù)鏈路層和運輸層的往返實驗概率分布存在很大差異,因此有必要選擇合適的超時重傳時間。
報文段的往返時延是指收到確認(rèn)報文的時間與每一個報文段發(fā)出的時間之差。報文段的平均往返時延RTT是由各個報文段的往返時延樣本加權(quán)平均得出來的。計算公式為:
平均往返時延RTT=α×(舊的RTT)+(1-α)×(新的往返時延樣本),1 ≤ α < 1 典型的值為α為7/8.
即使有一個好的RTT,要選擇一個合適的超時重傳時間RTO(Restransmission Time out)仍然不是一個容易的事情。, 顯然RTO要大于RTT。其計算公式為 RTO = β × RTT, β > 1, 推薦是2
5.選擇確認(rèn)SACK
若收到的報文段無差錯,只是未按序號,中間還缺少一些序號的數(shù)據(jù),采用選擇確認(rèn)的方法來傳送缺少的數(shù)據(jù),而不重傳已經(jīng)正確接收到的數(shù)據(jù)。
用一個例子來說明(Selctive ACK)工作原理。如圖所示,接收放收到了前面的字節(jié)流不連續(xù)的兩個字節(jié)塊。如果這些字節(jié)的序號都在接收窗口內(nèi),那么接收方就先收下這些數(shù)據(jù),但要把這些信息準(zhǔn)確的告訴發(fā)送放,使發(fā)送方不要在重復(fù)發(fā)送這些已經(jīng)收到的數(shù)據(jù)。
![]() TCP首部沒有哪個字段能夠提供上述這些字節(jié)快的邊界信息。如果要使用選擇確認(rèn),那么在建立TCP連接時,就要在TCP首部的選項上加上“允許SACK”的選項。
|
|
|