参考资料:
RFC3261-SIP协议中文版.pdf
SIP是Session Initiation Protocol的简写。SIP是用来创建、修改、删除session的一个应用层协议
SIP协议本身是一个应用层的媒体控制协议,一般用于打电话或多人会议的场景。要明确的是SIP本身并不提供媒体相关的功能,这个功能是由其他协议去完成(比如RTP用于通话)。SIP仅仅提供回话创建的信令控制。

在电话或者会议等场景,媒体交流的前提是信令交互的完成。例如你想向一个人说话的前提是你要明确对方是谁,以及对方在哪里,对方是否原意和你说话。
1 SIP协议简介 - 图1

1 SIP功能介绍

SIP支持从5个方面来建立和关闭媒体流。

  1. 用户定位:这里的定位不是指GPS定位,而是指终端的IP地址信息
  2. 用户可用性:这是是指被叫方是否愿意接受你的呼叫
  3. 用户能力检测:不同的用户能力不同,有些只能语音交流,有些可以视频
  4. 会话初始化:在主叫和被叫之间建立Session
  5. 会话管理:更新session信息,关闭session

SIP协议本身并不能做那么多事情,SIP同时也需要一些其他的协议帮助。例如:

  • RTP 实时传输协议(Real-time Transport Protocol) RFC 1889:负责传输实时数据以及提供QoS反馈。
  • RTSP 实时流协议(Real-time Streaming Protocol) RFC 2326:负责传输流媒体数据
  • SDP 会话描述协议(Session Description Protocol) RFC 2327:负责传递双方的支持哪些媒体编码,使用什么端口传输媒体数据等和媒体描述的信息
  • MEGACO 媒体网关控制协议(Media Gateway Control Protocol) RFC 3015:定义了一些在物理媒体网关上使用的协议。

    2 协议结构

    IP是一个分层的协议。每层之间相互独立,并且每层都有自己的侧重点。
    image.png

    3 信令交互实例

    SIP基于HTTP 请求响应的事务模型。每个事务用一个请求和至少一个响应组成:

1 SIP协议简介 - 图3

  1. A向自己的SIP服务器发起INVITE请求,proxyA的地址一般是软电话上配置的
  2. proxyA回给A 100 Tring, 表示自己正在处理这个请求
  3. proxyA发现自己无法定位B的位置,而把请求发给了proxyB
  4. proxyB立即回给proxyA一个100 Tring, 表示自己正在处理
  5. proxyB在自己的数据库中找到了B的IP地址,然后把INVITE发给B
  6. B收到INVITE之后,回给proxyB 180,表示自己正在响铃
  7. proxyB把180消息转发给了proxyA
  8. proxyA把180消息转发给了A
  9. B回给proxyB 200Ok消息,表示自己接听了电话
  10. proxyB把200消息转发给了proxyA
  11. proxyA把200消息转发给了A
  12. AB双方在200消息之后,已经知道了对方的实际IP地址,A可以直接向B发送ACK消息。在ACK消息之后,AB双方就可以使用媒体流通信了。
  13. B向A发送了BYE消息
  14. A回给200OK表示同意

上面是一个最基本的SIP时序图,而真实的SIP时序图远远比上图要复杂的多。能够看懂时序图,并理解请求以及响应是按照什么规则流动的,是解决SIP问题的关键。