天天看點

sip協定

協定一般有兩種格式,文本和二進制,設計消息時以TLV格式為基礎,T消息頭、L消息體長度、V消息體,協定按作用又有信令控制和資料傳輸之分,某些協定可以将控制和資料合為一體,例如RTMP協定,而SIP則是一種文本格式的信令控制協定。

一、基礎

參考RFC3261,SIP協定的功能主要有使用者定位、建立會話、會話管理。

使用者定位:要定位使用者需要知道使用者所在的域(ip:port)。有兩種方法讓上個節點定位到使用者,一是注冊,通過注冊使用者告知上個節點(注冊伺服器或代理伺服器)使用者的ip:port,某些伺服器出于安全需要先配置使用者号碼,這相當于白名單;一種是中繼,通過配置直接在上個節點配置使用者的ip:port,常用于伺服器節點間。

建立會話:SIP英文翻譯就是會話初始協定,invite 100 180 200 ack,這一套信令互動用來建立會話,在UA中,會話存儲了目前通話資訊,以dialog ID作為标記,這個 ID 由 CallID,和一個本地 tag 和遠端 tag 組成,也叫callleg。

會話管理:主要是重新整理會話、終結會話等,通過通話中事務實作,在UA中,事務是邏輯單元,加上事務定時器配合完成某一邏輯功能。确定事務是via頭域的branch參數配合Cseq頭域的方法參數,CANCEL 方法的事務和源請求的事務不同,但是卻有相同的 branch 參數。

常見消息互動

鑒權注冊:register 401/407 register 200,expire為注冊重新整理時間,逾時伺服器會去除登出資訊,斷開會話,為0表示使用者登出

能力查詢:options 200,200攜帶SDP,rtsp協定也有這個消息,也通常用做心跳

取消請求:cancel 200

通知:notify 200,常用來下發業務權限,經常是注冊後由伺服器下發或伺服器收到invite下發,業務權限是xml格式

訂閱:subscribe 200,和notify配合使用,經常是注冊後用戶端發訂閱事件,notify通知事件

建立會話:invite 100 180/183 200 ack,invite,183,200,ack可攜帶SDP,比較特殊多一個ack的确認

終止會話:bye 200

會話重新整理:invite 200 ack/update 200,注意重新整理時間的規定,422應答,重新整理方uac或uas,逾時斷開會話

資訊:info 200

常見頭域

request-line

via

from

to

call-id

cseq

max-forwords

contact

support

require

allow

content-length

應答

1xx,2xx,3xx,4xx,5xx,6xx

Q.850釋放原因值

4xx,5xx,6xx攜帶釋放原因值,表示錯誤原因,用于及時确定錯誤的原因,便于維護。

路由

via

route/record-route

二、擴充

分頭域擴充和消息擴充,參考https://blog.csdn.net/netnote/article/details/3379004

三、協定棧

通常協定棧大緻可分為callleg,transaction,transport,parser加上client和server部分,閱讀協定棧代碼先從client,server,callleg着手,協定棧與應用可通過消息隊列互動,函數調用或回調。SIP協定是非常靈活的,第三方或開源協定棧大多對功能封裝嚴密,不利變通,鼓勵自研協定棧,可以結合協定模闆、消息模闆靈活對接。

接觸的一些協定棧:

freeswitch的sofia-sip,代碼不易閱讀,主要研究nua,學會使用即可。

radvision-sip,商用付費,功能比較簡單,代碼閱讀也不難。

公司自研,代碼條理清晰易懂,功能強大靈活,易擴充。

繼續閱讀