【问题标题】:When to use TCP hole punching technique and why to use it?何时使用 TCP 打孔技术以及为什么使用它?
【发布时间】:2013-02-08 18:16:41
【问题描述】:

我正在研究TCP打孔技术,并从这篇文章中获得了一些知识:TCP_hole_punching。但我不明白下面的部分:

      Network Drawing
      Peer A ←→ Gateway A ← .. Network .. → Gateway B ←→ Peer B  

      Types of NAT
      The availability of the TCP-hole-punching technique depends 
      on the type ofcomputer port allocation used by the NAT. When 
      two peers, A and B, instantiate TCP   connections by binding 
      to local ports Pa and Pb, respectively, **they need to know 
      the remote  endpoint NAT port in order to make the connection**.

这里有一些问题,有人可以帮忙解释一下吗?任何帮助或建议将不胜感激!

第一季度。假设我们有一个在 NAT1 后面运行的客户端应用程序和一个服务器应用程序 在 NAT2 后面运行。他们将进行消息传递和文件传输通信。 该模式将是服务器侦听并接受连接 从客户端。 他们是否需要使用 TCP 打孔来保持 tcp 连接工作?

第二季度。 TCP打孔技术是否只有在点对点时才需要? 通信并且双方正在相互连接(例如,2x CONNECT()、no LISTEN()、ACCEPT() 等)?

第三季度。在上面的文本中,“他们需要知道远程端点的 NAT 端口才能建立连接”是什么意思? 他们为什么需要知道远程端点的NAT端口?他们不只需要知道对方机器的本地端口吗?

例如,假设这对是 (ClientA, publicIPA, LocalPortA), (ClientB, publicIPB, LocalPortB)。如果 ClientA 想通过 TCP 与 ClientB 通信,它可能会这样做:

         clientBAddr.port = LocalPortB;
         clientBAddr.ip = inet_addr(publicIPB);
         connect(fdA, clientBAddr,...);

为什么需要知道 NATPortA 和 NATPortB 等信息?如果clientA和clientB不关心NATA和NATB有什么问题吗?

【问题讨论】:

  • 对于第三季度,ClientA 需要知道 NATPortB,因为这是它必须到 connect() 的端口。
  • @Celada ,但是对于 ClientA,应用程序会这样做: { serveraddr.port = LocalPortB, serveraddr.ip = inet_addr(publicIPB), connect(serveraddr);那么为什么它需要 NATPortB?
  • 连接到LocalPortB 将不起作用,除非LocalPortB 发生 等于NATPortB。如果它们不相等,那么这个传入的 TCP SYN 数据包将被 B 端 NAT 框丢弃,因为它与该路由器跟踪的任何 TCP 连接都不匹配。
  • 不确定这个问题有什么题外话。它可能在 OP 中没有一些代码,它可能会问 1 个特定问题而不是 3 个,但我相信因为与网络编程有关,它应该被允许保持开放。我认为这不适用于 serverfault 或 superuser.com

标签: linux networking tcp nat hole-punching


【解决方案1】:

由于这篇文章重新打开,直到此刻没有人留下答案,我想根据这篇文章自己回答:Peer-to-Peer Communication Across Network Address Translators

关于第一季度,是的。如果没有像打孔这样的机制,一方用来与另一方同步的数据包将被路由器丢弃。

关于第二季度,不完全是。监听套接字不能直接工作。你需要其他技巧。

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 2018-10-08
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多