疫情期間,學校停課,北京的學校都在家上網絡課堂,大家使用的不是騰訊視頻會議便是釘釘視頻會議。
疫情對大部分企業都造成了損失,然而視頻會議市場卻迎來生機。
今天咱們來談談視頻會議中使用的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