WebRTC SDP(Session Description Protocol)是WebRTC实现P2P连接的核心“会话描述格式(format)”,用于承载媒体协商与连接参数;SIP(Session Initiation Protocol)则是“信令协议”。本文聚焦SDP在WebRTC中的作用,并梳理其与SIP INVITE之间的区别与联系。
SDP基础与定位
SDP(会话描述) 由 RFC 4566 定义,是一种“文本格式”的会话描述信息集合,用于表达多媒体会话的参数本身,而非一种“传输/信令协议”。在WebRTC中,SDP承担媒体能力与参数的协商表达。
SDP基本信息表
属性 | 说明 | 示例值 |
---|
标准文档 | 定义SDP内容格式的标准 | RFC 4566 |
格式类型 | 会话描述格式(纯文本) | 键值对/行语义 |
主要用途 | 媒体会话描述 | 编解码器、带宽、方向等 |
WebRTC接口 | 宿主对象 | RTCSessionDescription (offer/answer) |
SDP描述的核心信息
媒体信息对照表
信息类型 | SDP标识 | 说明 | 常见值 |
---|
媒体类型 | m= | 指定媒体流类型 | audio, video, application |
连接信息 | c= | 网络连接地址 | IN IP4 0.0.0.0 |
属性信息 | a= | 媒体属性描述 | rtpmap, ice-ufrag, sendrecv |
会话信息 | s= | 会话名称 | - (通常为空) |
时间信息 | t= | 会话时间 | 0 0 (永久会话) |
编解码器支持对照表
媒体类型 | 编解码器 | 载荷类型 | 采样率 | 特点 |
---|
音频 | Opus | 111 | 48000/2 | 高质量,低延迟 |
音频 | PCMU | 0 | 8000 | 标准G.711 |
音频 | PCMA | 8 | 8000 | 标准G.711 |
视频 | VP8 | 96 | 90000 | Google开源 |
视频 | VP9 | 98 | 90000 | 高效压缩 |
视频 | H.264 | 97 | 90000 | 广泛支持 |
WebRTC中的Offer/Answer模型
SDP交换流程图(WebRTC)
sequenceDiagram
participant A as 发起方(Caller)
participant S as 信令服务器
participant B as 接收方(Callee)
A->>A: 创建本地SDP Offer
A->>A: setLocalDescription(offer)
A->>S: 发送Offer SDP
S->>B: 转发Offer SDP
B->>B: setRemoteDescription(offer)
B->>B: 创建本地SDP Answer
B->>B: setLocalDescription(answer)
B->>S: 发送Answer SDP
S->>A: 转发Answer SDP
A->>A: setRemoteDescription(answer)
Note over A,B: SDP协商完成,开始媒体传输
SDP交换状态表(WebRTC)
阶段 | 发起方状态 | 接收方状态 | SDP类型 | 描述 |
---|
1 | 创建Offer | 等待 | offer | 发起方生成本地媒体能力描述 |
2 | 等待Answer | 处理Offer | offer | 接收方收到并设置远程描述 |
3 | 等待Answer | 创建Answer | answer | 接收方生成应答描述 |
4 | 处理Answer | 等待连接 | answer | 发起方收到并设置远程描述 |
5 | 连接建立 | 连接建立 | - | 双方完成媒体协商 |
SDP 与 SIP INVITE:区别与联系
结论先行:SDP是“描述内容”,SIP INVITE是“承载信令”。在典型的SIP呼叫流程中,INVITE报文的消息体可携带SDP(作为Offer);对端在200 OK中回送SDP(作为Answer),完成与WebRTC相同的Offer/Answer协商模型。
概念区分表
维度 | SDP(会话描述格式) | SIP INVITE(信令请求) | 关系 |
---|
定位 | 描述媒体能力与会话参数的文本格式 | 会话发起/修改/终止的信令请求方法 | INVITE的消息体可携带SDP |
作用 | 揭示编解码器、媒体方向、带宽、网络等 | 负责呼叫流程控制与路由 | 信令承载描述内容 |
标准 | RFC 4566 | RFC 3261(及相关扩展) | 不同标准、互补协作 |
协商模型 | Offer/Answer(RFC 3264) | 通过INVITE/200 OK/ACK驱动的交易 | Offer/Answer在SIP交易中落地 |
SIP携带SDP的时序(与Offer/Answer对应)
sequenceDiagram
participant UAC as 发起方(UAC)
participant Proxy as SIP代理/中继
participant UAS as 接收方(UAS)
UAC->>Proxy: INVITE (SDP=Offer)
Proxy->>UAS: INVITE (SDP=Offer)
UAS-->>Proxy: 180 Ringing / 183 Progress (可选,含早期媒体SDP)
UAS->>Proxy: 200 OK (SDP=Answer)
Proxy->>UAC: 200 OK (SDP=Answer)
UAC->>Proxy: ACK
Proxy->>UAS: ACK
Note over UAC,UAS: SDP要素达成一致,媒体(RTP/RTCP)开始传输
SIP INVITE 关键信息承载表
元素 | 位置 | 示例/说明 | 作用 |
---|
方法 | 起始行 | INVITE sip:[email protected] SIP/2.0 | 发起会话请求 |
会话路由 | 首部 | Via/Route/Record-Route | 传递/记录信令路径 |
会话标识 | 首部 | Call-ID / From / To / CSeq | 识别一次会话与顺序 |
会话能力 | 首部 | Contact / Allow / Supported | 标示终端能力与特性 |
负载类型 | 首部 | Content-Type: application/sdp | 声明消息体类型为SDP |
描述内容 | 消息体 | SDP文本(Offer或Answer) | 承载媒体能力与参数 |
与WebRTC信令的对照
环节 | SIP场景 | WebRTC场景 | 共同点 |
---|
Offer产生 | INVITE携带SDP | createOffer()/setLocalDescription | 生成本地媒体能力描述 |
Answer返回 | 200 OK携带SDP | createAnswer()/setLocalDescription | 返回应答媒体能力描述 |
确认 | ACK | setRemoteDescription(Answer) | 双端达成一致 |
传输信道 | SIP信令(UDP/TCP/TLS) | 自定义信令(WS等) | 承载SDP并驱动协商 |
常见误区澄清
- SDP不是“协议”,而是“会话描述格式”;其本身不负责信令传输。
- SIP是“信令协议”,可在其消息体中承载SDP;WebRTC也可通过自定义信令承载SDP。
- Offer/Answer是协商模型(RFC 3264),既适用于SIP(INVITE/200 OK/ACK),也适用于WebRTC(createOffer/createAnswer)。
- 传输层(RTP/RTCP)与信令层(SIP或自定义信令)分离:前者负责媒体,后者负责协商与路由。
SDP与SIP的互操作(补充)
协议对比表
特性 | WebRTC | SIP | 共同点 |
---|
传输协议 | UDP/TLS/RTP/SAVPF | RTP/AVP | RTP基础(媒体层) |
安全机制 | DTLS强制加密 | 可选TLS | 支持加密 |
NAT穿越 | ICE必需 | 可选STUN/TURN | 网络穿越 |
会话描述 | SDP(格式) | SDP(格式) | 相同内容格式,不同信令承载 |
信令方式 | 自定义(WebSocket等) | SIP协议栈 | 不同实现 |
WebRTC-SIP互操作架构图
graph TB
subgraph "WebRTC端"
W1[Web浏览器] --> W2[WebRTC API]
W2 --> W3[SDP Offer/Answer]
end
subgraph "网关层"
G1[协议转换网关]
G2[SDP格式转换]
G3[媒体中继]
end
subgraph "SIP端"
S1[SIP客户端] --> S2[SIP协议栈]
S2 --> S3[SDP处理]
end
W3 --> G1
G1 --> G2
G2 --> G3
G3 --> S3
G1 -.-> |移除ICE属性| G2
G2 -.-> |调整传输协议| G3
SDP转换对照表
WebRTC属性 | SIP等效 | 转换操作 |
---|
UDP/TLS/RTP/SAVPF | RTP/AVP | 协议名称替换 |
a=ice-ufrag | 无 | 移除属性 |
a=ice-pwd | 无 | 移除属性 |
a=fingerprint | 无 | 移除DTLS指纹 |
a=setup:actpass | 无 | 移除DTLS设置 |
a=mid | 无 | 移除媒体标识 |
应用场景对照表
场景类型 | WebRTC优势 | SIP优势 | 互操作价值 |
---|
企业通信 | 浏览器直接接入 | 成熟PBX系统 | 统一通信平台 |
呼叫中心 | 快速部署 | 稳定可靠 | 混合座席模式 |
移动应用 | 原生集成 | 运营商支持 | 全网互通 |
视频会议 | 多媒体丰富 | 标准兼容 | 跨平台会议 |
SDP调试和优化
常见问题诊断表
问题现象 | 可能原因 | SDP检查点 | 解决方案 |
---|
无音频 | 编解码器不匹配 | a=rtpmap音频部分 | 检查双方支持的音频格式 |
无视频 | 视频格式协商失败 | a=rtpmap视频部分 | 确认VP8/H.264支持 |
连接失败 | ICE协商问题 | a=ice-ufrag/pwd | 检查STUN/TURN配置 |
音质差 | 编解码器选择不当 | 载荷类型顺序 | 调整编解码器优先级 |
延迟高 | 带宽限制 | b=AS带宽行 | 优化带宽设置 |
SDP信令状态流程图
stateDiagram-v2
[*] --> stable: 初始状态
stable --> have_local_offer: createOffer()
have_local_offer --> stable: setRemoteDescription(answer)
stable --> have_remote_offer: setRemoteDescription(offer)
have_remote_offer --> stable: setLocalDescription(answer)
have_local_offer --> have_local_offer: setLocalDescription(offer)
have_remote_offer --> have_remote_offer: setRemoteDescription(offer)
stable --> closed: close()
have_local_offer --> closed: close()
have_remote_offer --> closed: close()
性能优化对照表
优化目标 | SDP调整方法 | 示例配置 | 适用场景 |
---|
降低延迟 | 编解码器优先级 | Opus > PCMU | 实时通话 |
节省带宽 | 限制比特率 | b=AS:500 | 移动网络 |
提高质量 | 高质量编解码器 | H.264 High Profile | 视频会议 |
兼容性 | 基础编解码器 | PCMU/PCMA | 传统系统 |
总结
SDP作为WebRTC的核心协议,不仅负责媒体协商,还为与传统通信系统的互操作提供了基础。理解SDP的工作机制对于:
- 开发稳定的WebRTC应用
- 实现跨协议通信
- 优化音视频质量
- 排查连接问题
都具有重要意义。随着WebRTC技术的发展,SDP协议也在不断演进,开发者需要持续关注相关标准的更新。
评论区
Giscus评论由 Giscus 驱动,基于 GitHub Discussions