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