私人与公共港口

问题描述:

我与私人和公共udp港口有一段艰难时期。我正在做一个客户端服务器的VoIP程序,并有一些问题。私人与公共港口

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

2)公共端口是否由防火墙指定?因为它是我的本地网络之外可见的端口。

3)当我在本地网络上的两台机器之间进行调试时,我指定将/ recv发送到专用端口,并且通信起作用。如果我要与网络外的客户进行通信,我会使用公共端口,对吗?

4)本地网络上的两台主机是否有任何方式在公共端口上进行通信?因为这就是它的发布模式,所以确保它可以正常工作是一件好事。

5)路由器将发送到公共端口的数据包转发到专用端口上的应用程序列表中?所以发送者(如果在本地网络之外)指定公共端口而不是私有端口。

希望是明确的,只是要求否则!

在此先感谢! Johan

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