2010-06-25 44 views
6

我正在處理的一個項目中,當我們從網絡讀取UDP流時,在SMP系統上的某些情況下,我們看到亂序問題。我們可以看到它通過嗅探連接在發送者和接收者之間的集線器從網絡到達。然而,有時它從插座讀取時似乎不按順序到達。在這種情況下是否有UDP數據包的保證,或者應用程序是否實現了重新排序緩衝區?我們沒有在這裏設置CPU親和力,我懷疑這可能會有所幫助,但理想情況下,我希望所有CPU/hw線程處理網絡流量。SMP系統中的linux內核是否可以保證按順序從網絡到達的UDP數據包將按順序從套接字讀取?

回答

9

UDP並不保證任何順序。這是應用程序的責任。實際上,它甚至不保證數據包不會被重複/丟棄等。我建議您閱讀:http://en.wikipedia.org/wiki/User_Datagram_Protocol

內核做出任何這樣的保證是沒有意義的,特別是如果傳入數據包本身可以因爲內核可以(合理地)期望應用程序將處理它,如果應用程序需要排序的話,那麼內核就會失靈。

+0

我明白,理解應該有一個重排序緩衝區,但我所說的是它們是按順序進入的,但看起來內核正在亂序。內核可以接受嗎? – tylernol 2010-06-25 16:56:59

+0

@tylernol:是的,內核能夠以任何順序爲應用程序提供udp數據包是可以接受的。我們爲什麼還要期待呢?協議本身並不能保證它的正確性,並且讓內核確保它按照獲得的順序提供數據包只會使事情複雜化(在內核中)而沒有任何用處。 – 2010-06-25 17:05:22

+1

@tylernol:也許這會幫助你:http://lkml.indiana.edu/hypermail/linux/net/0211.2/0036.html – 2010-06-25 17:12:38

0

無法保證UDP數據包在傳輸過程中不會丟失,因此您無法獲得任何訂購保證。例如,當系統接收到數據包#14和數據包#16時,在傳送數據包#16之前無法知道它是否應該等待數據包#15進入,或者如果數據包#15被丟棄並且永遠不會到達系統只會向你提供一堆數據包,這取決於你把它們整理好。

+0

是的,這是我們用UDP獲得的,它在獲取它時將它交給它,但是如果內核在處理數據包時引入無序排序離開網絡? – tylernol 2010-06-25 17:02:18

+0

@ tylernol-內核是否改變順序是否重要?你的應用程序不知道內核接收數據包的順序,所以這個問題是無關緊要的。您的所有應用都知道,它應該準備重新排列數據包,而不管它們可能無序的原因。 – bta 2010-06-25 17:32:28

+0

非常真實,現在如果我只能說服這個特定界面的作者在應用中做他們應該做的事情。 謝謝! – tylernol 2010-06-25 19:10:52

相關問題