假設(shè)我們討論A向B發(fā)送數(shù)據(jù),A端有發(fā)送窗口,B端有接受窗口
創(chuàng)新互聯(lián)服務(wù)項目包括榕城網(wǎng)站建設(shè)、榕城網(wǎng)站制作、榕城網(wǎng)頁制作以及榕城網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,榕城網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到榕城省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
根據(jù) B 給出的窗口值 A 構(gòu)造出自己的發(fā)送窗口,假如A收到了B的確認(rèn)報文,此時窗口的值為20,確認(rèn)序號的值為31,那么接收端會構(gòu)造出下面的窗口
這里面前后沿可以不動和前移,但是前沿可以后移(不建議)
下面我們討論發(fā)送窗口
(1)發(fā)送窗口表示,里面的數(shù)據(jù)在未收到確認(rèn)數(shù)據(jù)報之前,都可以連續(xù)發(fā)送,但是發(fā)送了的,必須保留,以便于重傳
(2)如果窗口越大,那么可以連續(xù)發(fā)送的卻多,但是前提是接收窗口可以及時接收
(3)發(fā)送窗口后沿的部分表示已經(jīng)確認(rèn)的,所以不會后移,如果前移(收到確認(rèn)),不動(未收到確認(rèn)),前沿可能前移和后移,但是不建議后移,可能收到了確認(rèn)報文,告訴源主機(jī)減小窗口
假設(shè)發(fā)送了11個字節(jié),但是為收到確認(rèn)
P3 – P1 = A 的發(fā)送窗口(又稱為通知窗口)
P2 – P1 = 已發(fā)送但尚未收到確認(rèn)的字節(jié)數(shù)
P3 – P2 = 允許發(fā)送但尚未發(fā)送的字節(jié)數(shù)(又稱為可用窗口)
從上面可以看到保存一個窗口需要3個指針
下面假設(shè)收到了31號字節(jié),并把31-33號字節(jié)交付給主機(jī),刪除,并將窗口向前移動3個序號,同事給A發(fā)送信號,此時確認(rèn)號shi34
A 的發(fā)送窗口內(nèi)的序號都已用完, 但還沒有再收到確認(rèn),必須停止發(fā)送??赡苁蔷W(wǎng)絡(luò)的原因,入過超時,那么需要重傳一次
前面說過緩存的問題,我們討論一下緩存和窗口的問題:
(1)緩沖和序號都是有限的,而且是環(huán)裝的可以重復(fù)利用
上面是發(fā)送緩沖,里面主要有應(yīng)用程序發(fā)給發(fā)送方的數(shù)據(jù)(未發(fā)送)還有tcp已經(jīng)發(fā)出,但是未收到確認(rèn)的數(shù)據(jù)
接收緩存
(1)按照順序到達(dá),但是沒有被應(yīng)用程序接收的,沒有按順序到達(dá),的
注意:
(1)雖然發(fā)送方的窗口是根據(jù)接收方的確認(rèn)數(shù)據(jù)確定的,但是雙方并不總是一樣大,因為網(wǎng)絡(luò)時間延時的問題
(2)對于不按照順序到達(dá)的,tcp沒有強(qiáng)制規(guī)定,但是通常保存在窗口中一會
(3)tcp要求接收方必須有累積確認(rèn)的功能,這樣可以減少網(wǎng)絡(luò)通信,但是推送發(fā)送的時間不同太長,否則會發(fā)生重傳的機(jī)制,通常不超過(0.5s)
超時重傳時間的選擇:
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
選擇確認(rèn)SACK
接收方收到了和前面的字節(jié)流不連續(xù)的兩個字節(jié)塊。 如果這些字節(jié)的序號都在接收窗口之內(nèi),那么接收方就先收下這些數(shù)據(jù),但要把這些信息準(zhǔn)確地告訴發(fā)送方,使發(fā)送方不要再重復(fù)發(fā)送這些已收到的數(shù)據(jù)。
和前后字節(jié)不連續(xù)的每一個字節(jié)塊都有兩個邊界: 左邊界和右邊界。圖中用四個指針標(biāo)記這些邊界。 第一個字節(jié)塊的左邊界 L1 = 1501,但右邊界 R1 = 3001。 左邊界指出字節(jié)塊的第一個字節(jié)的序號,但右邊界減 1 才是 字節(jié)塊中的最后一個序號。 第二個字節(jié)塊的左邊界 L2 = 3501,而右邊界 R2 = 4501。
如果要使用SACK那么這些信息需要存在首部可選部分,最多只能使用4個字節(jié)快 4*4*2=32 +2(1個字節(jié)指明SACK選項,另一個指明這個選項用多少字節(jié))