目录
RPort
一、RPort 是什么意思?
- 定义:RPort(Received port) 是 SIP 协议 Via 头字段中的一个参数,表示 SIP 请求或响应是从哪个端口接收到的 。这个参数由 SIP 代理服务器自动添加,用来告诉下游设备:我从你这里接收到消息的实际端口号是多少。
- 示例:Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK1234;rport=54321
在这个例子中rport=54321
表示该 SIP 请求是通过公网的 54321 端口 发送到代理服务器的。- 这个信息对 NAT 后的 VoIP 设备非常重要,因为其实际使用的源端口可能被 NAT 转换过。
二、RPort 的作用
-
NAT 穿透支持 :
- 当 VoIP 终端位于 NAT 后面时,其发出的 SIP 消息源地址和端口会被 NAT 改写。
- 如果不使用 RPort,SIP 代理无法知道终端的真实映射端口,从而可能导致后续请求(如 INVITE 回拨)无法正确送达。
-
简化媒体路径(Media Path) :
- 使用 RPort 可以让代理将媒体流直接发往客户端的 NAT 映射端口,避免额外的中间转发(如 STUN、TURN 或 Media Proxy)。
-
保持会话一致性 :
- 确保后续 SIP 请求(如 ACK、BYE)能够通过相同的 NAT 端口返回给客户端。
三、RPort 开启的“直接流程”是什么意思?
- “开启 RPort”的含义:
- 在 VoIP 话机或软交换系统中,"开启 Rport" 表示允许设备在 SIP Via 头中使用
rport
参数,并接受来自代理服务器的rport
值。 - 通常是一个配置选项(如在 FreeSWITCH、Asterisk、或者 IP 话机 Web 配置界面中可以设置)。
- 在 VoIP 话机或软交换系统中,"开启 Rport" 表示允许设备在 SIP Via 头中使用
- “RPort 开启后的直接流程”是指:
- 当 RPort 被启用 后,SIP 代理服务器会根据客户端 Via 头中的
rport
值来回复请求,而不是仅仅依赖 Via 中的 IP 和端口。
- 当 RPort 被启用 后,SIP 代理服务器会根据客户端 Via 头中的
- 流程说明如下:
- 终端注册(REGISTER)
- 终端发送 REGISTER 请求,Via 头中包含
rport
(如rport=5060
)或空值(如rport
),表示希望服务器记录其真实接收端口 - 服务器收到请求后,发现 Via 中有
rport
,则用自己的接收端口填充rport
字段,例如rport=54321
。 - 注册成功后,服务器就知道下次要联系终端时,应该向 NAT 公网地址的
54321
端口发送数据。
- 终端发送 REGISTER 请求,Via 头中包含
- 代理发送请求给终端
- 当有呼叫进来时,代理服务器会把 SIP 请求(如 INVITE)发送到 NAT 的公网地址和指定的
rport
端口(如 54321) - NAT 将此请求转发给内网 VoIP 终端的私有地址和端口(如 192.168.1.100:5060)。
- 当有呼叫进来时,代理服务器会把 SIP 请求(如 INVITE)发送到 NAT 的公网地址和指定的
- 媒体路径建立
- 如果也开启了类似 "media use rtp ip" 或 "rtp port" 等配置,媒体流(RTP)也会尝试直接发往客户端的 NAT 映射端口。
- 终端注册(REGISTER)
- 直接流程的优势:
- 不需要额外的 NAT 穿透技术(如 STUN、ICE)。
- 不需要媒体经过代理中转(节省带宽和延迟)。
- 更加稳定,适合动态 NAT 环境。
四、总结对比表
功能 | RPort 关闭 | RPort 开启 |
---|---|---|
是否记录客户端映射端口 | 否 | 是 |
SIP 请求能否穿透 NAT | 依赖其他机制(如 STUN) | 可直接穿透 |
是否支持直接媒体路径 | 否 | 是 |
是否需要中间转发 | 可能需要 | 通常不需要 |
为什么要检查注册报文和invite报文?
- 确认终端是否成功注册到服务器
- REGISTER 请求用于向 SIP 注册服务器(Registrar)注册一个用户地址
- 如果注册失败,终端将无法接收或发起呼叫。
- 查看注册状态和超时时间
- 可以看到注册的有效期(Expires 值)、是否刷新注册。
- 防止因注册过期导致通话中断。
- 验证认证流程是否正确
- REGISTER 请求通常需要 Digest 认证。
- 检查是否有
401 Unauthorized
或407 Proxy Authentication Required
错误,确认用户名、密码是否正确。
- 排查 NAT/防火墙问题
- 查看 Via 头中的
rport
和 IP 地址是否正确。 - 如果服务器收到的 REGISTER 来源地址是私网地址(如 192.168.x.x),说明没有正确穿透 NAT。
- 查看 Via 头中的
- 获取终端能力信息
- 虽然 REGISTER 不携带 SDP,但可以通过 Contact 头中的参数判断终端支持的协议(如 UDP/TCP/TLS)、端口等。
为什么要检查 邀请报文(INVITE)
- 确认呼叫流程是否启动
- INVITE 是建立呼叫的第一步,如果收不到 INVITE,后续流程无法进行。
- 检查 INVITE 是否发出、是否到达对方、是否被丢弃。
- 分析媒体协商内容(SDP)
- INVITE 中包含 SDP(Session Description Protocol),描述:
-
使用的媒体类型(音频/视频)
-
编码格式(G.711、G.722、G.729 等)
-
RTP/RTCP 端口
-
媒体地址(IP)
-
-
如果两端编码不匹配、NAT 地址错误、端口不通,会导致媒体不通(单通/无声音)
- INVITE 中包含 SDP(Session Description Protocol),描述:
-
排查路由问题
-
From、To、Request-URI 字段可以帮助判断:
-
呼叫是否被正确转发?
-
是否被代理服务器修改了目标地址?
-
-
-
识别 SIP 会话特征
-
判断是否是 PSTN 入局、内部分机呼叫、外呼等。
-
查看 Call-ID、CSeq、Branch ID 等字段,用于跟踪整个会话流程。
-
-
检测异常行为或攻击
-
检查是否有频繁的 INVITE 攻击(SIP 扫描、暴力注册尝试)
-
分析是否有畸形 SIP 消息(Malformed SIP)。
-
常见问题与检查建议
问题 | 检查内容 |
---|---|
终端无法注册 | 检查 REGISTER 报文是否发出?是否有 401/407/408 错误?Via 地址是否正确? |
有来电但无铃声 | 检查 INVITE 是否到达终端?SDP 中媒体地址是否为公网地址? |
媒体不通(单向/双向无声) | 检查 SDP 中的 IP 和端口是否正确?是否被防火墙拦截? |
呼出失败 | 检查 INVITE 是否由客户端发出?Route 头是否正确? |
频繁掉线 | 检查 REGISTER 是否按时刷新?是否有 NAT 映射失效? |
总结
目的 | 报文类型 | 关键信息 |
---|---|---|
用户注册 | REGISTER | Contact、Expires、Via、认证信息 |
呼叫建立 | INVITE | SDP、From/To、Call-ID、媒体协商 |
排查网络/NAT问题 | REGISTER + INVITE | Via、Contact、SDP 中的 IP 和端口 |
安全审计 | INVITE/REGISTER | 异常来源、认证失败、攻击行为 |
什么是 "INVITE 回拨"?
-
INVITE 回拨(Call Back) 是指:当一个终端(通常是位于 NAT 后面的设备)成功注册到服务器后,服务器为了确保呼叫能成功送达该终端,主动向其发起一次 INVITE 请求 ,从而触发终端发起正常的呼叫流程或测试网络可达性。
-
这种“回拨”也可以是由系统自动发起的,比如在以下场景中:
-
场景 1:NAT 穿透(Keepalive 或打洞)
-
终端在 NAT 后注册成功。
-
服务器发送一个 INVITE 回拨请求,促使 NAT 表项保持活跃,并记录终端当前的公网映射地址和端口(Via 中的 rport)。
-
目的是后续真正呼叫时能准确找到这个终端。
-
-
场景 2:安全验证(Security Call Back)
-
用户尝试外呼(如拨打 PSTN),但系统要求先进行身份验证
-
系统先挂断外呼,然后通过 INVITE 向用户手机或 IP 话机发起一个来电。
-
用户接听后,再继续执行外呼动作。
-
这种方式用于防止账户被滥用或控制外呼权限。
-
-
场景 3:盲转回拨(Blind Transfer Callback)
-
A 呼叫 B,B 将 A 转接到 C。
-
如果 C 无法接收直接转发,SIP 服务器会分别与 A 和 C 建立独立连接,再桥接起来。
-
在此过程中可能会有多个 INVITE 请求来回交互。
-
-
INVITE 回拨的流程示例
- Client 注册成功后,Proxy 主动发起 INVITE 回拨。
- Client 接收到 INVITE 后应答,建立起媒体通道。
为什么需要 INVITE 回拨?
目的 | 描述 |
---|---|
✅ 保证 NAT 映射有效 | 强制刷新 NAT 映射表,让服务器知道如何联系客户端 |
✅ 避免单通/无声音问题 | 确保媒体路径正确建立 |
✅ 提高呼叫成功率 | 特别是在动态 NAT 或防火墙环境下 |
✅ 实现安全机制 | 如电话回拨验证(Caller Verification) |