SIP理论篇07:SDP 与 Offer/Answer 模型详解

一、为什么学 SIP 还必须学 SDP

SIP 负责“建立、修改、终止会话”的信令控制,但它并不直接承载音频或视频媒体流。真正描述媒体参数、编解码能力、端口、地址、方向等信息的,是 SDP(Session Description Protocol)。

因此在很多场景中,SIP 决定“要不要通话”,而 SDP 决定“通话具体怎么传”。

二、SDP 本质上在描述什么

SDP 是一种文本格式的会话描述协议。它重点回答几个问题:

  • 媒体从哪里发、发到哪里
  • 使用什么媒体类型(audio、video 等)
  • 支持哪些编解码能力
  • 媒体方向是什么(sendrecv、sendonly、recvonly、inactive)
  • 是否携带额外属性,如 fmtp、ptime、rtcp-mux 等

三、常见 SDP 字段怎么理解

常见字段包括:

  • v=:版本号
  • o=:会话拥有者与会话标识
  • s=:会话名称
  • c=:连接地址,说明媒体目标地址
  • t=:会话时间范围
  • m=:媒体行,描述媒体类型、端口、传输协议、负载类型
  • a=:属性行,用于扩展编解码、方向、事件、加密等细节

其中最关键的往往是 c=m=,因为它们直接影响媒体往哪里发、用什么端口发。

四、什么是 Offer/Answer 模型

Offer/Answer 是媒体协商的核心模型。它并不是 SIP 独有的概念,而是 SDP 在会话协商中的使用方式。简单说:

  • Offer:一方提出自己希望使用的媒体参数集合
  • Answer:另一方从中选择、拒绝或约束可接受的媒体参数

这套模型让双方不必预先完全一致,只要能找到交集,就能建立可工作的媒体会话。

五、Offer 和 Answer 一般出现在哪

在 SIP 中,Offer/Answer 常见于以下几种模式:

  • INVITE 中带 Offer,200 OK 中带 Answer
  • INVITE 不带 Offer,200 OK 中带 Offer,ACK 中带 Answer
  • 会话建立后,由 re-INVITE 或 UPDATE 再次触发新一轮 Offer/Answer

所以媒体协商不一定只发生在第一次 INVITE,也可能在会话进行中重新发生。

六、编码协商为什么不是“谁想发什么就发什么”

在 SDP 中,媒体能力通常体现在 m= 行的负载类型,以及配套的 a=rtpmap、a=fmtp、a=ptime 等属性里。媒体双方只有在能力集合有交集时,协商才可能成功。

这意味着:

  • 一方支持的编码,另一方未必支持
  • 同一种编码,也可能因为参数不一致而需要额外约束
  • 某些 Payload Type 是静态的,某些是动态映射的

七、媒体方向为什么很重要

SDP 并不只描述“地址和端口”,还会通过 a=sendrecv、a=sendonly、a=recvonly、a=inactive 等方向属性来表达媒体方向性。

例如保留、静音、单向广播、回铃音等场景,都可能与媒体方向协商密切相关。

八、为什么很多“信令通了但没声音”其实是 SDP 问题

在 SIP 排障中,最常见的误区之一就是只盯着 INVITE、200 OK、ACK 是否正常,而忽略其中的 SDP 内容。实际上很多无声、单通、早期媒体失败等问题,都与以下因素有关:

  • c= 地址不可达
  • m= 端口错误
  • 编解码协商没有交集
  • 方向属性不符合预期
  • NAT 导致 SDP 声明地址与真实可达地址不一致

九、Offer/Answer 的核心约束思路

从理论上看,Offer/Answer 不是“双方各说各话”,而是一套带约束的协商机制:

  • Answer 不能凭空创造不在 Offer 中的媒体能力
  • 被拒绝的媒体流通常表现为端口置零等形式
  • 会话中再次修改媒体时,需要重新完成一轮合法的 Offer/Answer

十、总结

如果说 SIP 决定了会话控制的时序,那么 SDP 与 Offer/Answer 决定了媒体协商的内容。理解这两者的关系,可以抓住几个重点:

  • SIP 是控制,SDP 是描述
  • Offer/Answer 是协商模型,不是单个报文名称
  • 媒体问题很多时候本质是 SDP 问题
  • 会话建立后仍然可能再次发生媒体协商

把这一层理解清楚,再去看 NAT、Symmetric RTP、re-INVITE、Early Media 等话题,会顺畅很多。


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