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。注意這一處理完全獨立於
傳輸協議。
伺服器端的迴應必須從收到請求的ip和port傳送以穿越對稱的NATS,當一個伺服器正在多個埠或者介面
上監聽請求時,它需要記住某個請求是從哪個埠收到的。這對於有狀態的代理來說,事務期間儲存此信
息不成問題。然而,一個無狀態代理並不能儲存請求和響應之間的狀態資訊,因此不能記住所收到請求的ip
和port,但為了實現此功能,無狀態代理可以封裝一個請求的目的地址和port到它所插入的via頭欄位中。當
一個響應到達時,它可以提取此資訊並用它來發送回應。
5. 舉例
一個客戶端要傳送一個INVITE訊息到一個代理伺服器,部分訊息如下:
INVITE sip:
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 be,to be,be 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 加油或不加油 有了高速公路,從杭州開車到任何其他城市都很方便。 但由於汽車的油箱容量有限,我們不得不在途中找到加油站。 不同的加油站可能會給不同的價格。 你需要設計最便宜的路線。 輸入格式: 每個輸入檔案包含一個測試用例