1. 程式人生 > >To be or not to be,that's a question!

To be or not to be,that's a question!

1. 背景

         SIP提供給客戶端伺服器收到來自客戶端請求的IP地址,這個源IP地址被放在”received”引數中傳送,它 放

於響應的頂端頭欄位中。對NAT穿越有很大作用。

    但有很多情況下,僅一個ip地址資訊還不夠,還有需要埠資訊。於是有了第二步擴充套件,也可以稱作平完善。

2.      引出討論主題:在via頭欄位中增加了一個新的引數”rport”,它允許伺服器迴應客戶端到源ip和埠,類

    似 於”received”,只是它包括的是埠,而received包括的是ip地址。

3.       客戶端行為

1)   客戶端可以包含”rport”引數,但它一定沒有值,作為一個標誌,來向伺服器表明這種擴充套件在傳送資料

    的過程中是被支援的。

2)   Keep binding fresh

     UDP NAT繫結的超時時間是一分鐘,然而,INVITE傳送可能會花費大量的時間去完成,結果可能會導致

迴應被收到前繫結過期,為了保證繫結新鮮,客戶端每20S左右重傳一次INVITE訊息。

3)    重傳週期問題

如果NAT繫結週期大於1分鐘,則客戶端的請求重傳間隔應增大至其一半;

如果NAT繫結週期小於1分鐘,則客戶端的請求重傳間隔應減小至其一半。

4.     伺服器端行為:

   埠號賦值給”rport”,這類似於”received”引數賦值,即使”sent-by”中包括ip。注意這一處理完全獨立於

傳輸協議。

     伺服器端的迴應必須從收到請求的ipport傳送以穿越對稱的NATS,當一個伺服器正在多個埠或者介面

上監聽請求時,它需要記住某個請求是從哪個埠收到的。這對於有狀態的代理來說,事務期間儲存此信

息不成問題。然而,一個無狀態代理並不能儲存請求和響應之間的狀態資訊,因此不能記住所收到請求的ip

port,但為了實現此功能,無狀態代理可以封裝一個請求的目的地址和port到它所插入的via頭欄位中。當

一個響應到達時,它可以提取此資訊並用它來發送回應。

5.      舉例

    一個客戶端要傳送一個INVITE訊息到一個代理伺服器,部分訊息如下:

      INVITE sip:

[email protected] SIP/2.0

Via: SIP/2.0/UDP 10.1.1.1:4540;rport;branch=z9hG4bKkjshdyff

這個INVITE訊息傳送的源埠號是4050,IP是10.1.1.1。這個代理伺服器正在IP為192.0.2.2埠為5060和5070的

地址上監聽請求。由於此請求穿過NAT到代理伺服器,因此源IP顯示的是192.0.2.1,埠號是9988。此代理

伺服器轉發此請求,但必須先追加給”rport”引數一個值,代理要轉發的請求如下:

INVITE sip:[email protected] SIP/2.0

Via: SIP/2.0/UDP proxy.example.com;branch=z9hG4bKkjsh77

Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988;branch=z9hG4bKkjshdyff

     上面請求產生的到達代理的響應如下:

    SIP/2.0 200 OK

    Via: SIP/2.0/UDP proxy.example.com;branch=z9hG4bKkjsh77

    Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988;branch=z9hG4bKkjshdyff

     此代理提取它的via頭欄位的值,一個一個地檢查。它包括了”reveived”引數和”rport”引數。這個伺服器按照規

     則傳送響應到ip為192.0.2.1,port為9988的地址上,並且是必須是從proxy上的192.0.2.2:5060傳送的。

Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988可看作是NAT兩側的ip和port的一個繫結,即

10.1.1.1:4540(內網地址)與192.0.2.1:9988(外網地址)的一個繫結。這樣當響應到達NAT的外網地址

192.0.2.1:9988時,NAT可以改寫目的地址為與之對應的內網地址10.1.1.1:4540,客戶端正在用此地址監聽響

應資訊,從而客戶端最終可收到此響應。

6. 抓包例項:

[15:21:41] ===SIPTransaction Received SIP message (428 bytes) from 222.210.226.30:1068

REGISTER sip:sip1.tv.qualvideo.net SIP/2.0

Via: SIP/2.0/UDP 192.168.1.102:15060;rport;branch=z9hG4bK1041051991

注:客戶端傳送請求時,rport的值必為空。

   [15:21:41] ===SIPTransaction Send SIP message (610 bytes) to 222.210.226.30:1068

   SIP/2.0 401 Unauthorized

   Via:SIP/2.0/UDP 192.168.1.102:15060;rport=1068;branch=z9hG4bK1041051991;received=222.210.226.30

注:伺服器迴應時給”rport”,” received”賦值。


相關推薦

To be or not to be,that's a question!

