我的音视频/流媒体开源项目(github)
GB28181系列目录
目录
一、SIP报文介绍
二、SIP交互流程:
1、Session Model
2、Pager Model
3、SIP信令交互过程中的3个定义
三、媒体传输(SDP和RTP)
一、SIP报文介绍
这里将会介绍SIP的报文消息格式,请求/响应方法、SIP的信令交互过程。SIP请求和响应消息格式如下图所示:
SIP报文格式和HTTP完全一样,只不过里面的值不一样,使用的错误码也是一样,比如200表示请求成功,40x表示客户端错误,50x表示服务端错误,这样SIP就很好理解了。HTTP有GET、POST等方法,同样SIP也有自己的方法。
SIP中常见的方法如下:
INVITE:表示主叫用户发起会话,邀请其他用户加入一个会话,也可以用在呼叫建立后用于更新会话(此时INVITE又称为Re-invite)
ACK:客户端向服务器端证实它已经收到了对INVITE请求的最终响应。
PRACK:表示对1XX响应信息的确认请求消息。
BYE:表示终止一个已经建立的呼叫。
CANCEL:表示在收到对请求的最终响应之前取消该请求,对于已完成的请求则无影响。
REGISTER:表示客户端向SIP服务器端注册列在To字段中的地址信息。
OPTIONS:表示查询被呼叫的相关信息和功能。
SIP常见的错误码如下:
00试呼叫(Trying)
180振铃(Ringing)
181呼叫正在前转(Call is Being Forwarded)
200成功响应(OK)
302临时迁移(Moved Temporarily)
400错误请求(Bad Request)
401未授权(Unauthorized)
403禁止(Forbidden)
404用户不存在(Not Found)
480暂时无人接听(Temporarily Unavailable)
486线路忙(Busy Here)
504服务器超时(Server Time-out)
600全忙(Busy Everywhere)
二、SIP交互流程:
介绍SIP交互流程之前需要知道SIP有两种会话模式:Session Model和Pager Model。
会话中,对于消息体内容大于1300字节时,一般采用Session Model;对于消息体不大于1300字节时,一般采用Pager Model。
Session Model和Pager Model区别如下:
特点 | Session Model | Pager Model |
通信类型 | 双向实时通信 | 单向消息发送 |
会话持久性 | 持久的会话,双方可实时互动 | 息单向发送,接收方可稍后回复 |
建立过程 | 需要通过INVITE建立会话 | 不需要会话建立 |
实时性 | 高实时性,需要双方即时响应 | 较低实时性,接收方可以稍后回复 |
应用场景 | 语音、视频通话、实时聊天 | 短信、电子邮件、离线消息通知 |
1、Session Model
Session Model下的两个用户通话过程的SIP消息交互如下图:
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,会话建立;
18-20:会话结束后,任何参与者(A或B)都可以发送一个bye请求来终止会话;
21-23:主叫方A发送200 OK响应来确认bye,会话终止。
注意:连接建立之后的音视频传输就不经过代理服务器了,是用户之间直接传输(p2p)。
这期间代理服务器只负责找到用户B并进行消息转发,如果把代理服务器去掉,而是用户A直接向用户B发起呼叫请求,那么流程就比较简单清晰了,如下图所示:
2、Pager Model
Pager Model采用Message方法,Message方法本身并不建立Dialog(Dialog是什么会在后面说明),在多数应用中,每条IM消息都是独立的,SIP信令交互流程如下:
Pager Model息单向发送,接收方可稍后回复,所以上图中200 OK是虚线。
3、SIP信令交互过程中的3个定义
用户A、B之间SIP信令交互过程中有三个定义:dialog(对话)、session(会话)、transaction(事务)
Transaction事务:是指一个请求消息以及这个请求对应的所有响应消息的集合。
Dialog对话:是两个UA之间持续一段时间的点对点的SIP连接。
Session会话:是一次通信过程中所有参与者之间的关联关系以及他们之间的媒体流的集合。
上面介绍了Session Model下的两个用户通话过程的SIP消息交互流程,结合流程图再看dialog(对话)、session(会话)、transaction(事务)就比较容易理解了。
用户A发送INVITE到收到对端的200 OK就是一个Transaction事务,用户B发送BYE到收到对端的200 OK也是一个Transaction事务,即事务就是一个完整的请求-响应过程;用户A和用户B整个通话期间(包括音视频传输过程)就是一个Session会话;用户A和用户B之间的SIP连接就是一个Dialog对话,Dialog是描述两个用户的连接即这个SIP连接的两个用户是谁,和Session不同,Session是描述两个用户的整个通话过程。
三、媒体传输(SDP和RTP)
两个用户进行SIP信令交互的最终目的就是进行音视频通话,因此双方要进行媒体协商,SIP媒体协商使用的是SDP协议。媒体协商完毕之后,双方使用RTP协议进行音视频传输,关于RTP协议可以看我另外一个文章《RTSP系列三:RTP协议介绍》
SDP(Session Description Protocol) 是一种用于描述多媒体会话的格式。主要用于描述会话的多媒体内容(例如音频、视频,以及编码格式)和传输方式(如传输协议、端口号等)。
sip呼叫里SDP的一些字段的含义
v=0 # sdp版本
o=- 1 0 IN IP4 164.135.25.51 # o=<用户名> <会话id> <会话版本> <网络类型><地址类型> <本机地址>
s=SNS call # 用于传递会话主题
c=IN IP4 164.135.25.51 # 记录media ip, 即接收RTP流的媒体地址,不一定是本机地址
t=0 0 # 会话时间,一般由其它信令控制,故0m=audio 30254 RTP/AVP 0 # audio/音频接收端口(必须为偶数)/表示音频通过RTP传输/0表示允许音频的格式(见下一行"a=")
a=rtpmap:0 PCMU/8000 # 如果RTP头部的类型字段如果等于0,表示RTP负载用的数据是PCMU,8000采样率格式的音频
a=sendrecv # 可以接收也可以发送音频m=video 30186 RTP/AVP 122 123 # video/视频接收端口(必须为偶数)/视频通过RTP传输/122,123表示允许视频的格式为122,123
a=rtpmap:122 H264/90000 # 如果RTP头部的类型字段如果等于122,表示RTP负载用的数据是H264编码格式的视频
a=fmtp:122 profle-level-id-64E01F;max-br=1152 # 122类型的视频编码参数
a=rtpmap:123 H264/90000 # 如果RTP头部的类型字段如果等于123,表示RTP负载用的数据是H264编码格式的视频
a=fmtp:123 profile-level-id-42E01F;max-br=1152 # 123类型的视频编码参数
a=sendrecv # 可以接收也可以发送视频
SDP是在什么阶段协商的呢,如下图所示:
SDP协商完毕之后就确定了使用什么方式传输(UDP-RTP/AVP,TCP-RTP/AVP/TCP)使用什么协议传输音视频(RTP),编码格式是什么(H264,PCMU),音视频传输的端口是多少(UDP记录了传输端口,新建UDP socket传输音视频;如果是TCP则不用关心SDP中的端口号,新建TCP socket传输音视频)。
系列三将会详细介绍SIP各种类型消息包含的字段。