我想使用WebRTC在浏览器上做一个消息传递应用程序,但是我想摆脱STUN和TURN服务器之类的所有第三方(我也想摆脱信令服务器,但首先要解决)。我希望用户以键值方式将他们的联系人保留在浏览器localStorage
中:人的名字=> IP地址。
我真的不在乎如何用户找到自己的公用IP地址(他们可以执行ipconfig
,因为没有Web API可以检索它),也如何(他们可以使用Messenger等集中服务将其公共IP地址提供给朋友,也可以使用名片上的QR码)。
但是我的主要问题是我希望这些公共IP地址是静态的,因为我不想每次网关更改我的公共IP地址时都通知所有朋友更新他们的联系人文件。
在IPv4中,可用地址太少(只有40亿个),因此公共静态地址全部保留给网站和住宅网关。每当我想访问Internet时,我的网关都会为我的计算机打开一个特定的端口。例如,如果我的网关具有公用地址1.2.3.4
,则我的计算机的“公用地址”将临时为1.2.3.4:3000
。此过程称为NAT。要找到一个人的“公共地址”,必须向STUN服务器发送一个请求,该服务器将以什么IPv4地址和它看到的端口作为响应。但是网关有时会关闭端口的连接,因此这不是我想要的公共静态地址。
但是在IPv6中,情况有所不同,可能的地址数量非常高(2 ^ 128),因此从理论上讲,我们可以为世界上的每台计算机提供一个静态的公共地址。 NAT基本上是没有用的(我在这里不是在谈论防火墙)。但是同样存在一个问题,在IPv6中,您有一个静态但非公共的地址,而您有一个或多个公共但非静态的地址。因此,IPv4并没有真正改变,仍然不能解决我的问题。
我有2个问题:
谢谢您的帮助。
答案 0 :(得分:4)
您的问题并不是真正的编程问题,所以我假设您需要知道这一点,因为您正在开发使用IPv6的软件。从应用程序的角度来看:
您不需要TURN即可发现您自己的公共地址。如果没有NAT,则您的地址不会被网络更改,您的本地地址就是您的公共地址。您只需要让您的软件询问操作系统当前配置的地址是什么即可。
使用IPv6,通常不是网关向连接的设备提供地址。网关仅将网络前缀(/ 64)传送到网络,并且所有设备都选择自己的地址(每个设备通常有多个地址)。
DHCPv6确实存在,但是通常不用于在设备上配置IPv6地址。可以在无状态模式下使用它配置域名,DNS解析器等,但这与分配地址无关。
因此,设备在网关通信的前缀内选择自己的地址。如何选择?
最初,设备使用其接口MAC地址作为后缀(使用改良的EUI-64算法)。这样的问题是,例如,如果有一圈,您连接到的在线服务可能会跟踪您的设备。因为无论您连接到哪个网络,地址的后64位都将包含您的唯一MAC地址。这样一来,就可以跟踪您的设备,从工作场所到家,到您喜欢的咖啡厅等。
这些天,操作系统使用隐私扩展使您的IPv6地址不可追踪。通常,有一个稳定的地址链接到网络前缀,因此,每次连接到同一网络时,您都会获得相同的地址。该地址对于点对点通信很有用。
但是他们走得更远。通常还存在一组(半)随时间随机更改的隐私地址。您的设备可能每天甚至可能每小时生成一个新地址。这使得在线服务更加难以确定是否有一个设备更改了其隐私地址,或者是否有多个设备。由于此地址会随着时间而变化,因此对于短时间的出站连接很有用,但接受入站连接的用处不大。为此,请使用我在上一段中提到的稳定地址。
可能最困难的一点是如何向操作系统询问可用地址。看我自己的macOS盒子,我看到:
en2: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether c8:e0:eb:5c:af:61
inet6 fe80::1074:8568:e447:d9e3%en2 prefixlen 64 secured scopeid 0x12
inet6 2a02:xxxx:xxxx:xxxx:3e:873f:837:1417 prefixlen 64 autoconf secured
inet6 2a02:xxxx:xxxx:xxxx:b19c:71c5:1de8:8fde prefixlen 64 autoconf temporary
您可以看到长期secured
地址和短期temporary
地址。
在不知道您要开发哪种操作系统以及使用哪种编程语言的情况下,我无法为您提供进一步的帮助。请调整您的问题以包含该信息。