2016-03-14 40 views
1

我對整個UDP事物很陌生(因爲每個人都喜歡TCP),並且需要提出一些關於Java實現的問題。DatagramPacket - Java碎片並重新排列它?

我需要有人來告訴我是否:

  1. 在Java發送的DatagramPackets是由於 網絡配置和數據大小自動分段。
  2. 在receive()調用返回結果之前,由於網絡配置和數據大小自動碎片化,DatagramPackets被重新安排爲Java中正確的片段順序。
  3. 如果分段的DatagramPackets不完整,則丟棄或生成異常。 (收到的一些片段,別人丟失)

我擔心Java的下降,它靜靜地,或數據不正確安排......這將意味着我必須實現一個僞TCP之類的話兼得UDP的好處,以及TCP的檢查。

回答

1

由Java發送的DatagramPackets由於網絡配置和數據大小而自動分段。

是的,但Java與它無關。

的DatagramPackets被重新排列爲在由Java中的正確的frag順序被自動分段由於網絡配置和數據大小之後...接收之前()調用返回結果。

是的,但不是由Java,並且只有所有的片段到達。這發生在IP層。

如果不完整的分段DatagramPackets被丟棄或丟棄時生成異常。(一些碎片收到,另一些丟失)

它們被無聲地丟棄。沒有例外。 Java再次與它無關。這一切都發生在IP層。當且僅當所有片段到達時,纔會重組數據報並傳遞給UDP層。 Java沒有任何涉及。

我擔心Java的下降,它靜靜地

的Java什麼也不做。 IP默默地放下它。

或數據沒有被正確地佈置

數據報被接收或者完整和整個或根本沒有。 Java再次與它無關。

這意味着我必須實現一個僞TCP類型的東西,同時具有UDP的好處,以及TCP的檢查。

正確。你做。

2

UDP很大程度上在操作系統中實現,Java在這個問題上很少發表意見。

  • 長度超過576字節的數據包可能被分段;
  • 數據包可能丟失;
  • 數據包可能無序到達。

有沒有辦法讓Java,或者你來判斷這些是否發生。

你可以做的是實現一個協議來檢測這個。例如將序列號,長度和校驗和添加到每個數據包的開頭。

這意味着我必須實現一個僞TCP類型的東西,同時具有UDP的好處,以及TCP的檢查。

現在你開始明白爲什麼「每個人都喜歡TCP」或者大多數人都這麼做。 UDP有其用途,但對於大多數應用程序而言,TCP是最簡單的。