5. 举例
一个客户端要发送一个INVITE消息到一个代理服务器,部分消息如下:
INVITE sip:user@example.com 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:user@example.com 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”赋值。