1.總體結構
看了這么長時間的RFC文旦,談談我對SIP協議通信粒度的理解吧,在SIP協議中通信的行為分成了不同的粒度,從小到大分別是點到點的sip消息的傳輸(這點是我自己總結的),sip事務,sip對話以及sip會話。點到點的sip消息的傳輸時sip協議傳輸的最基本的單位,發生在傳輸層(Transport Layer),就是將一個sip message通過udp、tcp或tls等底層協議發送到目的UA(或者Proxy)的傳輸層。事物的粒度在點對點sip消息傳送之上,包含了一系列的sip消息傳輸,事務由一個request、0到多個臨時response以及一到多個最終response組成,表示了一次完整的request-response過程。而對話粒度更大,一次對話從進入early狀態到closed狀態可能包含0到多個事務(對話收到1xx進入early后收到non-2xx的response時會直接進入closed,否則必須經過BYE事務才能進入closed狀態)。對話應該發生在Transaction User層,由用戶控制對話的開始和結束。sip會話表示了若干用戶之間通信的過程,可能包含多個對話過程。
2.事務的狀態機
- INVITE客戶端事務(INVITE Client Transaction)
- 非INVITE客戶端事務(Non-INVITE Client Transaction)
- INVITE服務端事務(INVITE serverTransaction)
- 非INVITE服務端事務(Non-INVITE server Transaction)
3.sip消息與狀態機的匹配
由於在transport層收到的sip消息要交給相應的狀態機來處理,因此在transaction層需用sip消息匹配狀態機的實例,而這個匹配分為兩類:
- 1. UAC事務與response匹配;
- 2. UAS事務與request匹配;
1. UAC事務與response匹配
當UAC發出一個請求時會創建一個相應的事務,假設請求ReqA創建了事務實例TA,之后如果收到了響應RespX,可以通過看RespX是否滿足以下條件來看該響應是否與TA匹配:
- RespX的via頭域最上面的一條的branch參數,與ReqA的via頭域最上一條的branch參數相等;
- RespX的CSeq頭域中的方法(method)與ReqA的CSeq頭域中的方法相同,這是由於cancel請求會創建一個新事務但是卻與要取消的請求有同樣的branch參數;
同時滿足以上兩個條件時,RespX與事務實例TA匹配。
2. UAS事務與request匹配
當UAS收到一個請求時會創建一個相應的事務,假設請求ReqA創建了事務實例TA,之后如果收到了請求ReqX,可以通過看ReqX是否滿足以下條件來看該響應是否與TA匹配:
- ReqX的via頭域最上面的一條的branch參數與ReqA的via頭域最上一條的相等;
- ReqX的via頭域最上面的一條的sent-by的值與ReqA的via頭域最上一條的相等;
- ReqX的CSeq頭域中的方法(method)與ReqA的CSeq頭域中的方法相同;
同時滿足以上三個條件時,ReqX與事務實例TA匹配。