原创

P2P通信标准协议 - SDP详解

SDP简介

ICE信息的描述格式通常采用标准的SDP,其全称为Session Description Protocol,即会话描述协议.SDP只是一种信息格式的描述标准,不属于传输协议,但是可以被其他传输协议用来交换必要的信息,如SIP和RTSP等。

SDP信息

会话层

相当于JS全局变量,包括如下信息:

  • 会话的名称与目的
  • 会话的存活时间(0为永久存活)

媒体层

相当于JS局部变量,每一路音频媒体或视频媒体,包括如下信息:

  • 媒体格式
  • 传输协议
  • 传输ip与端口(webrtc不使用这个,使用ice收集的candidate)
  • 媒体负载类型

SDP格式

SDP是基于文本的协议,使用ISO 10646字符集和UTF-8编码.SDP字段名称和属性名称只使用UTF-8的一个子集US-ASCII,因此不能存在中文.虽然理论上文本字段和属性字段支持全集,但最好还是不要在其中使用中文.

SDP会话描述包含了多行如下类型的文本:

<type>=<value>

其中type是大小写敏感的,其中一些行是必须要有的,有些是可选的,所有元素都必须以固定顺序给出.固定的顺序极大改善了错误检测,同时使得处理端设计更加简单.如下所示,其中可选的元素标记为* :

会话层描述:

# 协议版本,一般为0
v=  (protocol version)
# Origion/Owner,发起者会话表示符
# 格式:o= <username> <session id> <version> <network type> <address type> <address>
# 例子:o=- 1072226489617043550 2 IN IP4 127.0.0.1
# 解释:-为忽略, 版本为2,IN为internet类型,IP4类型,ip为127.0.0.1
o=  (originator and session identifier)
# 会话名,-表示忽略会话名
s=  (session name)
i=* (session information)
u=* (URI of description)
e=* (email address)
p=* (phone number)
# 链接信息
# 格式:c= <network tpye> <address type> <connection address>
# 例子:c=IN IP4 0.0.0.0
c=* (connection information -- not required if included in all media)
b=* (zero or more bandwidth information lines)

One or more time descriptions ("t=" and "r=" lines; see below)

z=* (time zone adjustments)
k=* (encryption key)
# 设置一些全局的属性
a=* (zero or more session attribute lines)

Zero or more media descriptions

# 存活时间
 t=  (time the session is active)
 # 重复的次数
 r=* (zero or more repeat times)

多媒体层信息描述(如果有的话):

# 媒体的名字与传输地址
# 格式:m= <media> <port> <transport> <fmt/payload type list>
# 例子:m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126
m=  (media name and transport address)
i=* (media title)
# 连接信息
c=* (connection information -- optional if included at session level)
# 带宽信息
b=* (zero or more bandwidth information lines)
k=* (encryption key)
# 属性
a=* (zero or more media attribute lines)

WebRTC中Offer/Answer模式SDP

file

