這一節將通過乙個簡單的例子來介紹一些基本的 sip 操作。先讓我們來診視下圖展示的兩個使用者**之間的訊息順序。你可以看到伴隨這 rfc3665 描述的會話建立過程還有幾個其它的流程。
我們在這些訊息上標上了序號。在這個例子中使用者 a 使用 ip **向網路上的另外一台ip**發出通話請求。為了完成通話,使用了兩個 sip **。
此圖中的contact應該錯了,contact應該為usera。
第一行是訊息的方法名( the method name)和請求uri(request uri)。接下來是列出的頭域。這個例子包含了所需要的頭的最小集合。我們將在下面簡要的描述這些頭域。
會話的一些細節,像**型別和編碼方式並不是使用 sip 進行描述的。而是使用叫做會話描述協議( sdp rfc2327)來進行描述。 sdp 訊息由 sip 消承載,就像是一封電子郵件的附件一樣。
話機開始並不知道使用者 b 和負責域 b 的伺服器的位置。因此,它向負責 sipa 域的伺服器傳送 invite 訊息請求。傳送位址在使用者 a 的話機中進行設定或通過dns發現。伺服器 sipa.com 也就是我們知道的域 sipa.com 的 sip **伺服器。
過程如下:
** a 定位** b 的方法是向 dns 伺服器( srv 記錄)進行查詢以找到負責sipb 的 sip 域的伺服器位址並將 invite 請求**給它。在向**b傳送 invite 訊息前,** a 將其自己的位址通過 via 頭新增進 invite,invite請求在第乙個via頭域彙總已經有了usera的位址。
** b收到 invite 請求,給**a返回100 trying訊息響應,表明其正在處理這個請求。
** b 查詢自己的位置資料庫以找到使用者 b 的位址,然後將自己的位址也通過via 頭域新增進 invite 訊息傳送給使用者 b 的 ip 位址。(注:此時找到userb的真實ip位址,會將ruri中的位址替換為userb的真實ip位址)。
使用者 b 的話機收到 invite 訊息後開始振鈴。話機為了要表明這種情況(振鈴),傳送回―180 ringing‖響應訊息。
這個訊息以相反的方向路由通過那兩個**伺服器。每乙個**利用 via 頭域來決定向**傳送響應訊息並從頂部將其自己的 via 頭去除。結果就是, 180 ringing 訊息不需要任何的 dns 查詢,不需要定位服務的響應,也不需要任何的狀態處理就能夠返回到使用者那裡。這樣的話,每乙個**伺服器都能夠看到由 invite 開始的所有訊息。
當使用者 a 的話機收到180 ringing響應訊息後開始―回鈴,表明另一端的使用者正在振鈴。一些話機是通過顯示一些資訊進行表示的。
在這個例子中,使用者 b 對對方發起的通話進行了響應。當使用者 b 響應時,話機傳送200 ok響應訊息以表明通話被接起。200 ok的訊息體中包含了會話的描述資訊,這些資訊包括指定了編碼方式,埠號,以及從屬於會話的所有事情。作這項工作的就是 sdp 協議。結果就是,在從 a 到 b( invite)和從 b 到 a( 200 ok)的兩個階段,雙方交換了一些資訊,以一種簡單的請求/響應的模式協商了在這通通話中所需的資源和所需要的能力要求。如果使用者 b 不想得到這通通話或是此刻處於忙線中, 200 ok 將不會發出,取代它的是描述這種狀況(這裡是 486 busy here)的訊息。
第一行是響應碼和描述資訊(ok)。接下來是頭域行。 via, to, from, call-id和 cseq 是從 invite 請求中拷貝的。有三個 via頭,乙個是使用者 a 新增的,另乙個是** a 新增的,最後乙個則是** b 新增的。使用者 b 的 sip 話機在對話的雙方加入了乙個tag引數,這個引數在這通通話的以後的請求和響應訊息中都將出現。
contact頭域中包含了 uri 資訊,這個 uri 資訊是使用者 b 能夠直接被聯絡到他們自己的ip話機的位址。
content-type和content-length頭域給出了關於 sdp頭的一些資訊。而 sdp 頭則包含了用來建立 rtp 會話的**相關的引數。
當userb接聽**後將發生如下事情:
在這個例子中,200 ok訊息通過兩個**伺服器被送回給使用者 a,之後usera的話機停止回鈴,表明通話被接起。
最後使用者 a 向使用者 b 的話機傳送 ack 訊息確認收到了200 ok訊息。當不包含record routing時, ack避開了兩個**伺服器直接傳送給使用者 b。 ack 是 sip 中唯一不需要進行響應的訊息請求。兩端在 invite 的過程中從 contact訊息中了解雙方的位址資訊。也結束了 invite/200 ok/ack 的過程,這個過程也就是我們所熟知的sip三次握手。
這個時候兩個使用者之間開始進行會話,他們以用 sdp 協議協商好的方式來傳送**包。通常這些包是端對端進行傳送的。在會話中,通話方可以通過傳送乙個新的 invite 請求來改變會話的一些特性。這叫做 re-invite。如果 re-invite 不被接受,那麼488 not acceptable her響應就會被發出,但是會話不會因此而失敗。
要結束會話的時候,使用者 b 產生 bye 訊息來中斷通話。這個訊息繞過兩個**伺服器直接路由回使用者 a 的軟**上。
使用者 a 發出200 ok響應訊息以確認收到了 bye 訊息請求,從而結束會話。這裡,不會發出 ack。 ack 只在 invite 請求過程中出現。
有些情況下,在整個會話過程中,對於**伺服器來說,能夠待在訊息傳輸的中間位置來觀察兩端的所有訊息互動是很重要的。如果**伺服器想在invite請求初始化完成後還待在此路徑中,可以在請求訊息中新增record-route頭域。使用者 b 的話機得到了這個訊息,之後在其訊息中也會帶有這個頭,並且會將訊息傳送回**。記錄路由( record routing)在大多數的方案中都會被使用。
sip 註冊流程
基本註冊流程示意圖 註冊流程描述如下 1 sip 向sip伺服器傳送register請求 2 sip伺服器向sip 傳送響應401,並在響應的訊息頭www authenticate欄位中給出適合sip 的認證體制和引數 3 sip 重新向sip伺服器傳送register請求,在請求的authoriz...
SIP對話 事務詳解
1,sip對話的建立 來自於網路 sip對話的建立包括invite request,response,ack。其中response包含臨時響應 1xx response 和最終響應 非1xx response 臨時響應由兩種用途,一是防止uac反 送invite request,這種情況是在使用si...
sip註冊流程 一步一光年 SIP電台閘道器怎麼用?
我們要如何將各種型別的電台接入sip的軟交換網路中,實現voip的語音通話呢?只須要配置德西特sip電台閘道器就可以實現這一功能。這種電台閘道器目前廣泛應用在各種語音融合通訊專案解決方案中。通過簡單的閘道器實現電台的接入,是一種經濟實惠的選擇。如何使用電台閘道器呢?通過專用的定製線纜,將閘道器與電台...