Javascript 我不能';t使用srvflx候选者在同一LAN中的两个客户端之间建立ice连接

Javascript 我不能';t使用srvflx候选者在同一LAN中的两个客户端之间建立ice连接,javascript,networking,udp,webrtc,nat,Javascript,Networking,Udp,Webrtc,Nat,我试图做的是创建一个测试脚本(javascript)来检查客户机是否可以通过“服务器自反候选者”进行连接 我从test.webrtc.org复制了这个脚本,它基本上创建了两个对等点,并通过数据通道发送一些文本,检查双方是否都收到了文本 我遇到的问题是我的“ice连接状态”将从“检查”更改为“失败”。 我知道我的浏览器(chrome)可以通过“服务器自反候选者”进行连接,我们不使用对称NAT 我知道在正常情况下,当两个客户端都在同一局域网中时,它们几乎总是通过“候选主机”进行连接(有时通过候选中继

我试图做的是创建一个测试脚本(javascript)来检查客户机是否可以通过“服务器自反候选者”进行连接

我从test.webrtc.org复制了这个脚本,它基本上创建了两个对等点,并通过数据通道发送一些文本,检查双方是否都收到了文本

我遇到的问题是我的“ice连接状态”将从“检查”更改为“失败”。

我知道我的浏览器(chrome)可以通过“服务器自反候选者”进行连接,我们不使用对称NAT

我知道在正常情况下,当两个客户端都在同一局域网中时,它们几乎总是通过“候选主机”进行连接(有时通过候选中继进行连接,不知道为什么)

我之所以“强制”它通过“服务器自反候选者”进行连接,唯一的原因是我想创建一个测试脚本,这样我们的用户就可以自我检查他们的浏览器能够实现什么样的连接候选者

连接场景可以描述如下:

客户端A源-本地IP-192.168.1.142-源端口-52245 客户端A目标-远程IP-99.99.99-目标端口-43353

客户端B源-本地IP-192.168.1.110-源端口-43353 客户端B目标-远程IP-99.99.99-目标端口-52245

在路由器中使用“netstat”时,我得到以下信息:

Proto Source Address                      Destination Address              State 
udp   192.168.1.142:52245                 99.99.99.99:43353                UNREPLIED   
udp   192.168.1.110:43353                 99.99.99.99:52245                UNREPLIED  
Gateway address: 192.168.0.1
Host 1: 192.168.0.5
Host 2: 192.168.0.7

The gateway has an external IP : 192.0.2.1
Host 1 runs a P2P application P1 on its port 12345 which is externally mapped to 4444.
Host 2 runs a P2P application P2 on its port 12345 which is externally mapped to 5555.
我不确定这是否与路由器行为有关,并且我在路由器管理控制台中没有看到与上述设置相关的任何设置,因此我已更改为不同的路由器,并且仍然得到所描述的相同结果。是因为不允许进行上述连接吗

[编辑-包括路由表]

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
99.99.99.254    *               255.255.255.255 UH    0      0        0 WAN
99.99.99.0      *               255.255.255.0   U     0      0        0 WAN
192.168.1.0     *               255.255.255.0   U     0      0        0 LAN
default         99.99.99.254    0.0.0.0         UG    0      0        0 WAN

并非所有NAT都支持将来自内部IP的数据包重定向到另一个内部IP。这就是所谓的发夹。与你的案例非常相似的例子

让我们考虑以下私有网络:

Proto Source Address                      Destination Address              State 
udp   192.168.1.142:52245                 99.99.99.99:43353                UNREPLIED   
udp   192.168.1.110:43353                 99.99.99.99:52245                UNREPLIED  
Gateway address: 192.168.0.1
Host 1: 192.168.0.5
Host 2: 192.168.0.7

The gateway has an external IP : 192.0.2.1
Host 1 runs a P2P application P1 on its port 12345 which is externally mapped to 4444.
Host 2 runs a P2P application P2 on its port 12345 which is externally mapped to 5555.
如果NAT设备支持发夹,则P1应用程序可以使用外部端点192.0.2.1:5555连接到P2应用程序。否则,通信将无法工作

当两个客户端位于同一LAN中时,它们几乎总是通过“候选主机”进行连接(有时通过候选中继进行连接,不确定原因)


只有当一个或两个主机已阻止另一个主机的IP地址时,才会发生这种情况。除此之外,同一LAN下的两个设备不可能没有主机到主机的连接。

我能够使用srvflx候选设备在同一LAN中的两个客户端之间建立ice连接,仅通过VPN隧道传输一个客户端

如果不使用VPN,连接将永远不会成功


我从VPN隧道客户端测试的STUN服务器在确定我的本地地址和映射地址时没有问题。

问题是,当两个对等方/客户端远程IP(99.99.99.99)位于同一路由器(同一LAN)上时,它不工作。您在NAT路由器上运行了netstat命令吗?我没有运行该命令,netstat输出是从路由器管理GUI返回的。除了手动运行测试以检查NAT是否支持发夹外,还有其他指示我可以查找吗?例如,如果我想买一台新的路由器,我应该如何从产品描述中知道该路由器是否支持发夹?对不起,我不确定。也许看一下产品说明是最好的方法。