# 协议版本
v=0
# Origion/Owner,发起者会话表示符
# 格式:o= <username> <session id> <version> <network type> <address type> <address>
# 解释:用户名字(-为忽略),sessionId,会话版本每生成一次版本号加1,网络类型(IN为internet类型),网络地址类型(如IP4类型),ip地址
o=- 3434580873421746289 2 IN IP4 127.0.0.1
# session名称
s=-
# 会话开始时间与结束时间,0为不限制
t=0 0
# BUNDLE:有0,1,2一组媒体流绑定到一起,底层使用一个传输链路
a=group:BUNDLE 0 1 2
# msid:media stream ID(媒体流ID),6f1f5dc7-9792-431e-96ff-d86351c41123
# WMS:webrtc media stream
a=msid-semantic: WMS 6f1f5dc7-9792-431e-96ff-d86351c41123
# 媒体流信息,
# 端口9代表不需要使用SDP接收媒体流数据
# 传输协议使用UDP/TLS/RTP/SAVPF
# payload type :111 103 9 0 8 105 13 110 113 126,下面属性a会有单独解释
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 9 0 8 105 13 110 113 126
# 链接信息(webrtc并没使用)
c=IN IP4 0.0.0.0
# rctp信息
a=rtcp:9 IN IP4 0.0.0.0
# 在ice链路检查时候对链路有效性验证
a=ice-ufrag:qAfJ
a=ice-pwd:9nuV9HELpQmedIm5Zj7Yv2LC
# trickle:SDP交换是先不进行连通性检测
a=ice-options:trickle
# 进行DTLS协商交换证书
a=fingerprint:sha-256 11:D0:66:92:2B:B4:29:91:F2:FE:C9:E2:7C:95:53:BF:70:53:3A:58:8A:2A:4F:6A:2C:A9:30:B6:A6:4D:0E:D0
# 主要是表示DTLS的协商过程中角色的问题,谁是客户端,谁是服务器
# a=setup:actpass 既可以是客户端,也可以是服务器
# a=setup:active 客户端
# a=setup:passive 服务器
a=setup:active
# 媒体ID,上面a=group中的取值
a=mid:0
# 扩展头信息,解析扩展头指定序号即可
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
# 上面规范地址
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
# 既可以接收流又可以发送流
a=sendrecv
# 媒体流ID,6f1f5dc7-9792-431e-96ff-d86351c41123与上面一样,后面没啥用
a=msid:6f1f5dc7-9792-431e-96ff-d86351c41123 63d8cd9b-f3cd-465a-b0d3-c0cb6d5b14f7
# 下面是rtcp相关控制
# rtcp-mux多路复用,即rtp与rtcp复用同一个端口
a=rtcp-mux
# rctp-rsize为了减少rtcp包的,带宽足够时,反馈包括很多数据。由于有时候没有足够带宽,所以就用rsize来表示发送丢了多少包
a=rtcp-rsize
# 对payload type 111进行说明,opus编码器/48000采样率
a=rtpmap:111 opus/48000/2
# 传输端的带宽评估
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
# ssrc:标识一路流
# cname:channel name 和ssrc对应的名字
a=ssrc:3627880349 cname:ZM6lJQshghSzB6r1
m=video 9 UDP/TLS/RTP/SAVPF 96 97 125 107 114 115 116
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:qAfJ
a=ice-pwd:9nuV9HELpQmedIm5Zj7Yv2LC
a=ice-options:trickle
a=fingerprint:sha-256 11:D0:66:92:2B:B4:29:91:F2:FE:C9:E2:7C:95:53:BF:70:53:3A:58:8A:2A:4F:6A:2C:A9:30:B6:A6:4D:0E:D0
a=setup:active
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:12 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07
a=extmap:9 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:6f1f5dc7-9792-431e-96ff-d86351c41123 d94d5236-bb7e-40e5-9a16-f367d2353783
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
# 接收端带宽评估
a=rtcp-fb:96 goog-remb
# 传输端的带宽评估
a=rtcp-fb:96 transport-cc
# ccm:codec cotrol message,编码控制的回馈消息
# fir:完整的内部帧 即请求发送一个完整的I帧
a=rtcp-fb:96 ccm fir
# nack:告诉它有多少包是没有收到应答的,可以将没应答的包重新发一遍
a=rtcp-fb:96 nack
# pli和fir类似 请求完整帧类型 picture lose
a=rtcp-fb:96 nack pli
# rtx:丢包重传的通道,诊率90000
a=rtpmap:97 rtx/90000
# apt:表示97是96关联的通道,当96有数据包丢包时候,需要重传,重传的payload type是97
a=fmtp:97 apt=96
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
# red:冗余丢包策略
a=rtpmap:114 red/90000
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 ulpfec/90000
a=ssrc-group:FID 2007654033 3527579741
a=ssrc:2007654033 cname:ZM6lJQshghSzB6r1
a=ssrc:3527579741 cname:ZM6lJQshghSzB6r1
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 0.0.0.0
b=AS:30
a=ice-ufrag:qAfJ
a=ice-pwd:9nuV9HELpQmedIm5Zj7Yv2LC
a=ice-options:trickle
a=fingerprint:sha-256 11:D0:66:92:2B:B4:29:91:F2:FE:C9:E2:7C:95:53:BF:70:53:3A:58:8A:2A:4F:6A:2C:A9:30:B6:A6:4D:0E:D0
a=setup:active
a=mid:2
a=sctp-port:5000
a=max-message-size:262144
正文到此结束
本文目录