私人与公共港口

时间:2011-01-31 22:45:54

标签: c++ winapi sockets udp winsock

我在私人和公共udp端口遇到困难。我正在做一个客户端 - 服务器VoIP程序,并有一些问题。

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

2)公共端口是由防火墙分配的吗?因为它是我本地网络外可见的端口。

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

4)本地网络上的两台主机是否有办法在公共端口上进行通信?因为这就是它在发布模式下的状态,所以确保它有效会很好。

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

希望这很清楚,只要另外问一下!

提前致谢! 约翰

1 个答案:

答案 0 :(得分: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的公共地址作为目的地。例如,我甚至无法从家用电脑上ping自己的公共地址。

  

5)路由器将转发数据包   送到公共港口去了   应用程序列表私有   港口?所以发件人(如果在...之外)   本地网络)指定公众   端口而不是私人端口。

见我对3)的回答。当然,只要分配了公共端口,它就会转发数据包,因为这是它首先分配的内容。但它可能会检查传入数据包是否来自导致端口打开的数据包发送到的相同地址和端口,因此它是对先前发送的数据包的有效响应,而不仅仅是一些试图破解的随机黑客英寸