我正在使用 UDP 套接字编写一个 VoIP 服务器,我想在具有公共 IP 的 VPS 上运行它。显然,从服务器向 NAT 后面的客户端发送 UDP 数据包(基本上位于任何 ISP/蜂窝网络后面)是有问题的,因为大多数 NAT 为每个传出连接分配随机端口给设备。 TURN 服务器应该可以解决这个问题,但我不明白如何解决,也找不到很多相关信息。我查看了一些实现(WebRTC、Coturn),但它们太大且难以理解。我的问题是:
我明白了
我不知何故想到服务器无法通过 NAT 用 udp 数据包回复客户端;我错了,它绝对可以,它只应该是相同的套接字(我认为每个绑定的套接字映射到 NAT 上的唯一端口)
你可以避免 STUN 服务器,因为(至少是 Linux)socket API 实际上有一种方法来获取源 ip/端口(功能
recvfrom
)并且如果你在合理的时间内将一些数据发送回该套接字(如果它仍然是打开)服务器将到达客户端
我的想法是错误的,因为每个人都对 NAT 穿越大惊小怪,我认为它背后有一些特殊的魔力,而实际上它几乎和在本地主机上做事一样简单