PJSIP中的单通问题以及STUN服务器原理

1. PJSIP中的单通问题

单通问题 是指在VoIP通话中,一方能听到另一方的声音,但另一方却听不到这一方的声音。从网络层面看,就是媒体流(RTP/RTCP包)只能在一个方向上成功传输,而在反方向上则被丢弃或无法到达。

产生单通问题的根本原因:NAT(网络地址转换)

绝大多数单通问题都发生在至少一方处于NAT(如家庭路由器、公司防火墙)之后的场景。其核心原理如下:

  1. 私网地址与公网地址 :处于NAT后的设备(如你的电脑/IP电话)使用的是私有IP地址(如 192.168.1.100),这个地址在公网上是无法被直接路由的。
  2. SIP与RTP路径分离:SIP信令(如INVITE请求)和RTP媒体流通常通过不同的通道传输。
  3. 问题的发生过程
    • 终端A(在NAT后)和终端B(可能在公网或另一个NAT后)通过PJSIP建立通话。
    • 在SIP信令的SDP体中,终端A会告诉终端B:"请把音频流发送到我的地址 192.168.1.100:5004"。
    • 终端B收到这个请求后,会试图将RTP包发送到这个私有地址 192.168.1.100:5004。然而,这个地址在公网上是无效的,终端B根本找不到这条路,因此数据包被丢弃。
    • 反过来,当终端A向终端B发送音频流时,它发出的数据包会先经过自己的NAT设备。NAT设备会创建一个 "洞" ------一个临时的映射关系,比如将 192.168.1.100:5004 映射到公网IP 1.2.3.4:65000。然后数据包以源地址 1.2.3.4:65000 发送给终端B。
    • 终端B收到来自 1.2.3.4:65000 的数据包,它可以正常回复,因为这是一个明确的公网地址。

结果就是:A能成功发送数据给B,所以B能听到A的声音;但B无法成功发送数据给A(因为地址是私有的),所以A听不到B的声音。这就是典型的单通。

2. STUN服务器如何解决单通问题

STUN(Session Traversal Utilities for NAT)协议的目的就是帮助内网终端发现自己身处NAT之后,并发现自己被NAT映射后的公网地址和端口

STUN服务器的实现原理非常简单:

  1. 查询:位于NAT后的PJSIP客户端向一个部署在公网上的STUN服务器发送一个请求:"你好,请告诉我,在你看来,我的IP地址和端口是什么?"
  2. 响应 :STUN服务器收到这个请求包。它查看包的源IP地址和源端口(这个地址已经是客户端经过NAT转换后的公网地址了),然后将这个地址信息封装在一个响应包里,发回给客户端。
  3. 获知公网地址 :客户端收到响应后,就明白了:"原来在公网上,别人要联系我,需要往 1.2.3.4:65000 这个地址发送数据。"

在PJSIP中的应用:

当PJSIP客户端通过STUN服务器获取到自己的公网地址和端口后,它就不会再在SDP中填写自己的私有地址(192.168.1.100:5004),而是填写这个获取到的公网地址(1.2.3.4:65000)。

这样,当终端B收到SDP时,它就会直接向 1.2.3.4:65000 发送RTP流。这个地址是终端A的NAT设备所认可的"外部入口",数据包因此可以顺利通过NAT到达终端A。

关键点: STUN本身并不转发任何语音数据,它只是一个工具,让客户端"自知",从而在信令中提供正确的、可被对端直接连接的地址。

3. STUN服务器的局限性及TURN的引入

STUN方案在大多数情况下有效,但对于一种叫做 "对称型NAT" 的网络环境会失效。

  • 对称型NAT的特点:它会为每一个不同的外部目的地(目标IP和端口),分配一个不同的公网端口映射。
  • 问题所在 :客户端向STUN服务器(IP_X)查询时,NAT打开了一个映射 192.168.1.100:5004 -> (1.2.3.4:65000) -> STUN_Server:3478
  • 但当客户端与另一个VoIP对端(IP_Y)通信时,NAT会创建一个全新的映射 192.168.1.100:5004 -> (1.2.3.4:65001) -> VoIP_Peer_Y:1234
  • 客户端在SDP中告诉对端的是从STUN服务器那里得到的地址 1.2.3.4:65000,而对端实际需要连接的却是 1.2.3.4:65001,导致连接失败。

解决方案:TURN

当STUN无法解决问题时(例如检测到是对称型NAT,或直接连接失败),就需要使用TURN协议。

  • TURN原理:TURN服务器是一个公网上的中继服务器。客户端与TURN服务器建立一个连接,并告诉它:"请为我分配一个中继地址。"
  • TURN服务器会分配一个公网地址(如 5.6.7.8:10000)给这个客户端。
  • 客户端在SDP中填写这个TURN服务器的中继地址 5.6.7.8:10000
  • 对端将所有媒体流都发送到 5.6.7.8:10000,TURN服务器负责将这些数据转发给内网的客户端。反之亦然。

总结:

技术 角色 优点 缺点
STUN 地址发现工具 延迟低,P2P,服务器负担小 无法解决对称型NAT问题
TURN 数据中继 兼容性最高,能穿透所有NAT 延迟稍高,服务器需要高带宽,有转发成本

在现代VoIP系统中(包括PJSIP的典型配置),通常会采用 ICE 框架,它综合使用STUN和TURN。客户端会同时收集多个候选地址(包括本地地址、STUN发现的地址、TURN中继地址),并通过信令交换这些候选地址,然后通过连通性检查找出最优的传输路径。STUN/TURN服务器组合常被统称为 NAT穿透服务器

相关推荐
七夜zippoe14 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥14 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
会员源码网14 小时前
理财源码开发:单语言深耕还是多语言融合?看完这篇不踩坑
网络·个人开发
米羊12115 小时前
已有安全措施确认(上)
大数据·网络
Fcy64815 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满15 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
主机哥哥16 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
ManThink Technology16 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
珠海西格电力科技17 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
QT.qtqtqtqtqt17 小时前
未授权访问漏洞
网络·安全·web安全