1. 什么是SDP?
SDP是Session Description Protocol的缩写,翻译过来就是会话描述协议,这个协议通常存储各种和媒体相关的信息,例如支持哪些媒体编码, 媒体端口是多少?媒体IP地址是多少之类的。
SDP一般作为SIP消息的body部分。如下所示
INVITE sip:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TCP client.atlanta.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:alice@atlanta.example.com>;tag=9fxced76sl
To: Bob <sip:bob@biloxi.example.com>
Call-ID: 3848276298220188511@atlanta.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.atlanta.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 151
v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=-
c=IN IP4 192.0.2.101
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
刚开始我一直认为某些sip消息一定带有sdp,例如invite消息。某些sip请求一定没有携带sdp。
实际上sip消息和sdp并没有硬性的附属关系。sip是用来传输信令的,sdp是用来描述媒体流信息的。
如果信令不需要携带媒体流信息,就可以不用携带sdp。
一般情况下,invite请求都会带有sdp信息,但是某些时候也会没有。例如3PCC(third party call control), 第三方呼叫控制,是指由第三方负责协商媒体信息。
常见的一个场景
2. SDP字段介绍
2.1. v= 版本号
当前sdp的版本号是0,所以常见的都是v=0
2.2. o= 发起者id
o=的格式
o=username session-id version network-type address-type address
- username: 登录的用户名或者主机host
- session-id: NTP时间戳
- version: NTP时间戳
- network-type: 一般是IN, 表示internet
- address-type: 表示地址类型,可以是IP4, IP6
2.3. c= 连接数据
c=的格式
c=network-type address-type connection-address
- network-type: 一般是IN, 表示internet
- address-type: 地址类型 IP4, IP6
- connection-address: 连接地址
2.4. m= 媒体信息
格式
m=media port transport format-list
- media 媒体类型
- audio 语音
- video 视频
- image 传真
- port 端口号
- transport 传输协议
- format-list 格式
m=audio 49430 RTP/AVP 0 6 8 99
m=application 52341 udp wb
2.5. a= 扩展属性
2.6. 通用扩展
3. SDP中的RTP RTCP 信息
RTP的端口一般是偶数,例如下面的4002。RTCP是RTP端口下面的一个奇数,如4003。 RTP中传递的是媒体信息,RTCP是用于控制媒体信息传递的控制信令,流入丢包的数据。
m=audio 4002 RTP/AVP 104 3 0 8 96
a=rtcp:4003 IN IP4 192.168.1.5
4. WebRTC中的RTP和RTCP端口
在WebRTC中,RTP和RTCP的端口一般是公用一个。 在INIVTE消息的SDP中会带有:
a=rtcp-mux
如果服务端同意公用一个端口,并且INVITE请求成功,那么在200 OK的SDP中可以看到下面的内容。 可以看到RTP和RTCP公用20512端口。
m=audio 20512 RTP/SAVPF 0 8 101
a=rtcp:20512
a=rtcp-mux