2017-06-05 93 views
0

我正在研究與遊戲客戶端通信的遊戲服務器,但不知道客戶端收到它時,數據包服務器發送給客戶端是否保持順序?TCP是否確保數據包按服務器發送的順序接收到

像服務器發送數據包A,B,C 但客戶端收到B,A,C?

我已閱讀偉大的博客http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/ 看來,由服務器發送的每個數據包都有被客戶端相應的ACK,但它並沒有說爲什麼由客戶端接收到的數據包與服務器

+0

@PSkocik你的意思是一個TCP數據包可能會被拆分爲幾個沒有順序保證的IP數據報,並且它會被正確地重組到原始TCP數據包中? –

+0

不一定。它也適用於整個細分市場。 – EJP

+1

NB質量不佳。三次握手並不是「臭名昭着的」,至少不是因爲引用中提出的任何有力的理由。 「TCP會話兩端的客戶端」是矛盾的。沒有什麼能夠真正回答你的問題。 – EJP

回答

1

值得一讀TCP's RFC,特別是第1.5節(操作),它解釋了過程。部分地說,它說:

TCP必須從互聯網通信系統損壞,丟失,重複或亂序發送的數據中恢復。這是通過爲每個傳輸的八位字節分配一個序列號,並要求來自接收TCP的肯定確認(ACK)來實現的。如果在超時間隔內未收到ACK,則重新發送數據。在接收器中,序列號用於正確排序可能無序接收的段並消除重複。通過向每個傳輸的段添加校驗和,在接收器處檢查它並丟棄損壞的段來處理損壞。

我看不出這是迄今爲止最明確的,但自從確認(如第2.6節)描述瞭如何將數據包的下一個希望的分組,接收TCP實現永遠只承認連續序列開始。也就是說,如果您從未收到第一個數據包,即使您收到了該消息中的所有其他數據包,也不會發送確認消息;如果你已經收到1,2,3,5和6,你只承認1-3。

爲了完整起見,我還請你注意,以2.6節,再次,它描述了上面引述的部分後的詳細信息:

通過TCP的確認並不保證數據已經交付給最終用戶,但只是接收技術合作計劃承擔了這樣做的責任。

因此,TCP確保數據包的順序,除非應用程序沒有收到它們。除了應用程序不可用的情況外,該例外可能不常見,但這確實意味着應用程序不應該認爲成功的發送相當於成功的接收。它由於各種原因而可能是,可能是,但它明確超出協議的範圍。

1

TCP相同的序列保證字節流的順序和完整性。您將不會收到序列中的數據。從RFC 793

可靠通信:一個TCP連接上發送的數據的流被可靠地且在 爲了在目的地遞送。

相關問題