SIP协议学习

没有看完,需要的时候再补充

https://sunkx.blog.csdn.net/article/details/144061374

简介

SIP(Session Initiation Protocol, 会话初始化协议)是一个用于在IP网络中建立、修改和终止多媒体会话的应用层协议,广泛应用于VoIP(Voice over IP,语音通信)、视频通话、即时消息和其他实时通信服务。SIP应用层协议。SIP和HTTP类似,都是请求-响应模式。

SIP发展过程:RFC 2543—-第一个SIP规范;RFC 3261—-SIP基础确立;RFC 3262—-对临时响应的可靠性作规定;RFC 3263—-确立SIP代理服务器的定位规则;RFC 3264—-提供提议/应答模型;RFC 3265—-确定具体的事件通知。

SIP协议的基本功能:

  1. 会话建立与终止: SIP的核心功能是发起、管理和终止会话。无论是语音通话、视频会议还是数据共享,SIP都能够提供会话初始化、修改以及结束的能力。
  2. 用户位置定位: SIP可以通过地址解析和位置服务,确定目标用户的当前地址(例如IP地址),使得一个用户可以通过统一的SIP地址(如sip:[email protected])进行联系。
  3. 多媒体传输协商: SIP不仅仅用于建立连接,还可以协商会话的媒体参数。例如,它可以确定使用哪些编解码器,视频分辨率、音频质量等,这些通过SDP(Session Description Protocol, 会话描述协议)进行描述。
  4. 支持会话修改: 在会话进行中,SIP允许动态修改会话内容,例如添加视频、改变音频编解码器、切换通话质量等。
  5. 会话控制与注册: SIP协议允许用户进行注册并通过代理服务器进行会话控制,从而支持分布式网络环境中的通信。

SIP的应用场景:

  1. VoIP电话: SIP是VoIP(基于IP的语音通信)技术的核心协议,用于建立和管理语音通话。通过SIP,用户可以在IP网络上进行语音通信。
  2. 视频会议: SIP不仅支持音频通话,也支持视频通话,通过协商媒体参数,用户可以在不同终端之间进行视频会议。
  3. 即时消息: SIP协议可用于实时聊天应用的消息交换,允许用户之间进行文本聊天。
  4. 多媒体流服务: 除了语音和视频,SIP也可以用于多媒体流的传输和管理,支持多种实时数据传输。

通俗地说,SIP就是用来 建立、管理和结束 语音、视频等实时通信的调度协议。帮助我们通过互联网进行类似电话通话、视频会议、即时消息等实时通讯。例如,当你打电话、视频聊天或者进行网络会议时,SIP协议会负责以下工作:

  1. **连接的建立:**当你想打电话给别人时,SIP负责发出请求,找到对方,并建立连接。
  2. 媒体协商:它确保你和对方都能使用相同的音频/视频格式和传输方式,比如你们都用高清音频、高清视频。
  3. **会话管理:**在通话进行中,SIP还可以帮助你在通话过程中调整设置、。
  4. 会话终止:当通话结束时,SIP会发出通知,关闭连接。

组成部分

学习SIP,需要知道SIP中的四个角色(SIP系统组成部分):SIP用户代理、SIP注册服务器、SIP代理服务器、SIP重定向服务器。

1. SIP用户代理(UA,User Agent) SIP用户代理是终端设备或应用程序,用于发起和接收SIP请求和响应。可以是一个VoIP电话、软电话、视频会议终端等设备。用户代理有两种角色:

用户代理客户端(UAC,User Agent Client):负责发起SIP请求(例如发起呼叫请求)。例如,当你拨打电话时,你的设备就是UAC。 用户代理服务器(UAS,User Agent Server):负责响应SIP请求。它接收来自UAC的请求,并根据请求进行相应的操作。例如,当你接听电话时,你的设备就扮演着UAS的角色。 总之,SIP用户代理是SIP协议中的端点,允许用户进行实时通信。

2. SIP注册服务器(Registrar Server) SIP注册服务器用于接收并存储SIP用户的注册信息。当一个SIP设备(例如电话)连接到网络时,它会向SIP注册服务器发送一个注册请求,告诉服务器自己当前的IP地址或者其他信息。其他用户可以通过注册服务器来找到该设备。

当你在不同的网络或设备上登录时,注册服务器确保其他人能够找到你并与你建立通信。 例如,SIP设备A在启动时会向注册服务器发送一个请求,告知它自己可以接受呼叫的地址或位置。

3. SIP代理服务器(Proxy Server) SIP代理服务器是SIP通信中的中介,它负责转发SIP请求和响应。代理服务器不会直接处理呼叫或会话内容,它主要负责以下任务:

路由请求:当一个SIP用户想要联系另一个SIP用户时,SIP代理服务器会根据请求的目标地址,决定如何转发该请求(例如,选择合适的服务器或代理)。 请求处理:代理服务器会检查和修改请求的头部信息,确保请求按照正确的路径转发。例如,如果目标用户不在线,代理服务器可能会将请求转发到备用服务器或者重定向到另一个地址。 SIP代理服务器通常也会处理认证和授权等功能,确保通信的安全性。

