|
之前介紹的可靠數(shù)據(jù)傳輸原理: 1. 可靠數(shù)據(jù)傳輸基本原理(1)-解決數(shù)據(jù)受損問(wèn)題 2. 可靠數(shù)據(jù)傳輸基本原理(2)-解決數(shù)據(jù)丟失問(wèn)題 3. 可靠數(shù)據(jù)傳輸基本原理(3)-滑動(dòng)窗口 本文主要介紹TCP字節(jié)的可靠傳輸原理,基本原理和之前介紹的差不多,但是TCP本身字節(jié)實(shí)現(xiàn)的時(shí)候有一定的差異和優(yōu)化。 序號(hào)和確認(rèn)號(hào)序號(hào)TCP把數(shù)據(jù)看成一個(gè)無(wú)結(jié)構(gòu)的數(shù)據(jù)流,其序號(hào)(Sequence number)是建立在傳送的字節(jié)流的之上,而不是建立在傳輸?shù)捻樞蛏?。一個(gè)TCP報(bào)文的序號(hào)是該報(bào)文段的首字節(jié)的字節(jié)流編號(hào)。 例子,假設(shè)應(yīng)用層發(fā)送了一個(gè)500 000字節(jié)的文件到傳輸層,傳輸層的MSS(Max segment size)是1000字節(jié),那么TCP將會(huì)為該文件構(gòu)建500個(gè)報(bào)文段(每個(gè)大小為1000字節(jié)),如果初始序列號(hào)(ISN:initial sequence number)0,那么第一個(gè)報(bào)文段的序號(hào)分配為0,第二個(gè)報(bào)文段的序號(hào)分配為1000,第三個(gè)為2000。。。。。。以此類(lèi)推,如下圖所示。
確認(rèn)號(hào)之前討論的基本原理中,確認(rèn)號(hào)是當(dāng)前收到的報(bào)文段的序號(hào)。但是在TCP的實(shí)現(xiàn)中確認(rèn)號(hào)是期望收到的下一個(gè)字節(jié)的序號(hào),加入主機(jī)A給主機(jī)B發(fā)送了編號(hào)為0數(shù)據(jù)長(zhǎng)度為1000的一個(gè)報(bào)文段,主機(jī)B成功接收后傳給主機(jī)A的確認(rèn)號(hào)應(yīng)該是1000。
累計(jì)確認(rèn)對(duì)于接收方來(lái)說(shuō),TCP永遠(yuǎn)只確認(rèn)第一個(gè)丟失的字節(jié)的序號(hào)。對(duì)于發(fā)送方來(lái)說(shuō),如果收到確認(rèn)號(hào)N,則代表接收方收到了N以前的所有字節(jié)。 下圖展示了接收方只確認(rèn)第一個(gè)丟失的序號(hào)1000。
下圖展示了累計(jì)確認(rèn)在發(fā)送方的執(zhí)行情況,由于在seq0超時(shí)前收到了ack2000,說(shuō)明2000之前的數(shù)據(jù)已經(jīng)被全部接收,所有不會(huì)在重新傳遞seq為1的數(shù)據(jù),減少了一次重傳。
快速重傳基于累積確認(rèn)的基礎(chǔ),如果接收方連續(xù)三次(可以配置)接收到重復(fù)的ACK,可以在超時(shí)之前直接重傳這個(gè)分組。
上面的這個(gè)例子另外需要額外主頁(yè),當(dāng)接收方收到發(fā)送方的快速傳遞的seq100后,直接ack了5000,因?yàn)?000之前的字節(jié)接收方已經(jīng)收到了??梢钥吹娇焖僦貍魈岣吡诵?。 SACKSellective Acknowledgement。如果接受的收到多個(gè)不連續(xù)的數(shù)據(jù)分組,接收方的接收緩存中會(huì)出現(xiàn)很多的空洞,通過(guò)sack功能,接收方可以在把這些空洞通知發(fā)送方。這樣發(fā)送方就會(huì)有更多的信息來(lái)判斷那些數(shù)據(jù)需要重傳。 |
|
|
來(lái)自: Coder編程 > 《待分類(lèi)》