值得一讀TCP's RFC,特別是第1.5節(操作),它解釋了過程。部分地說,它說:
TCP必須從互聯網通信系統損壞,丟失,重複或亂序發送的數據中恢復。這是通過爲每個傳輸的八位字節分配一個序列號,並要求來自接收TCP的肯定確認(ACK)來實現的。如果在超時間隔內未收到ACK,則重新發送數據。在接收器中,序列號用於正確排序可能無序接收的段並消除重複。通過向每個傳輸的段添加校驗和,在接收器處檢查它並丟棄損壞的段來處理損壞。
我看不出這是迄今爲止最明確的,但自從確認(如第2.6節)描述瞭如何將數據包的下一個希望的分組,接收TCP實現永遠只承認連續序列開始。也就是說,如果您從未收到第一個數據包,即使您收到了該消息中的所有其他數據包,也不會發送確認消息;如果你已經收到1,2,3,5和6,你只承認1-3。
爲了完整起見,我還請你注意,以2.6節,再次,它描述了上面引述的部分後的詳細信息:
通過TCP的確認並不保證數據已經交付給最終用戶,但只是接收技術合作計劃承擔了這樣做的責任。
因此,TCP確保數據包的順序,除非應用程序沒有收到它們。除了應用程序不可用的情況外,該例外可能不常見,但這確實意味着應用程序不應該認爲成功的發送相當於成功的接收。它由於各種原因而可能是,可能是,但它明確超出協議的範圍。
@PSkocik你的意思是一個TCP數據包可能會被拆分爲幾個沒有順序保證的IP數據報,並且它會被正確地重組到原始TCP數據包中? –
不一定。它也適用於整個細分市場。 – EJP
NB質量不佳。三次握手並不是「臭名昭着的」,至少不是因爲引用中提出的任何有力的理由。 「TCP會話兩端的客戶端」是矛盾的。沒有什麼能夠真正回答你的問題。 – EJP