WebRTC实时通信 (一)| NAT问题
1990年,互联网上的设备出现了爆炸式增长。但IPV4是一个32位的数字,因此世界上只有42.9亿个唯一的IPV4地址。
我们不能给每个设备提供自己的IP地址,需要对此采取措施。
互联网提出了一个叫做NAT的临时解决方案,就像生活中的大多数事情一样,它成为了一个永久的解决方案,我们到处都有NAT。
NAT(Network Address Translation)
NAT或网络地址转换,是一种在设备没有公共IP地址时通过映射IP地址空间以允许流量到达其目的地的方法。
位于网络边缘的NAT设备,该设备将被映射到公共IP地址,并具有本地IP地址表。NAT后面的设备将使用本地IP地址,NAT的公共IP地址将用于NAT后面的所有设备。
因此,任何需要到达NAT后面的任何设备的流量都将被发送到NAT的公共IP,NAT将有一个带有映射的本地地址的设备表,NAT将把流量发送到它后面的本地设备。
对于互联网上的世界来说,NAT后面的所有设备看起来都像一个单独的设备。本地地址应不为外界所知,因此为本地网络保留了一些IP子网,即
10.0.0.0 – 10.255.255.255
172.16.0.0 – 172.31.255.255
192.168.0.0 – 192.168.255.255
这些地址不应在互联网中路由,而是保留用于本地使用,因此可以重复使用。在这些专用ip地址之前,将有一个NAT设备,该设备将具有可全局路由的公共ip地址,并为其网络进行从公共地址到专用地址的转换,反之亦然。
因此,对多个设备使用一个公共IP。
NAT的问题
通常在家庭或办公室中,互联网服务提供商提供单个公共IP地址,并且所有设备都在该IP地址后面。
为了从外部世界到达特定设备,外部服务器将数据包发送到公共IP地址,然后NAT将数据传输到本地IP地址上的设备,因为NAT知道本地网络上的哪个设备请求了数据。
如果我们想在两个或多个客户端之间建立直接连接,就会出现问题,因为使用NAT,所有客户端都将位于NAT之后。它只知道自己的内部本地IP地址,NAT设备会重写每个UDP数据包中的源端口和地址,以及IP数据包中始发的IP地址。
客户端无法使用其内部IP地址与外部对等方通信,因为连接将失败。因此,应用程序必须发现其公共IP地址,然后与网络外的对等方共享。
然而,仅仅知道公共IP地址并不能解决问题。到达NAT设备的公共IP的任何数据包也必须具有目的端口和NAT表中的条目,该条目可以将其转换为内部IP到内部目的主机IP和端口。
如果该条目不存在(最有可能的情况是客户端直接与来自外部世界的对等方通信),则NAT丢弃数据包,因为NAT无法知道将该数据包发送到哪里(即该数据包需要发送到哪个设备)。
解决方案
为了解决这种不匹配,已经发明了各种Traversal技术,即(STUN、TURN和ICE)。这些用于在网络上的对等点之间建立端到端连接。绕过NAT与NAT后面的设备建立连接的技术称为NAT穿越。
在进行WebRTC通信时,节点间会按照如下顺序获取对方的地址:
- 如果双端在同一个内网,直接用内网IP通信;
- 通过STUN服务器,为双端构造可以直接访问的地址,打造一条可以穿透NAT的通路,俗称“打洞”;
- 双端通过TURN服务器(中继服务器)进行通信。此时,通信网络的拓扑结构不再是P2P,因为数据其实是经过TURN服务器转发给双端的。