4. SIP重定向服务器(Redirect Server) SIP重定向服务器的作用是告知发起请求的用户代理请求的目标地址。与代理服务器不同,重定向服务器不负责转发请求,它只提供目标地址的重定向信息。它的工作方式是:

当SIP用户尝试联系另一方时,重定向服务器会告知用户代理“该目标用户现在在其他地方”,并提供新的目标地址或位置。发起请求的用户代理会根据这些新的信息重新发起请求,从而完成通信连接。简单来说,重定向服务器只返回一条“指路”的信息,它告诉你该向哪里去找到目标,而不是直接转发请求。

这四个角色如何协同工作? 假设有一个SIP用户A想要与SIP用户B建立通信:

  1. SIP用户A(UAC)和用户B(UAS)都向 SIP注册服务器 发送注册请求,告知服务器它们的当前位置(例如,IP地址)。
  2. 当SIP用户A想打电话给SIP用户B时,它会发送一个SIP请求到 SIP代理服务器,代理服务器负责根据B的地址和注册信息路由请求。
  3. 如果SIP代理服务器找不到SIP用户B,它可能会询问 SIP重定向服务器,后者会告诉代理服务器B的当前位置(例如B的新IP地址)。
  4. SIP代理服务器会根据重定向信息重新发起请求,直到找到B并建立连接。

通过这些角色的协作,SIP协议能够实现跨网络、跨设备的实时通信。

SIP注册服务器、SIP代理服务器和SIP重定向服务器通常可以是独立的服务,也可以由一个中心服务集成来共同承担这些角色。具体的实现方式取决于系统架构、需求和规模等因素。

SIP报文概述

SIP报文格式和HTTP完全一样,只不过里面的值不一样,使用的错误码也是一样,比如200表示请求成功,40x表示客户端错误,50x表示服务端错误,这样SIP就很好理解了。HTTP有GET、POST等方法,同样SIP也有自己的方法。

SIP中常见的方法如下:

1INVITE:表示主叫用户发起会话,邀请其他用户加入一个会话,也可以用在呼叫建立后用于更新会话(此时INVITE又称为Re-invite)
2ACK:客户端向服务器端证实它已经收到了对INVITE请求的最终响应。
3PRACK:表示对1XX响应信息的确认请求消息。
4BYE:表示终止一个已经建立的呼叫。
5CANCEL:表示在收到对请求的最终响应之前取消该请求,对于已完成的请求则无影响。
6REGISTER:表示客户端向SIP服务器端注册列在To字段中的地址信息。
7OPTIONS:表示查询被呼叫的相关信息和功能。

​ SIP常见的错误码如下:

 1100试呼叫(Trying)
 2180振铃(Ringing)
 3181呼叫正在前转(Call is Being Forwarded)
 4200成功响应(OK)
 5302临时迁移(Moved Temporarily)
 6400错误请求(Bad Request)
 7401未授权(Unauthorized)
 8403禁止(Forbidden)
 9404用户不存在(Not Found)
10480暂时无人接听(Temporarily Unavailable)
11486线路忙(Busy Here)
12504服务器超时(Server Time-out)
13600全忙(Busy Everywhere)

SIP交互流程

介绍SIP交互流程之前需要知道SIP有两种会话模式:Session Model和Pager Model。

会话中,对于消息体内容大于1300字节时,一般采用Session Model;对于消息体不大于1300字节时,一般采用Pager Model。

Session Model和Pager Model区别如下:

特点 Session Model Pager Model
通信类型 双向实时通信 单向消息发送
会话持久性 持久的会话,双方可实时互动 息单向发送,接收方可稍后回复
建立过程 需要通过INVITE建立会话 不需要会话建立
实时性 高实时性,需要双方即时响应 较低实时性,接收方可以稍后回复
应用场景 语音、视频通话、实时聊天 短信、电子邮件、离线消息通知

Session Model

0:用户A和用户B在终端启用之后都会向注册服务器注册自己的信息(ip地址、账号等);

1:主叫方A发送INVITE请求到代理服务器1;

2:代理服务器1发送100 Trying响应,试呼叫主叫方A;

3-6:代理服务器搜索被叫方B的地址,获取地址后转发INVITE请求;

7-9:被叫方B生成的180振铃响应,返回给主叫方A;

10-12:被叫方B生成的200 OK响应,返回给主叫方A;

13-17:主叫方A收到被叫方B200 OK响应后,向被叫方B发送一个ACK,会话建立;

开始发送RTP消息流。

18-20:会话结束后,任何参与者(A或B)都可以发送一个bye请求来终止会话;

21-23:主叫方A发送200 OK响应来确认bye,会话终止。

注意:连接建立之后的音视频传输就不经过代理服务器了,是用户之间直接传输(p2p)。

Pager Model

Pager Model采用Message方法,Message方法本身并不建立Dialog,在多数应用中,每条IM消息都是独立的,SIP信令交互流程:用户1发送msg,到proxy,proxy发送msg到用户2,这就收到了;然后收到之后用户2发送”200ok“给proxy,proxy转发给用户1。

