SIP穿越NAT的rport
SIP和NAT的基本概念
- SIP是會(huì)話初始協(xié)議,用于建立、修改和終止多媒體會(huì)話,比如VoIP通話。
- NAT是網(wǎng)絡(luò)地址轉(zhuǎn)換,主要解決IPv4地址不足的問(wèn)題,把私有地址轉(zhuǎn)換為公有地址。
- NAT會(huì)給SIP帶來(lái)問(wèn)題,因?yàn)?span>SIP消息中的IP地址和端口可能被NAT改變,導(dǎo)致后續(xù)通信失敗。
rport機(jī)制具體是如何工作的
SIP消息中有Via頭域,用來(lái)記錄請(qǐng)求經(jīng)過(guò)的路徑,以便響應(yīng)能夠正確返回。當(dāng)客戶端在私有網(wǎng)絡(luò)內(nèi),通過(guò)NAT發(fā)送請(qǐng)求到公網(wǎng)服務(wù)器時(shí),Via頭中的端口可能是內(nèi)網(wǎng)端口,而經(jīng)過(guò)NAT后端口會(huì)被轉(zhuǎn)換。服務(wù)器如果直接按Via頭里的端口回復(fù),可能無(wú)法到達(dá)客戶端,因?yàn)?span>NAT外的端口是轉(zhuǎn)換后的。
rport的作用
可能是在Via頭中添加rport參數(shù),讓服務(wù)器知道應(yīng)該使用哪個(gè)端口來(lái)回復(fù)。比如客戶端發(fā)送請(qǐng)求時(shí),在Via頭里加上rport參數(shù),但不指定值,服務(wù)器收到后,會(huì)把響應(yīng)發(fā)送到請(qǐng)求的源地址和端口,并在Via頭里填上rport的值,這樣客戶端就能知道正確的端口了。
具體實(shí)現(xiàn)流程
客戶端發(fā)送INVITE請(qǐng)求,Via頭可能是Via: SIP/2.0/UDP 192.168.1.100:5060;rport。經(jīng)過(guò)NAT后,源地址變成公網(wǎng)IP,比如203.0.113.1:5060,此時(shí)服務(wù)器收到請(qǐng)求,處理后會(huì)發(fā)送響應(yīng)到203.0.113.1:5060,并在Via頭里填上rport=5060
- 客戶端發(fā)送INVITE(內(nèi)網(wǎng)地址):
Via: SIP/2.0/UDP 192.168.1.100:5060;rport
NAT轉(zhuǎn)換:源地址變?yōu)楣W(wǎng)IP(如203.0.113.1:1234)。
- 服務(wù)器處理:
檢測(cè)到rport參數(shù),記錄源地址203.0.113.1和端口1234。
修改Via頭為:Via: SIP/2.0/UDP 192.168.1.100:5060;rport=1234;received=203.0.113.1
服務(wù)器發(fā)送響應(yīng):目標(biāo)地址為203.0.113.1:1234,確保穿越NAT返回客戶端。
- RFC 3581標(biāo)準(zhǔn)
RFC 3581定義了rport和received參數(shù),用于支持對(duì)稱響應(yīng)(Symmetric Response)。
received:記錄請(qǐng)求的源IP(NAT公網(wǎng)IP)。
rport:記錄請(qǐng)求的源端口(NAT映射后的端口)。
通過(guò)rport參數(shù)讓服務(wù)器使用請(qǐng)求的源端口來(lái)發(fā)送響應(yīng),而不是Via頭中指定的端口。這樣即使經(jīng)過(guò)NAT轉(zhuǎn)換,響應(yīng)也能正確到達(dá)客戶端。
rport通常和received參數(shù)一起使用,received參數(shù)記錄請(qǐng)求的源IP地址,而rport記錄源端口。這樣服務(wù)器在響應(yīng)時(shí),使用received中的IP和rport中的端口,確保NAT外的地址正確??蛻舳税l(fā)送請(qǐng)求,Via頭是Via: SIP/2.0/UDP 192.168.1.100:5060;rport。經(jīng)過(guò)NAT后,源地址變?yōu)?03.0.113.1:1234,服務(wù)器收到后,會(huì)在Via頭中添加received=203.0.113.1和rport=1234,然后響應(yīng)發(fā)送到203.0.113.1:1234??蛻舳耸盏巾憫?yīng)后,后續(xù)的消息就可以使用這個(gè)地址和端口,從而穿透NAT。
此外,rport機(jī)制主要處理的是NAT導(dǎo)致的端口改變問(wèn)題,特別是對(duì)于SIP響應(yīng)消息的路徑問(wèn)題。但SIP消息體中可能包含SDP信息,里面也有IP和端口,這需要另外的NAT處理機(jī)制,比如STUN、TURN或ICE,或者使用SIP中的對(duì)稱編碼(如更新SDP中的地址),或者ALG(應(yīng)用層網(wǎng)關(guān))來(lái)修改SDP內(nèi)容。所以rport只是解決Via頭中的響應(yīng)路徑問(wèn)題,而SDP中的地址則需要其他方法解決。