2009-11-29 152 views
4

我看到應用程序通過UDP將數據包發送到某個端口上的IP並接收響應。響應去了哪個端口? (順便說一句,怎麼可以在路由器知道響應是針對我的電腦,如果沒有轉發到我的電腦的端口?)通過UDP接收響應

問候,Neo_b

回答

7

什麼端口分配一個反應是由應用程序。 UDP是完全無狀態的,所以在發射一個數據包之後,應用程序可以期待響應的唯一方法就是知道另一端將要發送一個響應。根據UDP應用程序的不同,我期望爲簡單起見,響應將出現在相同的端口上 - 對於像TCP這樣的協議,情況並非如此,它有一個有意識的隨機(和高)源端口。

要回答你的第二個問題,很多路由器,甚至是廉價的家庭路由器,都要做stateful packet inspection(SPI)。這樣的事情有可能發生,但我爲被糾正,如果我關:[設置階段,客戶端,路由器,網絡,服務器]

  1. 客戶端發出的UDP數據包。
  2. 路由器將UDP數據包傳遞給Internet。
  3. 路由器記得客戶端發送一個UDP包到服務器,並在其內存中建立一個映射。
  4. 服務器發送一個UDP數據包,可能在同一個端口上。
  5. 路由器接收數據包,並檢查映射以找到最近與服務器通話的客戶端。
  6. 路由器將數據包傳遞給客戶端。

這是如何實現的是特定於路由器,我想象,但這是我的理解它是如何工作的。

1

創建UDP套接字時,必須將其綁定到端口號。如果你不操作,操作系統將分配一個ephemeral port.

另一方的應用程序必須知道這個端口。當回覆發回時,您的路由器可能不知道如何路由。有兩種方法來解決這一問題

  1. 您可以明確地在特定 端口上配置路由 到您的計算機。
  2. 到 跟蹤由當發送一個特定的 包 自動打開一個路線 您的計算機的UDP連接可以配置你的路由器。基於這個概念,UPNP協議是 。
+0

感謝您的快速解答。我已經編譯了UDP客戶端和服務器的稍微修改版本。當我嘗試在幾乎任何我嘗試過的端口上向本地主機發送消息時,他們在我的PC上工作。儘管當我向局域網中另一臺PC上運行的服務器發送查詢並在偵聽到同一端口上的響應時,我沒有收到響應(而當我使用自己的UnrealScript代碼時,我以某種方式接受迴應)。 – 2009-11-29 09:40:25

2

如果我將消息發送到另一臺機器上的UDP端口,無論選擇了哪個端口,它都會出現在UDP數據報中。我會認爲遠程端會將任何對該數據報的響應發送到該源端口。

我想這同樣適用於即使端口被防火牆或NAT設備改變,遠程端看到來自特定端口的數據報併發迴應答,防火牆/ NAT設備然後將該端口轉換爲原始源端口。

+1

我認爲這是事實,因爲我只是看了一些域名服務器代碼。 DNS請求通常通過UDP傳輸,但需要發回答案。 – user2081279 2017-04-06 08:26:19