国标Gb28181里Contact和Route的使用

国标Gb28181是基于Sip协议的,因此对Contact和Route的使用,也可以说是Sip里Contact和Route的使用。Contact和Route则是sip协议里的头字段。

现在,在使用国标Gb28181来做项目时,经常会遇到这种情况,国标的下级是在内网里,上级在公网上。如果不做处理,下级到上级会经过nat协议的转换从而导致上级向下级发送请求时(比如获取目录请求)不能到达下级的内网里。这里我们就可以使用Contact和Route来处理这个情况。

这里我们还要先来讲讲使用到via里的rport参数,也就是sip的rport机制,它的作用就是用来穿透nat而存在的。

下级从内网里向公网的上级发送请求时,via里带上rport参数。上级接收到后发现带rport参数,就将此via中加入received参数和rport参数,参数带的值分别是服务端看到的消息来源地址和端口(如果有NAT等地址转换设备,则即为转换后的IP和port,也就是下级的外网地址和端口),这样上级在返回信息时就会使用这个地址和端口来穿透到下级的内网里。

REGISTER sip:41020000002000000001@4102000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.206:5060;rport;branch=z9hG4bK144704899
From: <sip:34020000001320000206@4102000000>;tag=825081266
To: <sip:34020000001320000206@4102000000>
Call-ID: 1058865898
CSeq: 1 REGISTER
Contact: <sip:34020000001320000206@192.168.1.206:5060>
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0

比如上面是一个下级的注册请求,via里带了rport参数。而我们收到这个请求时,根据协议会添加上带值得rport和received,更具体来讲,当你自己实现sip协议时需要来完成这个动作。如果使用的是第三方库,则由第三方库来实现这个动作。比如我用的exosip就会完成这个动作。

REGISTER sip:41020000002000000001@4102000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.206:5060;rport=25540;branch=z9hG4bK248624944;received=222.211.183.144
From: <sip:34020000001320000206@4102000000>;tag=825081266
To: <sip:34020000001320000206@4102000000>
Call-ID: 1058865898
CSeq: 5 REGISTER
Contact: <sip:34020000001320000206@222.211.183.144:25540>
Max-forwards: 70
User-agent: IP Camera
Expires: 0
Content-Length: 0

这里我们通过rport=25540; received=222.211.183.144就知道了下级的映射到外网得地址和端口。

我们知道了这个地址和端口有什么用呢?

1、当我们向下级发送信息时,使用rport received来穿透到下级

2、让下级也知道自己的外网地址。

对于第二点就是在返回信息时,via带上的rport=25540; received=222.211.183.144。如下

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.206:5060;rport=25540;branch=z9hG4bK248624944;received=222.211.183.144
From: <sip:34020000001320000206@4102000000>;tag=825081266
To: <sip:34020000001320000206@4102000000>;tag=365387237
Call-ID: 1058865898
CSeq: 5 REGISTER
User-Agent: XINYU SIP UAS/1.0
WWW-Authenticate: Digest realm="xinyu", nonce="{aee9bab8-7517-40fe-96a0-3f3514f5e771}", algorithm=MD5
Content-Length: 0

好了,通过上面的讲述,我们知道了如何获取外网映射的ip和端口,那么该如何使用呢?

对于下级发起的请求,其实我们还不太在意这个数据,因为上级发送响应时,遵照从哪里来的,发回哪里去的原则(考证一下),自动就把信息从就收的ip端口返回了。

最需要这个的就是上级向下级发起的请求了,上级向下级发起请求是,需要在sip协议里说明该发向哪里,发到下级的内网地址?那肯定是不行的。应该是发到下级的外网映射地址上才是。那我们应该在那个字段来说明这个呢?route字段就派上用场了,我们使用route字段来指明下级的外网映射地址,比如Route: <sip:34020000001320000206@222.211.183.144:25540>,这样sip协议就知道了该向222.211.183.144:25540这里发送数据。但是要说明的是下级收到信息时是看不到Route: <sip:34020000001320000206@222.211.183.144:25540>这个字段的,因为根据sip,一条route被使用后会被删除掉。因为这个路由已经过了通过了嘛。比如:

Via: SIP/2.0/UDP 999.999.999.999:99999;rport;branch=z9hG4bK547986598
Route: <sip:34020000001320000206@4102000000>
From: <sip:41020000002000000001@4102000000>;tag=1527192235
To: <sip:34020000001320000206@4102000000>
Call-ID: 937082210
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: XINYU SIP UAS/1.0
Content-Length:   113

实际发送的时候是,可以看到并没有route字段(exosip实现)

MESSAGE sip:34020000001320000206@222.211.183.144:25540 SIP/2.0
Via: SIP/2.0/UDP 172.22.161.79:15060;rport;branch=z9hG4bK547986598
From: <sip:41020000002000000001@4102000000>;tag=1527192235
To: <sip:34020000001320000206@4102000000>
Call-ID: 937082210
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: XINYU SIP UAS/1.0
Content-Length:   113

以上就是route的使用场景。

contact在何时使用呢?一个典型的是下级在呼叫上级时,比如

REGISTER sip:41020000002000000001@4102000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.206:5060;rport;branch=z9hG4bK1758228297
From: <sip:34020000001320000206@4102000000>;tag=825081266
To: <sip:34020000001320000206@4102000000>
Call-ID: 1058865898
CSeq: 4 REGISTER
Contact: <sip:34020000001320000206@222.211.183.144:25540>
Authorization: Digest username="34020000001320000206", realm="xinyu", nonce="{cde06108-5c2d-4961-b3e1-dd7304415820}", uri="sip:41020000002000000001@4102000000", response="d44dde3717e07505b44977f8e6ad40c6", algorithm=MD5
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0

下级请求时,再如

MESSAGE sip:41020000002000000001@123.56.22.90:15060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.222:5070;rport;branch=z9hG4bK206916016
From: <sip:51020000001310000005@4102000000>;tag=444097513
To: <sip:41020000002000000001@4102000000>
Call-ID: 476580169
CSeq: 246 MESSAGE
Contact: <sip:51020000001310000005@222.211.183.144:26244>
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: hahah
Content-Length:   151

<?xml version="1.0"?>
<Notify>
<CmdType>Keepalive</CmdType>
<SN>43</SN>
<DeviceID>51020000001310000005</DeviceID>
<Status>OK</Status>
</Notify>

这里加上contact,也是告诉对方,你如果想要向我呼叫或请求,可以向我这里说明的地址和端口发送哈。这样上级在请求或主动呼叫时就可以使用这个地址来进行了。比如invite后,想要结束发送bye方法的时候等等。

另外,还可以参看下面的文章

Contact和Record-Route 解释_wwyyxx26的博客-CSDN博客

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值