之前介紹的可靠資料傳輸原理:
1. 可靠資料傳輸基本原理(1)-解決資料受損問題
2. 可靠資料傳輸基本原理(2)-解決資料丟失問題
3. 可靠資料傳輸基本原理(3)-滑動視窗
本文主要介紹TCP位元組的可靠傳輸原理,基本原理和之前介紹的差不多,但是TCP本身位元組實作的時候有一定的差異和優化,
序號和確認號
序號
TCP把資料看成一個無結構的資料流,其序號(Sequence number)是建立在傳送的位元組流的之上,而不是建立在傳輸的順序上,一個TCP報文的序號是該報文段的首位元組的位元組流編號,
例子,假設應用層發送了一個500 000位元組的檔案到傳輸層,傳輸層的MSS(Max segment size)是1000位元組,那么TCP將會為該檔案構建500個報文段(每個大小為1000位元組),如果初始序列號(ISN:initial sequence number)0,那么第一個報文段的序號分配為0,第二個報文段的序號分配為1000,第三個為2000,,,,,,以此類推,如下圖所示,

確認號
之前討論的基本原理中,確認號是當前收到的報文段的序號,但是在TCP的實作中確認號是期望收到的下一個位元組的序號,加入主機A給主機B發送了編號為0資料長度為1000的一個報文段,主機B成功接收后傳給主機A的確認號應該是1000,

累計確認
對于接收方來說,TCP永遠只確認第一個丟失的位元組的序號,對于發送方來說,如果收到確認號N,則代表接收方收到了N以前的所有位元組,
下圖展示了接收方只確認第一個丟失的序號1000,

下圖展示了累計確認在發送方的執行情況,由于在seq0超時前收到了ack2000,說明2000之前的資料已經被全部接收,所有不會在重新傳遞seq為1的資料,減少了一次重傳,

快速重傳
基于累積確認的基礎,如果接收方連續三次(可以配置)接收到重復的ACK,可以在超時之前直接重傳這個分組,

上面的這個例子另外需要額外主頁,當接收方收到發送方的快速傳遞的seq100后,直接ack了5000,因為5000之前的位元組接收方已經收到了,可以看到快速重傳提高了效率,
SACK
Sellective Acknowledgement,如果接受的收到多個不連續的資料分組,接收方的接收快取中會出現很多的空洞,通過sack功能,接收方可以在把這些空洞通知發送方,這樣發送方就會有更多的資訊來判斷那些資料需要重傳,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198457.html
標籤:其他
上一篇:golang桶排序
