2011-01-31 163 views
0

我與私人和公共udp港口有一段艱難時期。我正在做一個客戶端服務器的VoIP程序,並有一些問題。私人與公共港口

1)私有端口是你在bind()中使用的端口嗎?

2)公共端口是否由防火牆指定?因爲它是我的本地網絡之外可見的端口。

3)當我在本地網絡上的兩臺機器之間進行調試時,我指定將/ recv發送到專用端口,並且通信起作用。如果我要與網絡外的客戶進行通信,我會使用公共端口,對嗎?

4)本地網絡上的兩臺主機是否有任何方式在公共端口上進行通信?因爲這就是它的發佈模式,所以確保它可以正常工作是一件好事。

5)路由器將發送到公共端口的數據包轉發到專用端口上的應用程序列表中?所以發送者(如果在本地網絡之外)指定公共端口而不是私有端口。

希望是明確的,只是要求否則!

在此先感謝! Johan

回答

2

1)私有端口是你在bind()中使用的 對嗎?

權。

2)公共端口是由 防火牆分配的嗎?因爲它是我的本地網絡外部可見的端口 。

嗯,是的,但它不完全是防火牆。這是NAT。當然,NAT可能(並且通常是)在防火牆中實現,但也有防火牆不使用任何NAT。另外需要注意的是,你可能有多層NAT(例如家中有一個,ISP一個),在這種情況下,將最外面的NAT分配的端口稱爲公共端口可能是有意義的。

3)當我在我的本地網絡上的兩個 機之間的調試,我 同時指定發送/接收至該 私有端口和通信工程。 如果我要與我的網絡外部的一個 客戶端通信,我會使用 公共端口,對不對?

這取決於網絡設置。既然你在你的問題中提到「客戶 - 服務器」,我假設客戶端「連接」(發送第一個數據包)到服務器。如果服務器不在任何NAT之後,則其公共IP /端口對將與本地IP相同。但是,如果服務器位於NAT後面,則不能只連接到它,因爲它尚未分配公共端口。只要打開一個端口不會導致NAT分配一個公共端口,您需要實際從該端口發送一些東西。

因此,如果您的服務器位於NAT後面,那麼它必須充當客戶端,並且客戶端必須充當服務器,前提是客戶端不在NAT後面。如果雙方都位於NAT之後,則需要使用第三方非NAT服務器才能執行hole punching。請注意,在使用打孔時,通常都使用私人和公共端點,以防萬一雙方碰巧處於相同的局域網內。

4)有沒有辦法在兩臺主機上 在本地網絡上 公共端口進行通信?因爲這是 它將在發佈模式,它 將很好,以確保它的工作。

這取決於NAT設置。它可以忽略來自LAN內部的所有內容,並將NAT的公共地址作爲目的地。例如,我甚至無法從我的家用PC上ping自己的公共地址。

5)將發送到公口至 應用listneing私人 端口的路由器轉發數據包 ?所以發件人(如果在 本地網絡之外)指定公共端口 而不是私有端口。

查看我的答案3)。當然,只要分配了公共端口,它就會轉發數據包,因爲這是它首先分配的數據包。但它可能會檢查傳入的數據包是否來自相同的地址和端口,以致導致該端口被打開的數據包被髮送到,所以這是對先前發送的數據包的有效響應,而不僅僅是一些隨機黑客試圖破壞英寸

+0

這個想法是使用holepunching,對不起,我應該提到,而不是。客戶端將數據包發送到服務器,然後服務器將端口信息和IP轉發給其他客戶端。服務器不在NAT後面(通過端口轉發)。您提到,雖然收件包的地址必須與我們發送的數據包的地址相同。我明白爲什麼,但不會防止打洞?我的意思是打孔的想法是客戶端向服務器開放公共端口,然後服務器告訴客戶端彼此,因此客戶端可以在這些端口上與每個端口進行通信。 – KaiserJohaan 2011-02-01 13:53:15