Pager Model息单向发送,接收方可稍后回复,所以200 OK是虚线。

SIP信令交互中的3个定义

用户A、B之间SIP信令交互过程中有三个定义:dialog(对话)、session(会话)、transaction(事务)

  • Transaction事务:是指一个请求消息以及这个请求对应的所有响应消息的集合。
  • Dialog对话:是两个UA之间持续一段时间的点对点的SIP连接。
  • Session会话:是一次通信过程中所有参与者之间的关联关系以及他们之间的媒体流的集合。

媒体传输

两个用户进行SIP信令交互的最终目的就是进行音视频通话,因此双方要进行媒体协商,SIP媒体协商使用的是SDP协议。媒体协商完毕之后,双方使用RTP协议进行音视频传输

SDP(Session Description Protocol) 是一种用于描述多媒体会话的格式。主要用于描述会话的多媒体内容(例如音频、视频,以及编码格式)和传输方式(如传输协议、端口号等)。

 1sip呼叫里SDP的一些字段的含义
 2v=0 # sdp版本
 3o=- 1 0 IN IP4 164.135.25.51 # o=<用户名> <会话id> <会话版本> <网络类型><地址类型> <本机地址>
 4s=SNS call # 用于传递会话主题
 5c=IN IP4 164.135.25.51 # 记录media ip, 即接收RTP流的媒体地址,不一定是本机地址
 6t=0 0 # 会话时间,一般由其它信令控制,故0
 7
 8m=audio 30254 RTP/AVP 0 # audio/音频接收端口(必须为偶数)/表示音频通过RTP传输/0表示允许音频的格式(见下一行"a=")
 9a=rtpmap:0 PCMU/8000 # 如果RTP头部的类型字段如果等于0,表示RTP负载用的数据是PCMU,8000采样率格式的音频
10a=sendrecv # 可以接收也可以发送音频
11
12m=video 30186 RTP/AVP 122 123 # video/视频接收端口(必须为偶数)/视频通过RTP传输/122,123表示允许视频的格式为122,123
13a=rtpmap:122 H264/90000 # 如果RTP头部的类型字段如果等于122,表示RTP负载用的数据是H264编码格式的视频
14a=fmtp:122 profle-level-id-64E01F;max-br=1152 # 122类型的视频编码参数
15a=rtpmap:123 H264/90000 # 如果RTP头部的类型字段如果等于123,表示RTP负载用的数据是H264编码格式的视频

SDP是在INVITE开始(SDP offer),对方回复200 OK结束(SDP answer)。

SIP消息Header字段

常见的SIP方法有:INVITE、ACK、PRACK、BYE、CANCEL、REGISTER、OPTIONS。在这些类型的SIP消息头部中包含的常见字段如下表所示:

Header 含义说明 举例
Call-ID 由本地设备(Client)生成,全局唯一,每次呼叫这个值唯一不变 Call-ID: [email protected]
From 表示请求的发起者 From: sip:[email protected];tag=49583
To 表示请求的接收者 To: sip:[email protected]
Via Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路 Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
Max-Forwards 用于表示这个包最多可以传送多少跳,每经过一跳都会减一当Max-Forwards==0系统会返回483。默认为70 Max-Forwards: 70
Contact 包含源的URI信息,用来给响应方直接和源建立连接用 Contact: sip:192.168.100.1:1111
Content-Type 指明消息体的类型 (SDP会话描述协议) Content-Type: text/plain;Content-Type: application/sdp; Content-Type: application/cpim;
Content-Length 指明消息体的字节大小 Content-Length: 18
  • via

    Via头域是收集经过的设备信息。一个SIP消息每经过一个Proxy(包括主叫),都会被加上一个Via头域,当消息到达被叫后,Via头域就记录了请求消息经过的完整路径。被叫将这些Via头域原样copy到响应消息中(包括各Via的参数,以及各Via的顺序),然后下发给第一个Via中的URI,每个Proxy转发响应消息前都会把第一个Via(也就是它自己添加的Via)删除,然后将消息转发给新的第一个Via中的URI,直到消息到达主叫。

  • tag

    用于在SIP消息中的 To 和 From 头部区分和标识不同的参与者。区分同一个会话中不同的SIP实体,尤其是当一个用户(或服务器)有多个可能的通信终端时。Tag 允许SIP协议区分从同一源发起的多个请求,通常是随机字符串或特定标识符。

    From: From: Alice <sip:[email protected]>;tag=client1
    To: To: Bob <sip:[email protected]>;tag=client2
    

    在这个例子中,发起方 Alice 使用了 client1 作为 From 的Tag,接收方 Bob 则使用了 client2 作为 To 的Tag。

    Call-ID、From(tag)、To (tag)这三个字段相同代表是同一个dailog对话。

  • branch

    branch值相同,代表同一个 transaction(事务) Branch,每发起一个transaction(事务)都要重新生成一个branch;对于遵循RFC3261规范的实现,这个branch参数的值必须用magic cookie”z9hG4bK”打头. 其它部分是对“To, From, Call-ID头域和Request-URI”按一定的算法加密后得到。

路由