为什么 WebRTC 使用一对候选而不是一个 IP + 端口对进行双向通信

Why WebRTC uses a candidate pair and not one IP + Port pair for bidirectional communication

我一直在研究 WebRTC 的 "internals",到目前为止已经取得了重大进展。我的 javascript 客户端应用程序运行完美,我已经设置了 STUN、TURN(s),即使它们都位于对称 NAT 环境中,我的对等方也能够连接。

当我阅读关于 ICE 和 NAT 遍历的 IETF 草案时,我假设当至少一个对等点位于非对称 NAT 环境中时,非中继连接是可能的,其中 UDP 打孔是可能在路由网关上。

在构建基于 WebRTC 的文件传输服务时,我意识到我需要在代码中检测传输是否被中继。我开始调查连接和传输属性,结果发现传输仍然是用 candidate pair 定义的,而不是给定类型的单个连接。

所以在接收方,我有: Local candidate type: srflx Remote candidate type: relay 我可能应该将其视为 "when a receiver is being sent data" - 使用 NAT 上的绑定端口 (srflx),但是当接收方向发送方(远程端点)发送数据时 - 它被中继。

这是一对正确的 "reading" 配置吗?但更重要的是,既然在选定的一对中有一个 srflx 候选,为什么它仍然是一对,而不是一个双向连接套接字?

WebRTC 主要是 UDP。关于 "connections".

请记住这一点

So on receiver's side, I have:

Local candidate type: srflx
Remote candidate type: relay

这意味着所有通信都通过远程对等方分配的 TURN 服务器地址进行。 他们的 TURN 服务器正在转发到你的 srflx 地址——这是你的public IP 地址(和端口映射),通过STUN/TURN.

因此,如果您尝试检测是否使用中继,请同时检查本地和远程。

它们被称为 "candidate pairs",因为最终 WebRTC/P2P 连接将与您一端的一个地址和另一端的一个地址建立。您这边的每个候选地址都在尝试 ping 远程地址。最终双方汇聚在一条 "candidate pair" 作为最终路线。

这有帮助吗?