`
jiagou
  • 浏览: 2589083 次
文章分类
社区版块
存档分类
最新评论

Asterisk sip canreinvite

 
阅读更多

Asterisk sip.conf, peer definition: canreinvite option


This peer option in sip.conf is used to tell the Asterisk server to not issue a reinvite to the client unless really necessary. This is used to interoperate with some (buggy) hardware that crashes if we reinvite, such as the common Cisco ATA 186.

When SIP initiates the call, the INVITE message contains the information on where to send the media streams. Asterisk uses itself as the end-points of media streams when setting up the call. Once the call has been accepted, Asterisk sends another (re)INVITE message to the clients with the information necessary to have the two clients send the media streams directly to each other.

  • If one of the clients is configured with canreinvite=NO, Asterisk will not issue a re-invite at all.
  • If the clients use different codecs, Asterisk will not issue a re-invite.
  • If the Dial() command contains ''t'', ''T", "h", "H", "w", "W" or "L" (with multiple arguments) Asterisk will not issue a re-invite.


'canreinvite=no' stops the sending of the (re)INVITEs once the call is established. From messages in the archives and the Asterisk handbook one finds out that the Cisco ATA-186 does not handle the (re)INVITE well. This is necessary if the client and the Asterisk server is on opposite sides of a NAT gateway or firewall.

  • canreinvite = yes "allow RTP media direct"
  • canreinvite = no "deny re-invites"
  • canreinvite = nonat "allow reinvite when local, deny reinvite when NAT"
  • canreinvite = update "use UPDATE instead of INVITE"
  • canreinvite = update,nonat "use UPDATE when local, deny when NAT"


Note: In spite of its name 'canreinvite' being set to 'no' does *NOT* disable all reINVITE operations. It *only* controls Asterisk generating reINVITEs for the specific purpose of setting up a direct media path. If a reINVITE is needed to switch a media stream to inactive (when placed on hold) or to T.38, it will still be done, regardless of this setting!

Migration from Asterisk 1.2 to 1.4: The "canreinvite" option has changed. canreinvite=yes used to disable re-invites if you had NAT=yes. In 1.4, you need to set canreinvite=nonat to disable re-invites when NAT=yes. This is propably what you want. The settings are now: "yes", "no", "nonat", "update". Please consult sip.conf.sample for detailed information.

Notes

  • reinvite=yes/no is plain wrong, even if you see it mentioned in example .conf files. The correct syntax is canreinvite=yes/no
  • Connecting media paths direct to an endpoint behind NAT won't be pretty. Especially if both devices are behind NAT. You might want to try using SER's nathelper in conjunction since nathelper.so can rewrite the SDP so that the private IP addresses are not included in the re-invite.
  • When dtmfmode=rfc2833, asterisk will send the RTP stream through asterisk. With dtmfmode=info canreinvite works properly.

A longer explanation

[Based on a posting to asterisk-users mailing list]

> I've set canreinvite=no on the channel to the SIP provider and it
> immediately worked. O.k., I'm happy about that but I want to
> *understand* what's going on here.
> .
> My setup is:
>
> Asterisk is connected on one side via eth1 to the "outside world" (IP
> adress 81.223.xxx.xxx) and on the other side via eth0 to the internal
> LAN (eth0 has IP 192.168.1.200, SNOM phone has 192.168.1.201, ...).

A good question, for which it's hard to give a short answer :-)

Firstly, you need to understand how SIP itself was designed to set up calls between handsets.

The SIP 'INVITE' message says "I want to set up a call". In the body of this message is a block of SDP (Session Description Protocol) which says "my audio endpoint is IP x.x.x.x port x, and I can use codecs A, B and C".

In the intended architecture of SIP, the INVITE is forwarded via a series of proxies until it reaches the requested destination. The remote end responds with a 200 saying "OK, my audio stream is on IP y.y.y.y port y, and I choose codec B", which is sent back to the first phone. At this point, the first phone starts sending RTP audio packets from x.x.x.x:x to y.y.y.y:y, and the second phone sends them from y.y.y.y:y to x.x.x.x:x. That is, the audio path is direct, whereas the SIP messages went via intervening proxies.

[This is horrendously over-simplified, but it's enough to make the point]

Now, the second thing to understand is that Asterisk is not a SIP proxy, and its default behaviour is to set up the two legs as two separate audio streams: phone X to Asterisk and Asterisk to phone Y. The way this works is:

  • Phone sends INVITE saying "I am on IP x.x.x.x:x, I can use codecs A,B,C"

  • Asterisk decides where the next leg is. If it is another SIP device, it sends a fresh SIP INVITE (with a different Call-Id) to the second phone saying "I am on IP z.z.z.z:z1, I can use codecs C and D" where z.z.z.z is Asterisk's own IP address and :z1 is a port it has chosen.

  • This arrives at the second phone, which says "OK, I am on IP y.y.y.y:y, I choose codec C", and sends it back to Asterisk

  • Asterisk is happy, so it completes the first leg by replying to the first phone "OK, I am on IP z.z.z.z:z2, I choose codec C"


So now the first phone is sending packets between x.x.x.x:x and z.z.z.z:z2, and the second phone is sending packets between y.y.y.y:y and z.z.z.z:z1

This means that Asterisk is in the media path - each RTP packet has to be received and resent, in both directions. On the minus side, this means more workload on the Asterisk server. On the plus side, being in the media stream means that Asterisk can perform a whole bunch of useful voice services - recording, conferencing, call parking, music on hold, even codec conversion (i.e. the stream from phone X to Asterisk can be using one codec, and phone Y to Asterisk a different one)

With me so far?

The third thing to realise is that Asterisk can optimise this out so that the media path is set up directly between the endpoints. This is what it means by "native bridging" - connecting two compatible endpoints directly together, instead of relaying the audio via Asterisk.

So, under the right conditions, the SIP message Asterisk sends to the second phone will contain the IP address of the first phone, and vice versa. This means it looks and smells almost like a SIP proxy.


Note: Asterisk is still really not a SIP proxy in this case. The two legs have different Call-Ids, and so are different SIP calls. However the SDP descriptors for the audio of the two calls point directly at each other.

This short-circuit way of setting up calls was introduced in 1.4; for earlier versions, I believe the call is set up initially as two legs, and then Asterisk reconnects the endpoints directly using a re-INVITE
--> try directrtpsetup=yes



What do I mean by "the right conditions"? Well I'm not sure what the complete set is, but one of those conditions is that both SIP channels must be marked "canreinvite=yes". If either has "canreinvite=no", then Asterisk falls back to the default behaviour of setting up two separate legs.

In your case, you need the default behaviour when calling the provider, because the SIP phone is on a private IP 192.168.1.201, whilst the provider is on a public IP P.P.P.P. If the SIP messages were to try to set up a direct media path between the two it wouldn't work [*]; in particular, there's no point the public SIP provider trying to send an RTP packet to 192.168.1.201, because it won't be able to route to it.

[*] To be fair, if you have a NAT firewall between your internal network and the Internet, then some packets will be able to go directly between your network and the outside world, with the firewall modifying the source IP address and/or port in the process. There are a whole bunch of nasty tricks which can be done, both on the phone and at the provider, which mean that if you are really lucky you can make VoIP work this way. However I recommend you avoid this. You are in the fortunate situation that your Asterisk box has a real public IP address, so make use of it.



The last thing, which took me a while to figure out, is why the option which means "I prefer to use a direct RTP media path" is called "canreinvite=yes".

Even if the normal audio path for a call can be set up with native bridging, Asterisk sometimes needs to be able to re-insert itself into the media path in the middle of a call - to provide services such as music on hold, transfer, parking and so on when they are requested.

The SIP mechanism for this is called re-INVITE. Two phones which are happily talking to each other can have the media stream changed mid-call using this mechanism, so Asterisk can unstitch the direct link and re-connect the two legs to itself.

However, not all phones support this mechanism. If you set canreinvite=no on a SIP channel, it's saying "this phone doesn't support the re-INVITE mechanism for reconnecting the audio mid-call". Asterisk therefore decides that it must insert itself into the media stream for the whole duration of the call, so that it is already there if later on one of the parties requests one of these in-call features.

Hopefully that's enough to answer your question :-) The best way to see what's going on is to look at the SIP/SDP packets themselves, which you can do either using 'sip debug' in Asterisk, or using tcpdump:

#tcpdump-ieth0-n-s0-vudpport5060
#tcpdump-ieth1-n-s0-vudpport5060

With a recent version of tcpdump, the -v option will show you the SIP/SDP payload. If it doesn't, use -X instead (capital X) which will show you hex and ASCII. -s0 means capture the whole packet, and -n means don't try to do reverse DNS lookups on every packet's IP address.

See also

分享到:
评论

相关推荐

    Asterisk服务器之间的互联

    在本文中,我们将深入探讨如何配置两个Asterisk服务器,使它们能够相互通信,从而实现两端的SIP电话互打互通。 首先,我们要了解的是Asterisk服务器间的互联主要是通过SIP(Session Initiation Protocol)协议来...

    Asterisk服务器的搭建与配置.docx

    Asterisk服务器的搭建与配置 Asterisk服务器是一种开源的基于voip的通信服务器软件,可以实现语音通话、视频会议、短信服务等功能。下面是Asterisk服务器的搭建与配置过程。 一、安装Asterisk服务器 首先,需要在...

    Asterisk服务器搭建和配置文档.docx

    sudo vim /etc/asterisk/sip.conf ``` 在文件中添加以下内容: ```plaintext [general] context=default tcpbindaddr=0.0.0.0 tcpenable=yes [1001] type=friend callerid=UserOne secret=1001 host=dynamic ...

    Centos5.8安装asterisk并配置mysql用户表

    然后,在Asterisk配置文件sip.conf中添加用户信息,并使用Mysql数据库连接实现在用户表中的数据。 Asterisk配置 在安装和配置Mysql用户表后,需要配置Asterisk以使用Mysql数据库。可以在sip.conf文件中添加用户...

    Asterisk服务器之间的互联.pdf

    serverA 修改 /etc/asterisk/sip.conf 文件 添加 [ 9901 ] ; 添加用户 serverA 上的 9901 , 9902 , 9903 , 9904 , 9905 用户 type=friend username= 9901 host=dynamic context=default 2 canreinvite=yes

    Asterisk配置.doc

    `host=dynamic`表示IP地址会动态分配,`nat=yes`表明用户位于NAT路由器之后,`canreinvite=no`是因为NAT环境通常不支持reinvite操作。`disallow=all`和`allow=gsm, ulaw, alaw`定义了允许的编码类型,GSM编码占用...

    asterisk安装与配置.pdf

    使用 vim 编辑 `/etc/asterisk/sip.conf` 文件,添加分机配置: `[101]` `;SIP 分机注册账号` `callerid=ABC` `; 分机显示名称(可不设定)` `username=101` `;SIP 再注册时要使用的账号(可不设定)` `type=friend...

    基于USRP1的OpenBTS操作说明

    为了使Asterisk与OpenBTS之间能正确通信,需要编辑`sip.conf`和`extensions.conf`两个配置文件。 **步骤1:修改sip.conf** 打开`sip.conf`文件,并在文件末尾添加如下语句: ```shell [sip.conf] [sip.conf] ...

    Freepbx中各配置文件的介绍关系作用.doc

    sip.conf是Asterisk处理SIP(Session Initiation Protocol)通信的核心配置文件。在FreePBX中,它通常包含了服务器如何与SIP客户端交互的设置。`[general]` 部分定义了全局参数,如`context`,它指定了SIP用户的...

    基于USRP1的OpenBTS操作说明.pdf

    - 修改sip.conf文件时,需要在文件末尾加入手机的IMSI号、callerid、canreinvite、type、allow等参数。 - 修改extensions.conf文件时,需要在文件末尾加入与手机IMSI号相关的拨号扩展信息。 - 完成配置文件修改后...

    trixbox配置

    - `canreinvite`:设置为`yes`。 - `allow`:允许使用的编解码器,如`gsm&ulaw&g729&ilbc&g723`。 - `USER CONTEXT`:填写提供商指定的分机号。 - `USER Details`:重复上述配置信息。 - 完成配置后,点击...

    VOIP-STRUNK-CONFIGURE

    此外,还需设定是否允许重邀请(canreinvite=n)、不安全模式(insecure=port)等参数,以便正确处理呼叫请求。 在Elastix上配置STRUNK同样重要,例如配置回拨STRUNK,其设置与IP-PBX类似,但可能会有不同的编码...

Global site tag (gtag.js) - Google Analytics