1. 概述
本文解决如下问题:xlite之间已经正常的进行sip协议的交互,并且1008和1018已经呼通,但是1008和1018互相之间无法听到声音。
主要涉及如下内容:
1. 语音不通的原因分析
2. SDP协议
2. NAT的问题
3. freeswitch如何实现NAT的穿越的问题
2. 案例环境说明
软电话使用x-lite,使用freeswitch的默认的两个号码1008和1018。
freeswitch部署在服务器的私网地址是172.23.4.92,公网地址115.aa.aa.aa。
1008的测试机器在私网上(IP为10.240.80.69),通过115.aa.aa.aa:5060注册freeswitch,但是出去后的公网地址是59.bb.bb.bb。
1018的测试机器在私网上,通过115.aa.aa.aa:5060注册freeswitch,但是出去后的公网地址是123.cc.cc.cc
在172.23.4.92上,使用tcpdump捕获通信过程中的所有包
为了安全,本文把真实环境的公网地址,全部使用假的地址进行替换
3. 原因分析
xlite之间已经正常的进行sip协议的交互,并且1008和1018已经呼通,但是1008和1018互相之间无法听到声音。
3.1 初步判断原因
- a. 正常的流程时,1008和1018之间使用sip协议建立通话后,1008和1018的语音包不直接发送给对方,而是都先发送到freeswitch,由freeswitch转发给对方。但是他们之间通话信息传输使用的却是rtp包或其他UPD包,并且rtp包或其他UPD包不是在已经建立的sip协议线路上传输数据,而是使用别外一条线路传输,所有猜测有可能1008和1018的包都没有成功传输到freeswitch,导致无法听到对方声音
- b. rtp包的传输使用的是UDP,且1008和1018都在内网,fs部署到公网,所以这里又涉及NAT的问题
3.2. SDP
第一个问题:1008和1018之间是如何知道对方的RTP包或其他UPD包交互的IP地址?答案是通过SDP相互知道的。SIP在建立会话时,SIP协议会包含相关的媒体(如视频和音频)的信息,媒体的相关的数据会包含在SDP中。SDP也会放在SIP协议的正文(body)中
3.3. 1008主叫的问题分析
1008 向freeswitch发起INVITE 消息包分析
No. Time Source Destination Protocol Length Info
267 15.676245 59.aa.aa.aa 172.23.4.92 SIP/SDP 968 Request: INVITE sip:1018@115.aa.aa.aa:5060 |
Frame 267: 968 bytes on wire (7744 bits), 968 bytes captured (7744 bits)
Ethernet II, Src: ZteCorpo_60:22:21 (00:22:93:60:22:21), Dst: Vmware_83:02:4d (00:50:56:83:02:4d)
Internet Protocol Version 4, Src: 59.aa.aa.aa, Dst: 172.23.4.92
User Datagram Protocol, Src Port: 24576 (24576), Dst Port: 5060 (5060)
Session Initiation Protocol (INVITE)
Request-Line: INVITE sip:1018@115.aa.aa.aa:5060 SIP/2.0
Message Header
略..
Message Body
Session Description Protocol
Session Description Protocol Version (v): 0
Owner/Creator, Session Id (o): - 13153395802875591 1 IN IP4 10.240.80.69
Session Name (s): X-Lite release 4.9.8 stamp 84253
Connection Information (c): IN IP4 10.240.80.69
Time Description, active time (t):