2011-02-02 14 views
1

在最近一系列的問題中,我一般都會問到UDP,boost :: asio和C++。UDP服務器到客戶端通信 - UDP是無狀態的,如何繞過路由器?

我最近的問題,這似乎並沒有在#1這裏有一個答案,是這樣的:

在客戶端/服務器應用程序,這是相當好的,要求服務器在防火牆中打開一個端口,所以消息被允許進入。但是,爲客戶端做同樣的事情肯定不是一個好的用戶體驗。

由於大多數路由器支持狀態數據包檢測,TCP連接通常可以實現這一點,如果原始請求來自本地主機,則允許響應數據包通過。

我不太清楚這對UDP是如何工作的,因爲UDP是無狀態的,沒有「響應數據包」(據我所知)。我應該如何在我的客戶端應用程序中解釋這一點?

感謝您的任何答案!

+0

其實,我發現我應該搜索serverfault,而不是!似乎NAT自動處理這個。如果這是錯誤的,請糾正我! :) – Max 2011-02-02 19:48:36

回答

7

UDP本身是無狀態的,但防火牆通常不是。關於UDP的約定是,如果請求從client:port_A到​​,則響應將從​​回到client:port_A

防火牆可以利用這一點。如果它看到一個UDP請求從客戶端發出,它會在其狀態表中添加一個條目,使其能夠識別該響應並允許它們進入。由於UDP是無狀態的,並且沒有連接終止的跡象,因此防火牆將會通常會實現超時 - 如果該UDP地址對之間沒有流量發生一段時間,則防火牆狀態表中的關聯將被刪除。

因此 - 爲了在您的客戶端應用程序中充分利用此功能,只需確保您的服務器從與用於接收請求的端口相同的端口發回響應。

+0

沒有SO,我會做什麼 – 2015-12-06 01:53:49