resip學習筆記(sip訊息的產生和傳送)

2021-08-26 23:05:13 字數 1287 閱讀 7259

本篇博文的目的是告訴大家如何徹底弄清楚resip協議棧的工作流程,resip作為最著名的sip協議棧之一,如果是接觸網路**通訊、網路會議或者是gb28181的同志相當有必要認認真真學習一下resip協議棧。

對於任何乙個sip協議棧的學習我們只要弄清楚下面3點,可以說是已經掌握了這個協議棧的骨架了,先把骨架弄清楚再繼續學習細節一些的知識點,能節省很多精力。

1、sip信令如何產生?

2、sip信令如何傳送?

3、sip信令如何接收,以及接收後怎麼處理?

首先對於第一點 "sip 信令如何產生?"

答:sip信令的是通過dialogusagemanager類產生的。

對於第二點"sip信令如何傳送?",這應該是resip協議棧比較精華的一部分了,我們將會使用較大篇幅來解釋清楚這一點。總的傳送流程歸結如下:

1、將要傳送的訊息放置在transportselector中的fifo中;

2、將上一步fifo中的訊息移動至transport的fifo佇列中;

3、通過自定義機制判斷是否有新訊息需要傳送,如果有,呼叫系統sendto()函式傳送訊息;

上述步驟3中,判斷是否有新訊息需要傳送不是通過系統呼叫select或者epoll探測,而是通過resip自身的機制判斷。(這麼做的原因是系統呼叫多數情況下能夠準確判斷是否有新訊息可收取,但是是否有新訊息可傳送,系統函式沒辦法判斷,因為他們工作在核心態,對使用者態的訊息不會十分清楚),其實這個機制也很簡單,resip協議棧自定義了類似於select的可讀、可寫、異常三個狀態,如果有新訊息產生,就將該狀態設定成可寫,同時呼叫select系統呼叫將系統socket狀態設為可寫(詳見udptransport::updateevents())。至此sip訊息就傳送出去了。下面我們通過三張流程圖徹底體會一下該3步操作:

第一步,將要傳送的訊息放置在transportselector中的fifo中

第二步,將transportselector的fifo中的訊息移動至transport的fifo佇列中:

第三步:呼叫系統sendto()函式傳送訊息

至此我們已經將sip訊息的產生和傳送的大致框架說清楚了,對於sip訊息的接收和接收後的處理,我們放在後續的博文中簡紹。

resip學習筆記(sip訊息的接收與處理)

在簡紹sip訊息的接收與處理之前我先們說一點意外獲取到的資訊 不知正確否?sipstack與dialogusagemanager fifo是其父類transactionuser的成員變數 中各維護乙個fifo但兩個fifo本質上不是同乙個fifo。但是裡面存放的訊息都是同乙個型別,一般情況下要傳送的...

resip學習筆記(訊息路由)

我們知道,sip訊息的格式有很多如 sip 34020000002000000001 192.168.0.1 sip 34020000002000000001 3402000000 當訊息的request line 頭部中網域名稱部分 之後的部分 為ip位址時我們都知道,直接將該訊息傳送至該指定的i...

SIP概述 SIP學習筆記(一)

sip是乙個應用層控制協議,它能建立 修改和終止多 會話 會議 sip透明的支援名字對映和重定向服務。sip支援建立和終止多 通訊的5個方面 1 使用者位置 確定用於通訊的終端系統 2 使用者可用性 確定被呼叫者參加通訊的意願 3 使用者能力 確定使用的 和 引數 一般結合sdp 4 會話建立 響鈴...