当我们讨论SIP或者SDP的一些技术话题时,SDP的协商是一个绕不过的话题。具体的协商机制涉及了多个方面的内容。在我们的讨论中,笔者将会针对两个比较重要的话题进行讨论,一个是SDP offer/answer 模式,另外一个是在NAT场景中的SDP offer/answer交互模式拓展-ICE。在本章节中,我们将首先讨论SDP offer/answer交互模式,具体内容包括:offer/answer的背景介绍,基本操作,如何实现初始化的offer,重点讨论offer中的单播媒体操作,offer中关于指示方向的处理策略,编码协商优先级设置。在后续的章节中,我们将讨论answer如何回应offer,会话修改的细节处理,向对方指示协商能力,offer/answer交互模式的拓展ICE。
背景介绍和基本操作
首先,我们介绍一下我们讨论的基本背景环境。到目前为止,我们讨论的核心话题涉及了SDP和准备要讨论的offer/anser交互模式。基本上我们都是围绕两个核心的规范来讨论,其中,RFC4566(SDP)为基本蓝图,然后配合RFC3264关于offer/answer交互模式。关于SDP的内容,我们在前面的章节已经有完整的介绍(SDP基础),那个章节涵盖了SDP的核心定义/专有名词,语法,特征属性,使用场景等相关细节,读者可以查阅上一个章节的内容,这里不再赘述。根据上一个章节的内容,我们在本章节进一步讨论SDP协商时使用的交互模式-offer/answer模式。在本章节,我们将重点以RFC3264为蓝本,介绍offer/anwer交互模式。这里提醒读者,为了更好地支持IPv4,在RFC3264的基础上,RFC6157对媒体描述管理进行了更新。因此,如果读者涉及了在IPv6环境中关于SDP中的媒体描述,读者可以查阅RFC 6157-4.1章节的细节。如果读者对SDP协商模式有兴趣的话,可以结合具体的代码示例来做进一步的研究。以下示例是开源SIP协议栈-PJSIP中关于SDP协商状态机的处理流程示意图:
![5469f418523eaa76b97a9da5edd3919f.png](https://i-blog.csdnimg.cn/blog_migrate/609069917afca5feb6ef5be52d1ee26c.jpeg)
PJSIP/SDP协商状态机流程示例
链接:https://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__SDP__NEG.htm#details
很多技术人员,一说到offer/answer交互模式,就不假思索说这个概念其实非常简单。事实上,很多人对此概念有不少误解或者还在半桶水的认知状态。因为很多技术人员经常排除的问题基本上都是一个简单的双方呼叫(单播会话),排查的交互会话描述也就双方的会话参数,并没有涉及到多播会话使用场景,例如IP广播,会议等处理。另外,关于单播和多播场景中的RTP媒体流的处理也非常不同(可参考RFC 6284-7.1.2的端口映射),需要读者对这些概念有一个充分的理解。因此,很多具体的协商需要大家了解。
![cf1afa14151627b9305f3b0968947099.png](https://i-blog.csdnimg.cn/blog_migrate/1d3c9753b59144c54b7cb910cd613f43.jpeg)
此图片以及以下图例均来自互联网资源
我们需要首先提醒读者这些问题,在offer/answer交互模式下,单播会话和多播会话的处理方式是有差别的。SDP(RFC 4566)