TCP打孔

Gia*_*ann 17 windows tcp network-protocols winsock2 hole-punching

我正在尝试使用mingw工具链实现使用Windows套接字的TCP打孔.我认为这个过程是正确的,但这个漏洞似乎没有.我用这个作为参考.

  1. AB连接到服务器S.
  2. S发送到A,B的路由器IP +它用来连接S的端口
  3. SB做同样的事情
  4. 一个开始2个主题:
    • 一个线程尝试使用S发送的信息连接到B的路由器
    • 另一个线程正在等待连接到S时用于连接到其路由器的同一端口上的传入连接
  5. B做同样的事情

我认为代码中没有问题,因为:

  • AB确实互相使用ip和port
  • 当他们联系服务器时,他们都在监听他们用来连接路由器的端口
  • 它们都连接到正确的IP和端口但是超时(代码错误10060)

我错过了什么?

编辑:在进程资源管理器的帮助下,我看到其中一个客户端设法建立与对等方的连接.但是同行似乎并没有考虑要建立连接.

这是我用Wireshark捕获的内容.为了示例,服务器S和客户端A在同一PC上.服务器S侦听8060重定向到该PC 的特定端口().B仍然尝试连接正确的IP,因为它看到S发送的A的公共地址是,因此使用S的公共IP .(我已用占位符替换了公共IP)localhost

Wireshark的

编辑2:我认为混淆是由于传入和传出的连接请求数据都在同一端口上传输.这似乎弄乱了连接状态,因为我们不知道哪个套接字将从端口获取数据.如果我引用msdn:

SO_REUSEADDR套接字选项允许套接字被另一个套接字强制绑定到一个端口在使用中.第二个套接字调用setsockopt,其中optname参数设置为SO_REUSEADDR,并且optval参数设置为TRUE在与原始套接字相同的端口上调用bind之前的布尔值.第二个套接字成功绑定后,绑定到该端口的所有套接字的行为都是不确定的.

但TCP Hole Punching技术需要在相同的端口上进行交谈才能打开洞!

Dav*_*rtz 12

一个开始2个线程:
一个线程尝试连接到B的路由器,其中S发送的信息
另一个线程正在等待连接到S时用于连接到其路由器的同一端口上的传入连接

你不能用两个线程来做这个,因为它只是一个操作.每个进行出站连接的TCP连接也在等待传入连接.您只需调用'connect',并且您发送出站SYN以建立连接并等待入站SYN建立连接.

但是,您可能需要关闭与服务器的连接.当您已经从同一端口建立了连接时,您的平台可能不允许您从端口建立TCP连接.因此,就像启动TCP打孔一样,关闭与服务器的连接.将新的TCP套接字绑定到同一端口,然后调用connect.