我正在處理的一個項目中,當我們從網絡讀取UDP流時,在SMP系統上的某些情況下,我們看到亂序問題。我們可以看到它通過嗅探連接在發送者和接收者之間的集線器從網絡到達。然而,有時它從插座讀取時似乎不按順序到達。在這種情況下是否有UDP數據包的保證,或者應用程序是否實現了重新排序緩衝區?我們沒有在這裏設置CPU親和力,我懷疑這可能會有所幫助,但理想情況下,我希望所有CPU/hw線程處理網絡流量。SMP系統中的linux內核是否可以保證按順序從網絡到達的UDP數據包將按順序從套接字讀取?
6
A
回答
9
UDP並不保證任何順序。這是應用程序的責任。實際上,它甚至不保證數據包不會被重複/丟棄等。我建議您閱讀:http://en.wikipedia.org/wiki/User_Datagram_Protocol
內核做出任何這樣的保證是沒有意義的,特別是如果傳入數據包本身可以因爲內核可以(合理地)期望應用程序將處理它,如果應用程序需要排序的話,那麼內核就會失靈。
0
無法保證UDP數據包在傳輸過程中不會丟失,因此您無法獲得任何訂購保證。例如,當系統接收到數據包#14和數據包#16時,在傳送數據包#16之前無法知道它是否應該等待數據包#15進入,或者如果數據包#15被丟棄並且永遠不會到達系統只會向你提供一堆數據包,這取決於你把它們整理好。
相關問題
- 1. Linux系統調用寫入:內核是否保證數據寫入順序?
- 2. 確保UDP中的數據包順序
- 3. 扭曲的RPC是否保證按順序到達?
- 4. 數據包中的UDP字節順序
- 5. 從plist讀取數組時,是否保證NSArray/NSMutableArray順序?
- 6. TCP是否確保數據包按服務器發送的順序接收到
- 7. 我可以使用CGDataProviderCreateSequential()按順序讀取CGImageRef的數據嗎?
- 8. 是否保證按順序接收後續的AJAX請求?
- 9. 從套接字輸入流讀取以錯誤的順序返回數據
- 10. 在JqGrid中是否可以按字母順序排序組?
- 11. 是否從C#的Regex.Matches返回的數組的順序保證按照文本的順序?
- 12. 從Linux內核發送UDP數據包
- 13. QBuffer是否以系統相關字節順序寫入數據?
- 14. 按光柵順序讀取?
- 15. 讀取數據從UDP套接字
- 16. Session.run(fetches)是否保證按順序執行它的「fetches」參數?
- 17. 按數字順序
- 18. 是否保證在PHP中按照數組順序迭代foreach?
- 19. 排序SQL數據庫按字母順序的鏈接/按鈕
- 20. 按順序發送大型UDP數據包的最佳方法
- 21. 按核心數據按字母順序排序以及特殊字符
- 22. C中的循環是否保證按順序執行?
- 23. 按字母順序排序iPhone TableView從RSS按字母順序排序
- 24. PLINQ是否按順序保留原始順序?
- 25. 使用webdriver從表中按字母順序獲取數據
- 26. UDP視頻流的數據包順序
- 27. 我可以從套接字中讀取一個UDP數據包嗎?
- 28. 是否保證通過LINQ從XDocument中讀取項目的順序?
- 29. 以小端字節順序從套接字讀取無符號整數
- 30. 是否可以讀取接收到的UDP數據包的IP標頭字段?
我明白,理解應該有一個重排序緩衝區,但我所說的是它們是按順序進入的,但看起來內核正在亂序。內核可以接受嗎? – tylernol 2010-06-25 16:56:59
@tylernol:是的,內核能夠以任何順序爲應用程序提供udp數據包是可以接受的。我們爲什麼還要期待呢?協議本身並不能保證它的正確性,並且讓內核確保它按照獲得的順序提供數據包只會使事情複雜化(在內核中)而沒有任何用處。 – 2010-06-25 17:05:22
@tylernol:也許這會幫助你:http://lkml.indiana.edu/hypermail/linux/net/0211.2/0036.html – 2010-06-25 17:12:38