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

TCP可靠傳輸的實現

sa

假設我們討論A向B發送數據,A端有發送窗口,B端有接受窗口

根據 B 給出的窗口值 A 構造出自己的發送窗口,假如A收到了B的確認報文,此時窗口的值為20,確認序號的值為31,那麽接收端會構造出下面的窗口

技術分享

這裏面前後沿可以不動和前移,但是前沿可以後移(不建議)

下面我們討論發送窗口

(1)發送窗口表示,裏面的數據在未收到確認數據報之前,都可以連續發送,但是發送了的,必須保留,以便於重傳

(2)如果窗口越大,那麽可以連續發送的卻多,但是前提是接收窗口可以及時接收

(3)發送窗口後沿的部分表示已經確認的,所以不會後移,如果前移(收到確認),不動(未收到確認),前沿可能前移和後移,但是不建議後移,可能收到了確認報文,告訴源主機減小窗口

假設發送了11個字節,但是為收到確認

技術分享

P3 – P1 = A 的發送窗口(又稱為通知窗口)

P2 – P1 = 已發送但尚未收到確認的字節數

P3 – P2 = 允許發送但尚未發送的字節數(又稱為可用窗口)

從上面可以看到保存一個窗口需要3個指針

下面假設收到了31號字節,並把31-33號字節交付給主機,刪除,並將窗口向前移動3個序號,同事給A發送信號,此時確認號shi34

技術分享

A 的發送窗口內的序號都已用完, 但還沒有再收到確認,必須停止發送。可能是網絡的原因,入過超時,那麽需要重傳一次

技術分享

前面說過緩存的問題,我們討論一下緩存和窗口的問題:

(1)緩沖和序號都是有限的,而且是環裝的可以重復利用

技術分享

上面是發送緩沖,裏面主要有應用程序發給發送方的數據(未發送)還有tcp已經發出,但是未收到確認的數據

技術分享

接收緩存

(1)按照順序到達,但是沒有被應用程序接收的,沒有按順序到達,的

註意:

(1)雖然發送方的窗口是根據接收方的確認數據確定的,但是雙方並不總是一樣大,因為網絡時間延時的問題

(2)對於不按照順序到達的,tcp沒有強制規定,但是通常保存在窗口中一會

(3)tcp要求接收方必須有累積確認的功能,這樣可以減少網絡通信,但是推送發送的時間不同太長,否則會發生重傳的機制,通常不超過(0.5s)

超時重傳時間的選擇:

TCP每發送一個報文段,就對這個報文段設置一次計時器。只要計時器設置的重傳時間到還沒有收到確認,就要重傳這個報文段。由於數據鏈路層和運輸層的往返實驗概率分布存在很大差異,因此有必要選擇合適的超時重傳時間。

報文段的往返時延是指收到確認報文的時間與每一個報文段發出的時間之差。報文段的平均往返時延RTT是由各個報文段的往返時延樣本加權平均得出來的。計算公式為:

平均往返時延RTT=α×(舊的RTT)+(1-α)×(新的往返時延樣本),1 ≤ α < 1 典型的值為α為7/8.

即使有一個好的RTT,要選擇一個合適的超時重傳時間RTO(Restransmission Time out)仍然不是一個容易的事情。, 顯然RTO要大於RTT。其計算公式為 RTO = β × RTT, β > 1, 推薦是2

選擇確認SACK

接收方收到了和前面的字節流不連續的兩個字節塊。 如果這些字節的序號都在接收窗口之內,那麽接收方就先收下這些數據,但要把這些信息準確地告訴發送方,使發送方不要再重復發送這些已收到的數據。

技術分享

和前後字節不連續的每一個字節塊都有兩個邊界: 左邊界和右邊界。圖中用四個指針標記這些邊界。 第一個字節塊的左邊界 L1 = 1501,但右邊界 R1 = 3001。 左邊界指出字節塊的第一個字節的序號,但右邊界減 1 才是 字節塊中的最後一個序號。 第二個字節塊的左邊界 L2 = 3501,而右邊界 R2 = 4501。

如果要使用SACK那麽這些信息需要存在首部可選部分,最多只能使用4個字節快 4*4*2=32 +2(1個字節指明SACK選項,另一個指明這個選項用多少字節)


TCP可靠傳輸的實現