1、RTP协议
数据传输协议RTP,用于实时传输数据。RTP全名是Real-time Transport Protocol(实时传输协议)
-
V: RTP协议版本号,2位
-
P: 填充标志,占1位,如果P=1,则在该报文的尾部将填充一个或多个额外的八位组,它们不是有效载荷的一部分
-
X: 扩展标志,占1位
-
CC: CSRC计数器,占 4位,指示CSRC 标识符的个数。主要用于多流组合传播,比如说5个人发送rtp到网关边缘,边缘把5个rtp转发给另外一个边缘,然后解出原始流
-
M: 标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始
-
PT:有效载荷类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等
-
序列号:占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1。接收者通过序列号来检测报文丢失情况,重新排序报文,恢复数据
-
时戳 (Timestamp):占32位,时戳反映了该RTP报文的第一个八位组的采样时刻。接收者使用时戳来计算延迟和延迟抖动,并进行同步控制。
-
同步信源(SSRC)标识符:占32位,用于标识同步信源。该标识符是随机选择的,参加同一视频会议的两个同步信源不能有相同的SSRC。
-
特约信源(CSRC)标识符:每个CSRC标识符占32位,可以有0~15个。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源。
2、wireshark分析RTP流
抓包过滤条件:
ip.src == 192.168.100.97 && ip.dst == 192.168.100.103 && rtp.p_type == 102
抓包分析点:
-
丢包 查看seq是否连续
-
是否有mark位,查看时间戳
-
-
乱序,查看seq
如果不是从建立媒体连接开始抓包,wireshark无法自动进行解包。
需要选中协议包右键手动设置协议格式。
3、SIP协议
SIP(Session Initiation Protocol,会话初始协议)广泛应用于CS(Circuit Switched,电路交换)、NGN(Next Generation Network,下一代网络)以及IMS(IP Multimedia Subsystem,IP多媒体子系统)的网络中,可以支持并应用于语音、视频、数据等多媒体业务
,同时也可以应用于Presence(呈现)、Instant Message(即时消息)等特色业务
会话一般存在2种会话模式:
-
Session Model
-
Pager Model
3.1、 Session Mode
会话中,对于消息内容,大于1300字节时,一般采用Session Model。会话过程:
-
步骤1:
主叫方A
发送INVITE
请求到代理服务器
-
步骤2:
代理服务器
发送100 Trying 响应 主叫方A -
步骤3~6:
代理服务器
搜索被叫方B
的地址,获取地址后转发INVITE请求 -
步骤7~9:
被叫方B
生成的180 振铃响应,返回给主叫方A
-
步骤10~12:
被叫方B
生成的200 OK响应,返回给主叫方A
-
步骤13~17:
主叫方A
收到被叫方B
200 OK响应后,向被叫方B
发送一个ACK,会话建立 -
步骤18~20:会话结束后,任何参与者(A或B)都可以发送一个BYE请求来终止会话
-
步骤21~23:
主叫方A
发送200 OK响应来确认BYE,会话终止
3.2、 Pager Model
-
步骤1:
User1
发送MESSAGE
请求到代理服务器
-
步骤2:
代理服务器
转发User1
的MESSAGE请求给USER2
-
步骤3:
User2
收到User1
的消息后,回复200 OK给代理服务器
-
步骤7~9:
代理服务器
转发200 OK回复给User1
3.3、SIP消息体格式
SIP消息体结构 与 HTTP协议类似,均由3部分组成:
-
请求行(request-line)or 状态行(status-line)
-
消息头(header)
-
正文(body)
请求行request-line
请求行格式:Method Request-URI SIP-Version CRLF 请求行举例:INVITE sip:bob@zte.com SIP/2.0 /r/n
-
Method方法:
Method | 方法说明 |
---|---|
REGISTER | 注册联系信息 |
INVITE | 发起会话请求 |
ACK | INVITE 请求的响应的确认 |
CANCEL | 取消请求 |
BYE | 终结会话 |
OPTIONS | 查询服务器能力 |
MESSAGE | RFC3428对Sip协议的扩展,增加了MESSAGE方法。采用Pager Model进行通信,传递不超过1300字节的数据。MESSAGE方法详细可参考 “SIP-RFC3428” https://tools.ietf.org/html/rfc3428 |
-
Request-URI
指示请求的用户或者服务的地址信息
-
SIP-Version
请求和响应消息都需要包含SIP版本信息
状态行status-line
状态行格式: SIP-Version Status-Code Reason-Phrase CRLF 状态行举例:SIP/2.0 200 OK /r/n
-
Status-Code状态码 状态代码由3位数字组成,表示请求是否被理解或被满足。 状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类
第一个数字有五种可能的取值:
状态码 | 含义 |
---|---|
1xx | 临时响应、表示请求消息正在被处理 |
2xx | 成功响应、表示请求已被成功接收完全理解并接收 |
3xx | 重定向响应、表示需采取进一步完成请求 |
4xx | 客户机错误、表示请求消息中包含语法错误信息或服务器无法完成客户机的请求 |
5xx | 服务器错误、表示服务器无法合法完成请求 |
6xx | 全局故障 、表示任何服务器都无法完成该请求 |
常用的状态码举例:
状态码 | msg | 含义 |
---|---|---|
100 | Trying | 试呼叫 |
180 | Ringing | 振铃 |
181 | Call is、 Being Forwarded | 呼叫正在前转 |
200 | OK | 成功响应 |
302 | Moved Temporarily | 临时迁移 |
400 | Bad Request | 错误请求 |
401 | Unauthorized | 未授权 |
403 | Forbidden | 禁止 |
404 | Not Found | 用户不存在 |
408 | Request Timeout | 请求超时 |
480 | Temporarily Unavailable | 暂时无人接听 |
486 | Busy Here | 线路忙 |
504 | Server Time-out | 服务器超时 |
600 | Busy Everywhere | 全忙 |
消息头 发送MESSAGE消息给user2
MESSAGE sip:user2@domain.com SIP/2.0
Via
Header 字段含义说明:
Header | 含义说明 | 举例 |
---|---|---|
Call-ID | 由本地设备(Client)生成,全局唯一,每次呼叫这个值唯一不变 | Call-ID: asd88asd77a@1.2.3.4 |
From | 表示请求的发起者 | From: sip:user1@domain.com;tag=49583 |
To | 表示请求的接收者 | To: sip:user2@domain.com |
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 |
抓包示例:
TODO:参考博文