1. 背景:          SIP提供給客戶端伺服器收到來自客戶端請求的IP地址,這個源IP地址被放在”received”引數中傳送,它 放 於響應的頂端頭欄位中。對NAT穿越有很大作用。     但有很多情況下,僅一個ip地址資訊還不夠,還有需要埠資訊。於是有了第二步

To be or Not to be that is the question

起因:作為一名程式設計師,我很固執想往需求分析、軟體設計方向發展;一直以來想要參加一個完整的專案,感受專案的每個階段的考慮 事件:自己工作的專案雖然蠻大的,但是一直沒法做自己想做的事情。最近發現開源專案是一個不錯的選擇,於是我參加了一個叫“XX“(不方便)的開源專案,我向專案主管(以下簡稱”

【davidsu33的專欄】To be or not to be, It's a problem!!!

Twisted 基於python開發的跨平臺的網路庫,可以說只要是伺服器涉及到的,都可以用。包含http、ftp、mail、ssh、xmpp、irc也包含了底層的通訊庫,包括twisted.basic中的基於位元組或則基於行的通訊。twisted最大的閃光點在於全面,而

to be or not to be, that is a question...

很少釋出負能量的東西,沒地方寫,就放這裡吧。 時間過得夠快的,本科畢業一年了,研究生入學也一年了,今天心情不太好,想總結一下自己在這一年都幹了什麼。 為時一年的雁棲湖集中教學馬上就要結束了,我在努力地回想,除了每天都在寫程式碼,程式碼量確實上去了,但是這一年來好像也沒幹

To be or not to be ...

/* 需求:為檔案建立倒排索引 step1: |--為所有的檔案建立索引號 FileID_Number |--首先查詢到所有的檔案目錄 file.list[] |--將所有的檔案寫到一個檔案索引檔案中 fileIndex.txt

To be or not to beto bebe better

在網際網路的業務系統中,涉及到各種各樣的ID,訂單id,支付id,退款id,下面我一一來列舉一下,不一定全部適合,這些解決方案僅供你參考,或許對你有用。 方案: 1.UUID 演算法的核心思想是結合機器的網絡卡、當地時間、一個隨記數來生成UUID。 優點:本地生成,生成

java中如何將每個單詞的字母反轉,就是將"To be or not to be "變成“oT eb ro ton ot eb”

public static void main(String[] args){ String s = "To be or not to be "; String[] ss = s.split(" "); StringBuilder sb = new Str

PAT 1004 To Fill or Not to Fill (25)

space reac while osi diff font ava possible sso 題目描寫敘述 With highways available, driving a car from Hangzhou to any other city is easy

PAT1092:To Buy or Not to Buy

who ans namespace small 存在 計數 缺失 xtra 長度限制 1092. To Buy or Not to Buy (20) 時間限制 100 ms 內存限制 65536 kB 代碼長度限制 16000 B 判題程序 Standard

1033 To Fill or Not to Fill

erl rom strong put diff 針對 下一個 ont \n PAT A 1033 To Fill or Not to Fill With highways available, driving a car from Hangzhou to any other

HDU-5978 To begin or not to begin

找規律,k為奇數輸出0,k為偶數輸出1 #include <iostream> using namespace std; int main () { int k; while (cin >> k) { if (k&1) cout &

2016 ICPC大連賽區 [Cloned] H - To begin or not to begin

A box contains black balls and a single red ball. Alice and Bob draw balls from this box without replacement, alternating after each draws until t

PAT (Advanced Level) Practice 1092 To Buy or Not to Buy (20 分)

Eva would like to make a string of beads with her favorite colors so she went to a small shop to buy some beads. There were many colorful strings of b

hdu5978 規律 求概率 To begin or not to begin

給k個黑球 1個紅球 先手那個人有優勢 輸  1 先手沒優勢            輸2 先手後手都一樣   輸0 其實如果放回   概率是一樣的 設p為先手贏的概率 1黑1紅    p=1/2  先手抽紅 2黑1紅    p=1/3 + 2/3   *

1033 To Fill or Not to Fill (25 分) 貪心演算法

題目 With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to

2016 ICPC大連賽區 hdu5978 To begin or not to begin

To begin or not to begin Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2

PAT1092 To Buy or Not to Buy (20 分)

1092 To Buy or Not to Buy (20 分) Eva would like to make a string of beads with her favorite colors so she went to a small shop to buy some beads

PAT1033 To Fill or Not to Fill

With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, w

【PAT甲級】1092 To Buy or Not to Buy

Eva would like to make a string of beads with her favorite colors so she went to a small shop to buy some beads. There were many colorful

PAT-ADVANCED1033——To Fill or Not to Fill

題目描述: 題目翻譯: 1033 加油或不加油 有了高速公路,從杭州開車到任何其他城市都很方便。 但由於汽車的油箱容量有限,我們不得不在途中找到加油站。 不同的加油站可能會給不同的價格。 你需要設計最便宜的路線。 輸入格式: 每個輸入檔案包含一個測試用例