疫情期间,学校停课,北京的学校都在家上网络课堂,大家使用的不是腾讯视频会议便是钉钉视频会议。
疫情对大部分企业都造成了损失,然而视频会议市场却迎来生机。
今天咱们来谈谈视频会议中使用的SIP协议是什么样子的。
咱们立刻用SIP终端发起一个呼叫,然后抓取网络包如下,我们看到它包含很多A:B这种格式的数据,这些就叫SIP Header,和HTTP Header差不多。
下面是发起呼叫的invite SIP消息
INVITE sip:6999 SIP/2.0
From: <sip:112826@136.123.127.49>;tag=1b7ffa38-6800a8c0-13c4-60011-8ca1-5ce4ed6e-8ca1
To: <sip:6999>
Call-ID: 1b855600-6800a8c0-13c4-60011-8ca1-614dc2d0-8ca1
CSeq: 1 INVITE
Via: SIP/2.0/UDP 136.123.127.49:5060;rport;branch=z9hG4bK-8ca1-2255705-7fc7db28-1b7c8d00
Max-Forwards: 70
Supported: replaces,timer,100rel
Allow: INVITE, ACK, BYE, REFER, NOTIFY, INFO, CANCEL
User-Agent: Sherlock 3.2.0.8
Contact: <sip: 112826@136.123.127.49>
Session-Expires: 1800;refresher=uac
咱们再看看被邀请的一方返回的SIP消息
SIP/2.0 200 OK
From: <sip: 112826@136.123.127.49>;tag=1b7ffa38-6800a8c0-13c4-60011-8ca1-5ce4ed6e-8ca1
To: <sip:6999>;tag=7f231e4ff028-e46b820a-13c4-55022-22b3fa-3ca0854f-22b3fa
Call-ID: 1b855600-6800a8c0-13c4-60011-8ca1-614dc2d0-8ca1
CSeq: 1 INVITE
SIP消息包含了很多SIP Headers,它很容易看懂,咱们挑几个看一下
- 1. INVITE sip:6999 SIP/2.0
它的意思是,这是一个invite消息,呼叫的对象是sip:6999,SIP协议版本是2.0
- 2. From: <sip:112826@136.123.127.49>;tag=1b7ffa38-6800a8c0-13c4-60011-8ca1-5ce4ed6e-8ca1
它的意思是这个invite消息来自谁,tag用来标识这个谁
- 3. To: <sip:6999>
它的意思很明显,就是发送给谁
- 4. Call-ID: 1b855600-6800a8c0-13c4-60011-8ca1-614dc2d0-8ca1
它的意思也很明显,就是呼叫的ID,用来标识这次呼叫
- 5. CSeq: 1 INVITE
1 是个序列号,一个对话包含很多请求,一般情况下每次发起一个新的请求,这个序列号会+1
INVITE 这个是请求的名字。
这个CSeq有好几个用途
1) 解决失序问题
比如一个request发送到了远端,远端也有序列号,如果远端发现新过来的request里的序列号比自己的序列号低,就认为这个请求顺序乱了,就会返回一个500的内部错误(Server Internal Error)。
2) 用来区分是新请求还是重新发送的请求
比如re-Invite请求是个新请求,序列号会+1
retransmitted invite就只是重传原来的请求,序号不会+1
远端根据这个序列号就能知道,这是一个新请求,还是重新发送的请求。
3) 用来判断response对应哪个request.
比如UAC先发了一个invite request, 紧接着发送一个cancel request. 这两个request 都可能发送回来200OK response,UAC怎么知道到底这个200OK response是invite request的,还是cancel request的?就靠CSeq里的请求名字。
比如我们前面的例子里的200OK的消息,它里面的CSeq是这样的:
CSeq: 1 INVITE
这说明这个200OK的response是对应invite request的。
是不是很简单,比H323简单多了。现在视频会议大都通过SIP消息来控制会议,H323协议慢慢被淘汰了。
不知道钉钉和腾讯使用什么协议,也有可能是使用自己的私有协议,但最大可能是使用SIP,在网络上抓个包,立刻就能知道了。
Reference: https://tools.ietf.org/html/rfc3261