【问题标题】:Point to Point connection behind NATNAT 后的点对点连接
【发布时间】:2013-11-18 14:56:43
【问题描述】:

我制作了一个简单的网络应用程序,它是通过 LAN 进行通信的服务器客户端。

客户

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         
host = socket.gethostname() 
port = 8080               
s.connect(("117.219.195.10", port))
s.send('q\n');
s.send('boo\n\r');
s.close

服务器

import socket               
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         
host = socket.gethostname()
print host
port = 8080                
s.bind(("", port))       
s.listen(5)                 
while True:
   c, addr = s.accept()     
   print 'Got connection from', addr
   c.send('Thank you for connecting\r\n')
   c.close()

但是当服务器在 NAT 后面时,我需要在路由器中配置 NAT 表,我可以在不配置路由器的情况下进行点对点连接吗?我可以在数据包本身中嵌入 NAT 表的信息(例如要重定向的 ip),以便当数据包从互联网到达路由器时,它知道 LAN 中的哪个 ip 应该得到它。

【问题讨论】:

  • 有一些像UDP打孔这样的技术
  • 好吧,如果你知道的话,那就去使用它。无论如何,这不是关于编程的,所以这里离题了。
  • 可能是也可能不是我不确定这就是我的问题中没有编程标签的原因:)
  • 为什么不在服务器端配置路由器?
  • 对于最终用户应用程序,您不需要做什么,该应用程序应该开箱即用(如Skype),并且在我的应用程序中我不希望数据通过任何服务器

标签: networking tcp udp network-protocols tcp-ip


【解决方案1】:

可以开发利用NAT Traversal 技术(例如STUN)在经过NAT 的设备之间创建隧道的应用程序。查看这些主题以找到适合您的解决方案。

【讨论】:

  • NAT 穿越对于 TCP 来说特别困难。通常对于客户端-服务器,您不需要遍历 NAT,因为服务器会设置端口转发,尽管 OP 确实指定不是这种情况,所以您的回答确实回答了不寻常的问题。
【解决方案2】:

是的,您确实需要配置端口转发,这通常涉及登录到您的路由器并使用它的管理界面。不,您不能将此信息嵌入数据包中。

但是您只需要在您的服务器上执行此操作并且一旦在您的服务器上设置了端口转发,您就不需要为客户端-服务器通信使用 NAT 遍历 ,因为客户端发送的服务器将通过服务器(因为您设置了端口转发)从服务器到客户端的回复将自动由您的客户端 NAT 转发,因为它会知道您已建立 TCP 连接到服务器的终点。 这就是您可以从 NAT 后面连接到该网站的方式!

【讨论】:

  • 您假设他正在创建一个网站,并且服务器足够强大,可以围绕它设置基础设施。无论哪种方式,他都明确要求提供无需配置路由器的解决方案。
  • 不,它可能是任何 TCP 服务器,而不是 Web 服务器。我发现这是一个奇怪的场景,客户端比服务器更持久,有时必须在字里行间阅读,看看他们试图实现什么才能提供最好的帮助。
  • 一个常见的场景是视频游戏:它们的网络实现几乎总是客户端服务器,并且它们几乎总是在 NAT 之后。但是,您的答案并不正确。
  • 我碰巧是游戏网络程序员,我知道,但是如果游戏使用公共服务器,那么端口转发将在服务器上设置,并且不需要打孔,只有当你使用 p2p拓扑,或者“服务器”是游戏玩家之一,OP不是,你需要打卡吗?
猜你喜欢
  • 2014-11-12
  • 2011-07-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 2013-12-09
  • 2020-04-10
相关资源
最近更新 更多