[在WebRTC信令过程中,我必须通过向STUN服务器发出请求来使用端口找到我自己的公共IP地址。但这真的需要这么复杂吗?
难道我不只是向子网的路由器发送请求并获取其IP地址和它为我打开的端口吗?甚至更好的是,我将我的公共地址直接存储在计算机中,并且路由器会在更改时通知我。浏览器将提供一个API,以直接获取此公共地址。无需使用STUN服务器。我们为什么不这样做呢?
谢谢您的帮助。
这些都是很好的问题。
我不能只向子网的路由器发送请求并获取其IP地址和它为我打开的端口吗?
存在一个称为uPnP的旧协议,它将为您动态打开端口映射-如果路由器支持的话。许多路由器曾经支持它。不确定现在的标准。
即使路由器是智能的并且有标准的信令机制,在以下情况下,STUN(或仍需要与STUN等效的东西)。
Carrier 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。