在 WebRTC 信令过程中,我必须通过向 STUN 服务器发出请求来找到我自己的公共 IP 地址和端口。但它真的需要这么复杂吗?
难道我不能只向子网的路由器发送请求并获取其 IP 地址和它为我打开的端口吗?或者更好的是,我直接将我的公共地址存储在我的计算机中,每当它发生变化时路由器都会通知我。浏览器会提供一个API来直接获取这个公共地址。无需使用 STUN 服务器。我们为什么不这样做呢?
感谢您的帮助。
这些都是很好的问题。
难道我不能只向子网的路由器发送请求并获取其 IP 地址和它为我打开的端口吗?
有一种名为uPnP 的旧协议,只要路由器支持,它就会为您动态打开端口映射。很多路由器曾经支持它。不知道现在标准如何。
即使路由器是智能的并且有标准的信令机制,在以下场景中仍然需要 STUN(或 STUN 的等效项)。
运营商 NAT是指您的 ISP 与多个路由器共享公共 IP 地址。也就是说,ISP 在启动时配置的路由器的公共 IP 地址实际上只是另一个私有 IP 地址。在上游,有一个“更大的路由器”与多个其他客户共享公共 IPv4 地址。也就是说,您的 PC 可能认为它的 IP 地址是 192.16.1.2,而您的路由器报告它自己的 IP 地址是 10.0.0.2。实际的公共IP地址1.2.3.4与其他客户共享。STUN 解决了这个问题,因为到公共 STUN 服务器的出站数据包将经过两个 NAT - 沿途创建端口映射。
或者更好的是,我直接将我的公共地址存储在我的计算机中,只要它发生变化,路由器就会通知我
因为建立有效的 P2P/WebRTC 连接不仅仅是知道您的公共 IP 地址。它还涉及了解要使用的“端口”。虽然大多数路由器会尝试保留客户端 PC 在映射中使用的套接字的本地端口(例如 10.0.0.2:9876 映射到 1.2.3.4:9876)。情况并非总是如此 - 另一个节点可能正在使用网络上的端口 9876 和/或许多 NAT 只是选择一个随机可用的端口进行映射。最终,您必须向 P2P/WebRTC 连接的另一端发出“使用哪个 IP”和“哪个端口”的信号。
浏览器会提供一个API来直接获取这个公共地址。
有很多网站(例如whatismyipaddress.com)可以告诉您您的IP 地址。但是,如果涉及 HTTP 代理服务器(在 PC 上显式配置或在网络上静默部署),Web 服务将只能看到代理 IP 地址。此外,HTTP(S) 是基于 TCP 的协议。STUN 和 WebRTC 是基于 UDP 的。
| 归档时间: |
|
| 查看次数: |
1523 次 |
| 最近记录: |