如果服务器从另一个端口

时间:2017-02-09 14:43:11

标签: sockets networking network-programming udp nat

环境:

客户端 - NAT后面的Windows桌面,运行UDP客户端应用程序。

服务器 - 具有公共IP的Ubuntu服务器运行UDP服务器应用程序,该应用程序需要端口6000上的数据包。

ClientPrivate / Public - 客户的私有/公共IP

ServerPrivate / Public - 服务器的私有/公共IP

案例1:

  1. 客户端在 ClientPrivate:777 上打开UDP套接字,并将数据报发送到 ServerPublic:6000
  2. 服务器从 ClientPublic:777 接收数据报,并从 ClientPublic:777 发送回复> ServerPrivate:6000
  3. 客户收到回复,一切正常
  4. 服务器上的WireShark输出: 475 88.xxx.xxx.90 -> 10.0.0.5 UDP 777 → 6000 476 10.0.0.5 -> 88.xxx.xxx.90 UDP 6000 → 777

    客户端

    WireShark输出 152 192.168.2.85 104.40.xxx.250 UDP 777 → 6000 153 104.40.xxx.250 192.168.2.85 UDP 6000 → 777

    案例2:

    1. 客户端在 ClientPrivate:777 上打开UDP套接字,并将数据报发送到 ServerPublic:6000
    2. 服务器从 ClientPublic:777
    3. 接收数据报
    4. 服务器在 ServerPrivate:46666 上打开一个新套接字,并将数据报发送到 ClientPublic:777
    5. 客户接收数据报
    6. 服务器上的WireShark输出: 475 88.xxx.xxx.90 -> 10.0.0.5 UDP 777 → 6000 476 10.0.0.5 -> 88.xxx.xxx.90 UDP 46666 → 777

      客户端

      WireShark输出 152 192.168.2.85 104.40.xxx.250 UDP 777 → 6000

      问题:

      为什么确实客户在案例1中收到数据报而在案例2中

1 个答案:

答案 0 :(得分:1)

我认为这是由客户端NAT引起的。当您的客户端向服务器发送公共IP时,NAT路由器正在其内部连接表中进行输入(类似于" 192.168.2.85 [777] => 104.40.xxx.250 [6000])。

因此,当响应从104.40.xxx.250 [6000]返回时,NAT将找到匹配的条目并将响应返回给客户端计算机。该条目是它如何知道客户端网络中的哪台机器发送数据包。但是,当响应从104.40.xx.250 [46666]返回时,它不匹配其表中的任何条目,因此它丢弃该数据包。

这是NAT的工作方式。考虑一下你的NAT 后面还有另一台机器与同一台服务器通话,比如," 192.168.2。 86 [777] => 104.40.xxx.250 [6000]&#34 ;.我想你会发现你的NAT路由器实际上将源端口改为777以外的其他东西。否则它如何正确地将响应路由回正确的机器。通常对于NAT,如果来自路由器的传入数据包与其表中的条目( OR 您已配置端口转发规则)不匹配,则数据包将被丢弃。

端口转发允许您打开内部计算机以供外界进行一般访问。但由于缺乏这一点,您真的不希望任何随机IP地址/端口对能够将数据报发送到您的客户端计算机。

相关问题