2014-07-02 24 views
3

當接收到TCP數據包時,Socket會給我重組的數據包,以防IP分片,因爲我保證得到一個有序的,無間隙的字節流。當我接收到UDP數據包時,我可能會以不同的順序接收數據包,而不是發送或複製,並且其他數據包可能會丟失,我希望每個UDP/IP數據包都是「原始的」,立即當它到達時。另一方面,由於我沒有得到IP頭,我無法自己重新組裝數據包。換句話說,我必須依靠Socket爲我完成這項工作。但這意味着,對於單獨重組而言,(碎片)數據包必須進行緩衝,排序,放棄和丟棄,如果片段不成立的話。請問Socket將IP分片數據包作爲一個重組的UDP數據包傳遞嗎?

這是如何工作的現實?

+0

通常情況下,對於UDP,您可以爲每個數據包自己添加一種標題,以便識別數據並知道什麼時候丟失了某些數據。您還可以選擇足夠小的分組大小以防止分裂。如果碎片化發生,我不知道如何處理它。 – PMF

回答

3

重組發生在IP層,對您來說是透明的。總之,除非出於性能原因,否則不需要關心它,除非您自己拆分數據包。

+0

換句話說,對於重組來說,IP層已經提供了類似於某些高層TCP特徵的特徵:對數據包進行排序(從而緩衝),以及丟棄未完成分段組時的超時。你有任何我可以驗證你的答案的參考嗎? –

+1

這將是RFC 791,[從第24頁的底部開始](http://tools.ietf.org/html/rfc791#page-24) –

+0

UDP不保證數據包的順序,但會保證數據報將如果他們被收到,就應該是完整的......無論他們在傳輸過程中是否被分割。這樣做的結果是,如果一個數據包被碎片化,並且其中一部分丟失或未在時間窗口內收到,則不會收到任何數據包。因此最好總是保持較小的數據報大小。 – Ananke