VoIP的落地通信模型和要考虑几个大的方面问题及基本概念和交互流程整理

编程知识 更新时间:2023-04-28 13:32:48

目录

一、VoIP的落地通信模型和要考虑几个大的方面问题... 1

关于SIP NAT防火墙穿越的汇总... 2

2.1 ALG(Application Level Gateway)... 3

2.2 MidCom(IETF MIDCOM(Middlebox Communications)... 3

2.3 STUN(Simple Traversalof UDP Through Network). 3

2.4 SBC(Session Border Controller). 3

3.2 实例 rport方式主要是对sip信令中Via字头的扩展,不过同时也要求SIP Proxy支持该功能。 NAT之后的sip client在发送请求的时候在via字头中添加rport字段... 4

网络延时,抖动,丢包对voip和视频业务QoS的影响... 6

二、工具:... 7

三、sip相关基本概念理解... 8

0、SIP协议功能概况... 8

1、什么是Outbound proxy(外出代理服务器)?应当设置Outbound proxy 吗?... 11

2、用户ID(User ID)和认证ID(Authentication ID)有什么区别?... 11

3、应当选用哪种语音编码方法?... 11

4、Voice_Frames_Per_TX是什么意思?它与以太网的流量有什么关系?... 12

5、Voice_Frames_Per_TX应当设置为什么值?... 12

6、以太网加到RTP数据包上的开销是多少?... 13

7、各种编码方法的帧的速率及比特速率是多少?... 13

9、什么是STUN服务,我是否需要使用STUN服务?... 13

10、如果我的电话机使用了STUN服务,能够正常地工作,我还需要设置外出代理服务器(Outbound proxy)吗?     14

四、SIP的基础数据包中项的含义... 15

(1)Request-URI:呼叫请求发送地址,UA生成初始请求消息时,该域中的消息一般与TO中的地址相同,经过网络服务器后,由于实际路由问题,该值可能发生变化;... 15

(2)From:发起请求方的地址,一般采用USERINFO@HOSTPOST形式,tag参数为随机产生的整数。     16

(3)To:接受方地址,采用USERINFO@HOSTPOST形式,当该域存在于最终响应消息中时,将会有tag参数。... 16

(4)Call-ID:识别呼叫参数,在同一个DIALOG中,该参数不发生变化,该参数与From中的tag参数、To域中的tag参数相结合用以保证呼叫的唯一性。... 16

(5)CSeq:表征transaction的参数,由于同一个呼叫中会存在多个transaction,因此通过该参数来保证同一个UA发送的不同请求消息间的顺序。... 16

(6)Via:表征呼叫经过的路径,UA生成SIP消息时,会在该域中填写自己的地址;proxy在转发请求消息时,将会增加一个填有自己地址的Via域,表示经过本proxy。Via域的存在可以保证响应消息按照原路径返回到主叫方,代理服务器用它检查其内容,如果新端点已出现在Via列表中,则表示有环路了。     16

(7)Contact:告知对端自己的地址,当对端发送下一个请求消息时,可直接向该地址发送,不需要关心前一个路由信息(除非有特定原则,例如PROXY可以通过RECORD-ROUTE域来保证下一个请求消息必须经过本PROXY,即使CONTACT域中填写对端客户的地址)。... 16

(8)Expires:给出消息内容超期的时间。... 16

(9)Max-Forwards:用来限制请求到他的目的地中间的跳转,包含一个每隔一个跳转就自动减一的数字,如果Max-Forwards在到达目的之前就减到0,他会报告一个483(太多的路由)错误回应。     16

(10)Require :UAC通过Require字段列出的选项标签,告知UAS处理请求时需要支持的选项。     16

(11)Record-Route:由于CONTACT域的存在使得两个用户后续的请求消息可能不经过PROXY,为了运营需要,PROXY在初始INVITE消息中增加了RECORD-ROUTE域,这样可以保证后续请求(例如BYE消息)经过PROXY.通过RECORD-ROUTE与CONTACT的结合,既可避免后续请求旁路网络服务器的行为,又可减少后续请求路径上的环节。... 16

(12)Content-Length头域用来确定每一个SIP消息在通讯流中的结束位置的。... 16

(13)SIP应答头... 18

SIP: From ,Contact, Via Record-Route/Route head. 20

ptime指示接受的打包间隔,但并不要求双方的ptime值一致。但发送媒体流时应该按照ptime指示的打包间隔来发送。... 21

为了控制通过re-INVITE和UPDATE方法进行周期性的会话(session)刷新,以判别会话两端是否存活,增加了两个头域:Session-Expires(会话的生命期)和Min-SE(会话时钟的最小值) 其中Min-SE头域中的值只能增加不能减少,Session-Expires头域的值只能减少不能增加,但不能少于Min-SE头域中的值     21

五、SIP交互流程详解... 21

1、SIP注册... 21

1 构造一个REGISTER请求... 21

2 处理REGISTER请求... 24

2、基本呼叫建立过程... 25

3、会话更改流程      用户代理服务端向用户代理客户端发送Invite消息,带有新的SDP协商信息;     26

4、正常呼叫释放过程  主叫用户挂机后... 27

5、被叫忙呼叫释放    呼叫请求送到被叫终端代理B后,被叫忙... 27

6、被叫无应答流程一  被叫久振铃无应答,终端代理A判断超时... 28

7、被叫无应答流程二  被叫久振铃无应答,终端代理B判断超时后... 29

8、遇忙呼叫前转流程  终端代理B忙线中,代理服务器对此呼叫进行前转,向终端代理C发送Invite请求消息     30

9、无应答呼叫前转    被叫久振铃无应答,代理服务器判断超时后,向终端代理B送Cancel消息放弃该呼叫,代理服务器对此呼叫进行前转,向终端代理C发送Invite请求消息;... 31

10、呼叫保持         被叫用户摘机,代理终端向代理服务器发送Reinvite请求消息     33

11、呼叫等待         用户A,B正处于通话阶段,用户C向A发起呼叫,然后B保持,A和C通话。     33

SIP中的DNS过程... 35

1.1.SIP消息涉及的DNS过程... 35

1.2.如何发送SIP请求消息... 35

1.3.如何发送响应消息... 36

虚拟号/转接号/Sip号码... 36

产品参考... 37

参考:... 37

 

怎样才能实现SIP协议来拨打落地电话?

https://www.zhihu/question/23474774

已经实现了SIP协议的VOIP软电话,用 kamailio 搭建的,实现了PC to Phone,Photo to Phone。现在是想实现Skype、爱聊、有信一类的网络电话,现在问题是怎么才能打通传统的座机和手机落地电话(PSTN)?跟运营商合作么?如果拨打全球电话的话,怎么实现?

一、VoIP的落地通信模型和要考虑几个大的方面问题

软终端→SIP server→语音网关→运营商中继→PSTN终端


 

VoIP 语音网关能够连接传统PSTN网络与IP网络,他是将传统电信网络的和话音流量转化为IP网络的数据流量的设备,并且提供双向的连接,既可以就收传统电信 网络并转发到IP网络,同时也能够将IP网络的拨号连接到传统网络;

IP PBX也是VoIP中常见的设备IP PBX就是在传统PBX基础上多了通往IP网络的通道,即使用因特网协议传送语音电话。目前主要有托管 IP PBX和虚拟IP PBX

 

所以,你缺语音网关,严格而言是语音网关或者会话边界控制器。具体用什么设备完全取决于中继线路类型,我简单写个对照表:

  1.  
  2.  
  3.  

      4.SIP中继线路:一般是第三方代理提供的虚拟中继线,部分地区的运营商也会直接提供,其实就是一个IP地址,用于让你的SIP server或网关设备与该IP地址做SIP Trunk;

上面四种方案,考虑到你的实际情况,第4种是最快最方便成本最低的实现线路落地的方案.,前三种都需要购买硬件设备放置在你的机房或者托管机房,第四种是可能不需要购买设备的,为什么是可能,而不是确定呢?因为要看你的具体sip server是否可以允许直接访问到对方提供的虚拟线路的IP地址,具体而言不展开了,可以跟线路运营商沟通,对方会帮你出对接方案的。


 

如果想真的在VoIP领域研究深点,并实现各种实际生产环境下应用的话,这是远远不够的。至少你还要考虑几个大的方面问题:

一、VoIP的NAT穿透问题!比如多层网络的复杂NAT。

二、VoIP的安全防护问题!怎么防止恶意扫描,sip洪水攻击等,客户端如果在公网下,如何解决向sip server的正常注册和发起呼叫?

三、用户端要不要支持webrtc?比较前沿了。

四、应用层的会话负载均衡等等问题……

 

 

 

关于SIP NAT防火墙穿越的汇总

 

1.SIP中的rport机制-NAT网络地址转换

NAT:网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。

NAT常用的分类如下:

Full Cone NAT(完全圆锥型) 会将客户机地址{X:y}转换成公网地址{A:b}并绑定。任何包都可以通过地址{A:b}送到客户主机的{X:y}地址上。

Address Restricted Cone NAT(地址限制圆锥型 )  会将客户机地址{X:y}转换成公网地址{A:b}并绑定,只有来自主机{P}的包才能和主机{X:y}通信

Port Restricted Cone NAT(端口限制圆锥型会将客户机地址{X:y}转换成公网地址{A:b}并绑定,只有来自主机{P,q}的包才能和主机{X:y}通信。

Symmetric NAT(对称型)   会将客户机地址{X:y}转换成公网地址{A:b}并绑定为{X:y}|{A:b}<->{P:q}。对称型NAT只接受来自{P:q}incoming packet,将它转给{X:y} ,每次客户机请求一个不同的公网地址和端口,NAT会新分配一个端口号{C,d} 

 

 SIP Proxy无法穿过NAT回送SIP信令

因为SIP信令中的FromContact头域记录的是私网地址和端口,NAT无法识别和转换。如图所示:

 

2.NAT的常用解决方案

2.1 ALGApplication Level Gateway

可以识别SIP信令,能够适当地修改数据包。ALG可以是单独的连接于外网和内网之间的设备,也可以是内置于防火墙内的插件。

FW/NAT发现外网呼叫信令为SIP,将其转发到ALG(应用层网关),通过ALG建立起内网伪地址终端与外网终端的通信连接。

使用ALG需要对现有设备升级改造。例如思科的路由器都支持配置ALG

 

2.2 MidComIETF MIDCOM(Middlebox Communications

允许第三方(MIDCOM Agent )成为受FW/NAT信任的实体,然后代表FW/NAT做出决定,强迫其开放端口传送媒体流或数据流。这些受信任的实体通过“MidCom”定义的新协议与FW/NAT进行通信。

协议的识别不由Middlebox完成,而是由外部的MIDCOM Agent完成。

使用MidCom需要对现有设备升级改造

 

2.3 STUN(Simple Traversalof UDP Through Network)

 

   IETF RFC 3489定义了如何确定由NAT分配的公网地址和端口,不需要改造现有NAT

主要特色

能够让客户端发现NAT的存在以及类型;

能够让客户端发现NAT的绑定生命周期;

可以工作在多NAT串联环境下;

非常简单的协议,易于实现,负载低;

l STUN服务器可以位于公网任何地方。

适用范围

不适用于Symmetric NAT

对于Non- Symmetric NAT都适用;

如果双方都位于同一个NAT之后,就不适用。

 

2.4 SBC(Session Border Controller)

             
    l 
Signaling Solution

SBC可以帮助SIP信令穿越已经存在的FW/NAT,而不需要对现有的FW/NAT设备做任何改变;

对于SIP终端,SIP终端设备会周期性发送注册消息到SBC。  为了控制通过re-INVITEUPDATE方法进行周期性的会话(session)刷新,以判别会话两端是否存活为了保持这个绑定,客户端应该在每隔20s左右重发INVITE请求,这种重发机制需要发生在收到一个临时的响应后。大多数的NAT绑定有超过1分钟的超时时间

Media Traversal Solution

SBC可以把相应的媒体流发送到防火墙上的相关IP地址和端口,然后正确地使媒体流到达防火墙后的用户侧。

为了穿越对称性的对称性的NAT,响应需要发送到相同的IP地址和端口。当服务器在多端口或接口的请求上监听请求时,它必须记住请求是从何处发的。对一个稳定的Proxy,在一个传输的持续时间中,记住这些东西是没有问题的。但是对于不稳定的Proxy,它不存储请求和响应中的状态信息,为了达到本规范的要求,它需要将地址和端口信息加密到Via头字段中,在响应信息到达的时候,它能提取加密的信息并将它放到响应中。

rport机制需要终端支持该种机制,因此应用情况比较受限。但是在笔者的应用场景(呼叫中心)中,主要要解决的问题是坐席能在NAT环境中穿越,给服务器发送信息。因为坐席所使用的SIP软电话是本公司开发的,所以可以保证是支持rportreceived的。

 

3.2 实例 rport方式主要是对sip信令中Via字头的扩展,不过同时也要求SIP Proxy支持该功能。
NAT之后的sip client在发送请求的时候在via字头中添加rport字段

下面举一个发送REGISTER信息的实例,在请求信息的Via头中包含了没有值的rport参数,如下所示:

  REGISTER sip:  124.40  .  120.188  :  5060   SIP  /  2.0
Via: SIP/ 
 2.0  /  UDP   124.42  .  4.203  :  15500  ;branch  =  z9hG4bK  -  d8754z  -  1049ed261d2e643d  -  1  ---  d8754z  -;rport
Max 
 -  Forwards:   70
Contact: < 
 sip:  19988888888  @  192.168  .  2.65  :  12344  ;rinstance  =  7cd1c532e92fdb0e  >  ;expires  =  
To: "  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >
From: " 
 19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >  ;tag  =203ba359
Call  -ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq:   1 REGISTER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User 
 -  Agent: eyeBeam release 1105a stamp   56793
Content- 
 Length: 

    发送到的服务器支持rport机制,它看到请求中的rport后,将通过分析UDP包信息得到的的NAT的公网地址(124.42.4.203)和端口信息(15500)分别作为receivedrport属性带给客户端:

  SIP  /  2.0     200   OK
Via: SIP
  /  2.0  /  UDP   124.42  .  4.203  :  15500  ;branch  =  z9hG4bK  -  d8754z  -  1049ed261d2e643d  -  1  ---  d8754z  - ;rport  =  15500 ;received  =  124.42  .  4.203  
From:   "  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >  ;tag  =  203ba359
To: 
  "  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >  ;tag  =  0005  -  058  -  7d6dc90516ae2e21
Call
  -  ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 
  4   REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: 
  <  sip:  124.40  .  120.188  :  5060  >  
Content  -  Length: 

   客户端在得到响应信息后,知道了所使用的公网地址和端口,在而后定期重发的REGISTER信息中,Contact变换成124.42.4.203: 15500,例如新发的REGISTER信息变为:

  REGISTER sip:  124.40  .  120.188  :  5060   SIP  /  2.0  
Via: SIP  /  2.0  /  UDP   124.42  .  4.203  :  15500  ;branch  =  z9hG4bK  -  d8754z  -  1049ed261d2e643d  -  1  ---  d8754z  - ;rport
Max  -  Forwards:   70  
Contact:   <  sip:  19988888888  @  124.42   4.203  :   15500  ;rinstance  =  7cd1c532e92fdb0e  >  ;expires  =  
To:   "  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >  
From:   "  19988888888  "  <  sip:  19988888888  @  124.40  .  120.188  :  5060  >  ;tag  =  203ba359
Call
  -  ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 
  2   REGISTER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User
  -  Agent: eyeBeam release 1105a stamp   56793  
 

Content - Length: 
 

rport方式主要是对sip信令中Via字头的扩展,不过同时也要求SIP Proxy支持该功能。
NAT之后的sip client在发送请求的时候在via字头中添加rport字段,该消息经发出后路由到SIP ProxySIP Proxy通过检查消息的源地址和Via字段中的地址,得知该client处于NAT之后,并且基于已有的rport,将消息的真实地址即公网上的地址通过receivedrport字段返回给client端,这样client就知道自己真实的公网地址,可以解决信令穿越的问题

 

 

 

结论:

客户端解决方案,虽然无需对现有NAT做任何改动,但对SIPUA的要求较高,需要支持相应的协议,而且到目前为止还无法解决通信双方均处在对称性NAT的情况;

 

路由边界的各种解决方案,均需要对NAT设备升级,但目前网络实际已部署了大量的不支持相关特性的NAT设备,因而这种方式可行性较差;

 

服务器端解决方案,通过中继RTP数据包来解决所有类型NAT的穿越,缺点就是增加了包的时延和丢包的可能性。

 

具体采用哪种方式解决SIP 防火墙问题需要从以下角度进行综合考虑:

(1)升级要求:我们只能接受小规模的改造,所以只考虑对服务器端的改造,在极小一部分用户这边考虑一些客户端改造,不考虑更换边缘设备的解决方案;

(2)网络业务量:我们的网络业务量很大,所以要考虑好大业务量下的问题;

(3)语音质量:此解决方案是否影响语音质量,增加时延或丢包率;

(4)运营投资:运营是否随着规模增大,需要做大量投资;

(5)客户投资:客户是否需要做投资;

(6)兼容性:此解决方案是否只能在特定环境下生效,是否可以支持各种应用方案,是否可以穿越各种NAT和防火墙;

(7)扩展性:此方案是否支持大规模应用。

接触到的所有产品情况

PortaSIP内置B2BUA,可以满足我们的要求;

Cisco SIP Proxy Server无支持,需要自己架设STUN以及Outbound Proxy服务器,是否能够满足需要调研;

Nortel需要加Nortel专有的RTP proxy(使用RTP中继方式实现),满足我们的要求;

华为的解决方案是使用ALG防火墙,满足我们的要求,但需要做一些边缘设备的升级;

我们自己的试验平台,只能使用STUN或者Outbound Proxy。

SER,可以在PortaOne网站免费下载PortaOne nathelper RTP proxy来解决这个问题(使用RTP中继方式实现)。

 

网络延时,抖动,丢包对voip和视频业务QoS的影响

 NGN是下一代电信网的发展趋势,

IPQoS与安全问题成为其最终能否承担起这个历史使命的最大悬念。 需要承载网能够提供电信级的QoS与安全。

 NGN承载网的QoS考虑

考虑承载网的QoS问题,首先必须搞清楚影响VoIP QoS的几个重要因素。

2.1 时延

  由于当前IP分组网的固有特性和低比特话音编解码器的使用,使得VoIP语音分组的端到端时延要比电路交换网中的时延大得多,组成部分也更为复杂, VoIP应用中网络通信结构和底层传输协议的多样性,决定了时延成分的多样性。

   端到端的时延可以分成两个部分,即固定时延和可变时延。固定时延包括编解码器引入的时延和打包时延。固定时延和采用的压缩算法、打包的语音数据量相关。可变时延包括:承载网上的传输、节点中排队、服务处理时延、去抖动时延,这些和设备的端口速率,网络的负载情况,经过的网络路径、设备对QoS的支持方式、实现的QoS算法等密切相关。特别是去抖时延和承载网络的抖动指标密切相关,通过采用合适的网络技术可以显著降低语音通过网络时引入的抖动,减少去抖动时延。

  IP网中话音分组的端到端时延,150ms以下的时延,对于大多数应用来说是可接受的;150400ms之间的时延,在用户预知时延状况的前提下可以接受;大于400ms的时延不可接受。

  目前,不同级别的网络设备,在正常情况下的数据包处理时延为几十微秒到几毫秒,能够满足单跳时延要求,但承载网的跳数设计不能超过以上端到端的的时延要求,而且跳数越少越好。

2.2 抖动

  根据实际测量发现,抖动大于500ms是不可接收的,而抖动达到300ms时,是可以接受的,此时为了消除抖动会引起较大的时延,综合时延对语音质量的影响来考虑,要求承载网的抖动小于80ms

  抖动会引起端到端的时延增加,会引起语音质量的降低。影响抖动的因素一般和网络的拥塞程度相关。网络节点流量超忙,数据包在各节点缓存时间过长,使得到达速率变化较大。由于语音同数据在同一条物理线路上传输,语音包通常会由于数据包的突发性而导致阻塞。

2.3 丢包率

  丢包对VoIP语音质量的影响较大,当丢包率大于10%时,已不能接受,而在丢包率为5%时,基本可以接受。因此,要求IP承载网的丢包率小于5%

  丢包率的形成原因主要有两点,一是传统IP传输过程中的误码,这种情况在目前的网络条件下发生的概率极低。另一个是不能保障业务带宽造成的,当网络流量越拥塞,影响就越强烈,丢包发生率也就越大。

 

 

根据经验,这3个指标中,任何一个超标,都不可以安装用户端,否则通话质量就没有保障:

丢包率:小于8%

延时:小于200ms

抖动:正负不大于40ms

 

二、工具: 

SIPp是一个测试SIP协议性能的工具软件。这是一个GPL的开放源码软件。   sipp是安装在linux机器上的

   SIPp可以用来测试许多真实的SIP设备,如SIP代理,B2BUAs,SIP媒体服务器,SIP/x网关,SIP PBX,等等,它也可以模仿上千个SIP代理呼叫你的SIP系统。 

SIPp的网址:http://sipp.sourceforge/ 

如何编写场景xml文件: http://blog.chinaunix/uid-20069582-id-227904.html 

如何使用SIPp进行压力测试: http://blog.chinaunix/uid-20069582-id-227905.html 

SIPp 使用手册中文版: http://sipp.sourceforge/doc/cn-reference.pdf 

sipp工具的使用--简单的呼叫测试https://blog.csdn/qq_30615731/article/details/81298637


 

SIP压力测试/DOS攻击利器 http://startrinity/VoIP/SipTester/SipTester.aspx   支持通过CallXML脚本来定制呼叫流程。


 

Cisco SIP支持的标准

https://search.cisco/search?query=Cisco%20IOS%20SIP%20Voice%20Configuration%20Guide&locale=enUS&tab=Cisco

How To Debug and Troubleshoot VOIPhttps://blog.csdn/blade2001/article/details/51674285

 

10款国外免费VoIP服务https://blog.csdn/blade2001/article/details/7088687

 

 

 

 

三、sip相关基本概念理解

 

0、SIP协议功能概况

会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始、管理和终止网络中的语音和视频会话,具体地说就是用来生成、修改和终结一个或多个参与者之间的会话。SIP的业务模式是一个点对点协议,其中有两个要素——SIP用户代理和SIP网络服务器。用户代理是呼叫的终端系统元素而SIP服务器是处理与多个呼叫相关联信令的网络设备。用户代理本身具有一客户机元素(用户代理客户机UAC)和一服务器元素(用户代理服务器UAS)因为所有SIP用户代理都充当客户端和服务器客户机元素初始呼叫而服务器元素应答呼叫。这允许点到点的呼叫通过客户机-服务器协议来完成。

 

SIP(会话初始协议)和这些协议一样,同样允许使用Internet端点(用户代理)来寻找参与者并且允许建立一个可共享的会话描述。为了能够定位精确的会话参与者,并且也为了其他的目的,SIP允许创建基础的network hosts(叫做代理服务器),并且允许终端用户注册上去,发出会话邀请,或者发出其他请求。SIP是一个轻形的,多用途的工具,可以用来创建,修改和终止会话,它独立运作于通讯协议之下,并且不依赖建立的会话类型。

如何在没有SIP服务器的情况下在直接IP到IP之间进行呼叫(How can I make call between direct IP to IP without SIP Server)https://www.it1352/932698.html

因为所有SIP用户代理都充当客户端和服务器当本端SIP客户端注册自己时,可以不使用SIP代理"或类似的基础设施"。)对端只需拨打(sip: 本端ip) sip:10.0.0.1 或 sip:foo.home 或任何你想打电话的电话。看起来pjsip已经支持调用 SIP URI直接(因为它应该!)所以你不需要调整任何东西。

 

2SIP协议

2.1 SIP协议结构

1.最底层的是它的语法和编码层。编码方式是采用扩展的Backus-Naur Form grammar(BNF

范式)

2.第二层是传输层。定义了一个客户端如何发送请求和接收应答,以及一个服务器如何接

收请求和发送应答。所有的SIP要素都包含一个通讯层。

3.第三层是事务层。事务层处理应用服务层的重发,匹配请求的应答,以及应用服务层的

超时。任何一个用户代理客户端(user agent client UAC)完成的事情都是由一组事务构成的。有状态的代理服务器包含一个事务层;无状态的代理服务器不包含事务层。

4.事务层之上是事务用户TU。每个SIP实体,除了无状态代理,都是一个事务用户。TU

可以创建客户事务,也可以取消客户事务。

 

下图是SIP业务的网络结构和各个参与者的关系。

2.2 SIP网络结构

User Agent Client (UAC) 用户代理客户端:是一个逻辑的概念,是请求的创建方。UAC 角色只在事务中存在。

User Agent Server(UAS) 用户代理服务器:是一个逻辑的实体,对SIP请求做出接受、拒绝或者转发的响应。UAS角色在事务中存在。

注:UACUAS,是在串行事务处理的原理上定义的。当主叫方A发出INVITE请求的时候,A作为UAC创建一个呼叫动作,当接收到被叫方BBYE请求的时候,A作为UAS 响应。UACUAS都可重定向。

Proxy Server代理服务器:是中间实体,即作为客户端也作为服务端,为客户端提供请求的转发服务。代理服务器首先提供的是路由服务。

Location Server 定位服务器:是Internet中的公共服务器,查询可采用多种协议,如LDAP 或基于多播的协议。

Redirect Server重定位服务器:产生3xx应答的UAS服务器,指示客户端连接别的URI

2.3 SIP协议消息

2.3.1 请求消息

Request请求消息:客户端发到服务端的SIP信息,用于执行特定得功能。INVITEACKOPTIONBYECANCEL都是请求消息。

2.3.2 应答消息

Response应答消息:服务端发到客户端的SIP信息,用来标志从客户端发往服务端的请求处理得情况。

流程

 

SIP则是一个点对点协议,所以它只需要一个相对简单的(因此也高度可扩展的)核心网络,而将处理工作下放给连接在网络边缘的智能端点(装有硬件或软件的终端设备)。SIP的许多功能在端点中实现,这与传统的SS7将其在网络核心设备实现的作法大异其趣。

 

SIP提供了一套安全服务包括防止拒绝服务,认证服务(用户到用户,代理到用户),完整性保证,加密和隐私服务。

 

SIP是一个应用层的控制协议,可以用来建立、修改、和终止多媒体会话(或者会议)例如Internet 电话SIP也可以邀请参与者参加已经存在的会话,比如多方会议。媒体可以在一个已经存在的会话中方便的增加(或者删除)。SIP显示的支持名字映射和重定向服务,这个用于支持个人移动业务-用户可以使用一个唯一的外部标志而不用关系他们的实际网络地点。SIP在建立和维持终止多媒体会话协议上,支持5个方面:
1 用户定位: 检查终端用户的位置,用于通讯。
2 用户有效性:检查用户参与会话的意愿程度。
3 用户能力:检查媒体和媒体的参数。
4 建立会话:”ringing”,建立会话参数在呼叫方和被叫方。
5 会话管理:包括发送和终止会话,修改会话参数,激活服务等等。

 

1.2 SIP特点

1.一个正在发展和不断研究中的协议。

2.简练、开放、兼容和可扩展等原则。

3.充分注意到因特网开放而复杂的网络环境下的安全问题。

4.充分考虑了对PSTN的各种业务,包括INIntelligent Network智能网)业务和ISDN

务(Integrated Services Digital Network综合业务数字网)的支持。

 

 

SIP本身并不提供服务。但是,SIP提供了一个基础,可以在其上提供/实现很多不同的服务.

SIP并不提供会议控制服务(比如议席控制或者投票系统),可以通过在SIP上建立其他的会议控制协议来发起一个会议。

 

SIP不是一个垂直集成的通讯系统。SIP可能叫做是一个部件更合适,它可以用作其他IETF协议的一个部分,用来构造完整的多媒体架构。比如,这些架构将会包含实时数据传输协议(RTP)(RFC 1889)用来传输实时的数据并且提供QoS反馈,实时流协议(RSTP(RFC 2326)用于控制流媒体的的传输,媒体网关控制协议(MEGACO(RFC 3015)用来控制到公共电话交换网(PSTN)的网关,还有会话描述协议(SDP)(RFC 2327)用于描述多媒体会话。

SIP应该和其他的协议一起工作,才能提供完整的对终端用户的服务。虽然基本的SIP协议的功能组件并不依赖于这些协议。

 

1、什么是Outbound proxy(外出代理服务器)?应当设置Outbound proxy 吗?

Outbound proxy通常是在有防火墙NAT时用,用于处理信号及帮助多媒体数据流通过防火墙。如果用户有Outbound proxy,并且没有使用STUN或者其它的穿过防火墙NAT的机制,则应当使用Outbound proxy。但是已经使用了STUN或者其它的穿过防火墙NAT的工具,则不同时使用Outbound proxy。

Outbound Proxy:可以算是一个二传手,也就是传递SIP URI,通常以outbound命名: 要同过这个地址才可以联系到Registrar Server(通常称为SIP Proxy).

至于realm,在一个庞大的网络罗,一般会用域名还带替IP地址,一是方便记忆,二是服务器可以做到多级热冗余,这样某个IP所对应的服务器故障了,待命的服务器就可以接替工作;因为outbound ,SIP服务器的信息要写入到终端里的,如果这时在某个IP地址的服务器出故障了,那么终端也就不能提供服务了(为了避免这个问题,有的终端厂家就加了个Second Server的变量,这是终端的折中的做法;当然,这样做,终端就可以有双倍的服务器地址或是域名).

在来说outbound Proxy SIP server(也叫SIP Proxy, SIP registar);处于网络安全IP地址缺乏的原故,有些NGN的解决方案里有个Outbound Server,一般SIP的核心平台(registrar server, redirect server,Policy server, Provisioning Sever, Heartbeat Sever, Database, billing server, Trunk Gateway)都是至于一个有安全保护的网络环境里.终端必须通过Outbound Server才能联系到里面.另外,终端处于NAT/Firewall后面时,Outbound会记忆终端的公网IP地址及对应的UDP端口号,还有其虚拟地址及端口;同时按一定的时间间隔(30秒以内,因为NAT/FW只会将一个没有数据通过的TCPUDP端口保留最长30)发送一个心跳消息给终端,防止终端出来的UDP端口被NAT/firewall关闭.(当然很多终端也能定时的上发心跳消息给服务器端,及时告诉上边自己出去的公网IP地址及对应的UDP端口号,还有虚拟地址及端口).

 

2、用户IDUser ID)和认证IDAuthentication ID)有什么区别?

用户ID是电话的SIP地址中用户部分,而且通常是作为呼叫者ID的信息,显示在SIP软件或者电话机的LCD上。典型的情况下,用户ID是一个电话号码或者是扩展了的数字,或者是一个用户的名字。

认证ID则是严格地用于认证目的之ID,是电话机联系SIP服务器时验证用户身份用的ID。认证ID可以与用户ID相同,也可以不一样。

 

3、应当选用哪种语音编码方法?

通常的情况下,所有的编码方法,都能够提供良好的语音。但是低比特速率的编码,对音乐来说质量可能有些差。DTMF(双音多频传输法)音调或者传真信号在音频通道上传输(带宽不够时),有可能在远端不能解码。所以,如果带宽允许,选用G.711编码方法,G.722甚至能够给出更好的音质。

带宽允许的情况下使用PCMU(G711u)编码。PCMU and PCMA都能够达到CD音质,但是它们消耗的带宽也最多(64kbps)

如果网络带宽比较低,可以选用低比特速率的编码方法G.723G.729,这两种编码的方法也能达到传统长途电话的音质,但是需要很少的带宽(G723需要5.36.3kbpsG729需要8kbps)。

如果带宽足够并且需要更好的语音质量,就使用PCMU PCMA,甚至可以使用宽带的编码方法G722(64kbps)这可以提供有高保真度的音质。

 

 

 

 

4、Voice_Frames_Per_TX是什么意思?它与以太网的流量有什么关系?

为了减少整个 以太网IPRTP 的开销(这些开销是由54字节的报文头引起的),多个语音帧可以包在单个以太网帧中发送。不过,这会引起语音延迟。在网络带宽比较紧的时候,增加这个数量,可以提高整个语音质量。

如果RTP数据包每2.5ms发送一个(G.728),则整个以太网IPRTP的开销是

//   1s发送个数:((1s=1000ms) / 2.5ms)=400/s

//   1个大小:54*8b= 432b

//   0.432 * 400 = 172.8kbps

这在公共Internet上,将会不太好。但是,如果RTP数据包每10ms发送一个,则总的以太网IPRTP的开销是

//   0.432 * 100=43.2kbps

如果RTP数据包每20ms发送一个,则总的以太网IPRTP的开销是

//   0.432 * 50=21.6kbps

推荐对G.723iLBC编码,每30ms发送一个数据包,所有其它的编码则每20ms发送一个包。所以,对G.723iLBC编码,Voice_Frames_Per_TX的值设置为1,对G.728设为8,对所有其它的编码设为2。

 

 

 

5、Voice_Frames_Per_TX应当设置为什么值?

这取决于选用什么样的编码方法,及在带宽利用率与丢包影响之间的折衷。这个值越大,则带宽利用率越高,因为更多的语音帧放到一个UDPRTP数据包中,这样数据报文头的开销减少了。但是丢失了一个数据包,对语音质量的影响比较大。

对PCMUPCMA,默认值是2,最大值是10

对G.723,默认值是1,最大值是32

对G726-32,默认值是2,最大值是20

对G729,默认值是2,最大值是64

对G728,默认值是4,最大值是64

 

 

6、以太网加到RTP数据包上的开销是多少?

对于语音数据,在以太网的IP网上传输,一个RTP数据包包含54字节(或者432比特)的报文头。这54字节包含14字节的以太网头,20字节的IP头,8字节的UDP头,和12字节的RTP头。

 

7、各种编码方法的帧的速率及比特速率是多少?

G.711 10ms的帧长度, 64kbps的比特速率

G.722 10ms的帧长度, 64kbps的比特速率

G.726-32 (也叫 G.721)10ms的帧长度,32kbps的比特速率

G.728 2.5ms的帧长度, 16kbps的比特速率

G.729 10ms的帧长度, 10kbps的比特速率

G.723 30ms的帧长度, 5.3kbps或者6.4kbps的比特速率

iLBC 20ms或者30ms的帧长度,15.2kbps 或者 13.3kbps 的比特速率

 

 

 

8、为什么G.723是低带宽的IP通信中最佳的选择?

G.723,其帧速率是30ms发一个数据包,编码的速率是5.3kbps (20 bytes 30ms)或者6.4kbps (24 bytes 30ms)。其总的比特速率是

5.3 + 0.43233.3 = 19.7kbps,

或者 6.4 +0.43233.3 =20.8kbps

如此低的比特速率,很适合于在28.8kbps拔号上网的时使用。再与其它的技术配合,如数据链路层压缩、静默抑制,及舒适的噪声产生,总的带宽可能更低。

 

 

9、什么是STUN服务,我是否需要使用STUN服务?

STUN代表UDP数据包简单地穿过NAT(Simple Traversal of UDP over NAT)。这是一个协议,当一个IP电话机在NAT后面时,IP电话机可以使用这个协议检测到NAT的存在,并判断NAT的类型。一个IP电话机如果支持STUN协议,它就可以发送一系列的STUN查询,到公共的因特网上的STUN服务器,这样就可以得到NAT上映射到话机的公网IP地址和端口。IP电话机就可以智能地修改SIPSDP消息中的私有IP地址。这样SIP信令和RTP多媒体数据就可以成功地穿过NAT,而不需要修改NAT的任何配置。

STUN代表了对大多数NAT的解决方法,但是不适合于对称的NAT。也就是说,绝大多数的SOHO路由器都是非对称的NAT,在这种情况下,使用STUN是成功的。但是STUN协议不能穿过对称的NAT。如果你的路由器是对称的NAT,则不要使用STUN。

SIP之类的协议是使用UDP分组在Internet上传输音频和/或视频数据的。不幸的是,由于通信的两个末端往往位于NAT之后,因此用传统的方法是无法建立连接的。这也就是STUN发挥作用的地方。

 

STUNSimple Traversal of UDP over NATsNATUDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT 路由器之后的主机之间建立UDP通信。该协议由RFC 3489定义

 

STUN是一个客户机-服务器协议。一个VoIP电话或软件包可能会包括一个STUN客户端。这个客户端会向STUN服务器发送请求,之后,服务器就会向STUN客户端报告NAT路由器的公网IP地址以及NAT为允许传入流量传回内网而开通的端口。

 

SIP怎么使用STUN

SIP通过STUN得到NAT外网IPSIP信令 听端口的外网port替换SIP注册包中的contact头中的IPport,然后注册。

这样就可以确保当有人呼叫你的的时候注册服务器能找到你。需 提醒你的是,NAT发现一个连接超过一段时间后没有活动,它就会关闭这个影射,因此你必须间隔一端时间发送一个数据包出去以keep alive

10、如果我的电话机使用了STUN服务,能够正常地工作,我还需要设置外出代理服务器(Outbound proxy)吗?

不需要设置Outbound proxy。

 

 

FXO - Foreign Exchange Office 外部交换局(PSTN出局呼叫)单的理解它是 PBX 交换机上用来同公共电话网相连的接口。也就是是中央交换局交换机和数字电话交换系统之间的一个中继端连接。相对于中心局而言,它模拟一台PABX分机,可实现一部普通电话机与一部多路复用器的连接。是一个同电话线相连用的接口。它一般地用来将PBX与电话公网相连。FXS 接口使得电话机同 PBX 相连,FXO[1] 接口使得同其关联的 PBX 通过电话线同公共电话网相连。FXO 接口接收来自 FXS 接口的传送拨号音电压。 

电话从链路的最后一个 FXO 设备接收呼叫、一旦接收到关联的 FXS 设备的电压时,呼叫便形成。为了能够接收外部线路的呼叫信号,便须将外部线路插入 Asterisk 服务器的 FXO  端口。将电话机插入服务器的 FXS的端口。一旦 FXO模块接收到该电压,它便在 FXS模块产生电压并其送往同它相连的模拟电话机。FXO可以和PBX进行中继。 

 

FXS:Foreignexchangestation是用来驱动电话机/传真机的接口。该接口提供连接电话机的插口、驱动的电源、和传送拨号音。FXS接口生成和传送拨号音电压到 FXO 接口。

PBX俗称:程控交换机,程控用户交换机.完成企业内部之间以及与公共电信网络的电话交换,并将电话,传真,调制解调器等功能合并。一般的术语ext.(extension)是指连接在主线上的分机。用户交换机就是处理分机之间的通话同时再通过主干线与公共交换电话网(PSTN)连接。最初的时候,用户交换机的首要优势就是节约内部通话上的消费:处理系统内部的线路转换从而减少电话收费。当用户交换机逐渐流行起来后,新增加了一些功能,例如智能寻线,用户呼叫,拨打分机等,而这些是电话公司不提供的服务.

基本速率 ISDN(Basic Rate ISDN - BRI)和主速率 ISDN (Primary Rate ISDN - PRI) 线路

 

 

BRI (Basic Rate Interface): 基本速率接口

BRI:Basic Rate ISDN 基本速率的综合业务数字网

综合业务数字网(N-ISDN,俗称“一线通”)的一种接口,可以用于进行电话、数据和图像通信等。

ISDN有两种速率连接端口,一种是ISDN BRI(基本速率接口)由两个B通道(每个B通道的带宽为64kbit/s)和一个D通道(带宽16kbit/s)组成,简称2B+D(144kbps)。ISDN BRI端口用于ISDN线路通过路由器实现与Internet或其他远程网络的连接。ISDN BRI的三个通道总带宽为144 kbps。其中两个通道称为B(荷载Bearer)通道,速率为64 kbps,用于承载声音、影像和数据通信。第三个通道是D(数据)通道,是16 kbps信号通道,D信道用来传输信令或分组信息, 用于告诉公用交换电话网如何处理每个B通道。ISDN BRI端口是采用RJ-45标准,与ISDN NT1的连接使用RJ-45-to-RJ-45直通线。如图所示为ISDN BRI端口。

另一种是ISDN PRI(基群速率接口),T1(23B+D)美国使用标准,总速率为1.544Mbps;,基于E1欧洲使用标准(30B+D),总速率为2.048Mbps。

IAD (Integrated Access Device)综合接入设备,实现传统模拟用户(模拟电话机)接入IP语音网络。

华为eSpace IAD配套华为IP语音/统一通信解决方案,应用于企业客户家庭办公、中小分支等

场景,实现模拟用户接入。http://enterprise.huawei/cn/products/coll-communication/union-comuni/ip_telephony/hw-344750.htm

eSpace IAD采用标准的话音编解码和压缩技术,将语音信号进行编码处理,封装成IP包,

通过IP网络发往指定的被叫媒体网关。当上述IP包到达终点后,目的地eSpace IAD经过相反

的处理过程,恢复原有的语音信号,从而实现了VoIP和FoIP(Fax over IP)的功能。


 


 


 

四、SIP的基础数据包中项的含义

1Request-URI呼叫请求发送地址UA生成初始请求消息时,该域中的消息一般与TO中的地址相同,经过网络服务器后,由于实际路由问题,该值可能发生变化;

                                                REGISTER消息中Request-URI中将会填充注册服务器的地址,而此时TO域中的地址将会填充客户端实际的地址。

2From发起请求方的地址,一般采用USERINFO@HOSTPOST形式,tag参数为随机产生的整数。

3To接受方地址,采用USERINFO@HOSTPOST形式,当该域存在于最终响应消息中时,将会有tag参数。

4Call-ID:识别呼叫参数,在同一个DIALOG中,该参数不发生变化,该参数与From中的tag参数、To域中的tag参数相结合用以保证呼叫的唯一性。

5CSeq:表征transaction的参数,由于同一个呼叫中会存在多个transaction,因此通过该参数来保证同一个UA发送的不同请求消息间的顺序。

6Via表征呼叫经过的路径UA生成SIP消息时,会在该域中填写自己的地址;proxy在转发请求消息时,将会增加一个填有自己地址的Via域,表示经过本proxyVia域的存在可以保证响应消息按照原路径返回到主叫方,代理服务器用它检查其内容,如果新端点已出现在Via列表中,则表示有环路了。

7Contact告知对端自己的地址,当对端发送下一个请求消息时,可直接向该地址发送,不需要关心前一个路由信息(除非有特定原则,例如PROXY可以通过RECORD-ROUTE域来保证下一个请求消息必须经过本PROXY,即使CONTACT域中填写对端客户的地址)。

8Expires给出消息内容超期的时间

客户端设置有效期的方法有两种:一个是通过设置Expires头域,一个是通过设置”expires”contact头域的参数来设置 后一种允许针对同一个REGISTER请求中的多个绑定联系地址中的每一个联系地址单独设定有效期,然后所有没有带”expires”参数的Contact头域的值都使用Expires的设置。

9Max-Forwards用来限制请求到他的目的地中间的跳转,包含一个每隔一个跳转就自动减一的数字,如果Max-Forwards在到达目的之前就减到0,他会报告一个483(太多的路由)错误回应。

10Require UAC通过Require段列出的选项标签,告知UAS处理请求时需要支持的选项。

11Record-Route由于CONTACT域的存在使得两个用户后续的请求消息可能不经过PROXY,为了运营需要,PROXY在初始INVITE消息中增加了RECORD-ROUTE,这样可以保证后续请求(例如BYE消息)经过PROXY.通过RECORD-ROUTECONTACT的结合,既可避免后续请求旁路网络服务器的行为,又可减少后续请求路径上的环节。

12Content-Length头域用来确定每一个SIP消息在通讯流中的结束位置的。
 

 

 

 

 

 

VIA域告诉大家本请求发送到哪里并且应答到哪里(如果有注册服务器,要先发给服务器,再由服务器转发。如果没有服务器,该地址填直接被拨打方ip地址)

from  sip:拨打方ip地址

to     sip:被拨打方ip地址

Contract域告诉大家将来的请求将发送到哪里(如果有注册服务器,则填在服务器注册的拨打方sip用户信息。如果没有服务器,该地址填直接sip:拨打方ip地址)

 

会话(Session用于进行媒体流传送。当一方发出请求,而另外一方或多方接受请求并通过信令交互成功后才能建立会话。

SDP内信息相关。在SDP中,多媒体会话指的是一组的媒体发送方和接收方及媒体流从发送方流向接受方。会话是由SDP里的user name, session id, network type, address type, 和源处地址元素来确定的。只有当媒体协商成功后,会话才能被建立起来。

A session is initiated with INVITE and is created by completing offer/answer exchange.

一次呼叫只能建立一次会话,但可以建立多个对话(Dialog),因为接受请求的可能不止一个。

sip中update和re-invite方法的区别

SIP中,re-inviteupdate都是用来修改变session参数的。不同的是,updatedialog的状态没有影响,而re-invite会改变对话的状态。所以update可以在第一个invite被应答之前发送(即收到invite200ok之前)。也就是说,update可以被用来控制早期媒体。而re-invite只能在第一个invite杯应答之后发送(即在通话已经建立之后)。

    般来说,在通话建立以后用updatere-invite改变session参数都可以。但是此时多用re-invite。因为update要立即被响应。这样,如果session参数的修改需要用户参与的话,用update就不合适了。大多数时候,呼叫建立起来之后再修改session参数的话,都需要用户的参与,比如点一个同意对话框,所以用re-invite就更普遍一些。

 

 

对话(Dialog: INVITE或者SUBSCRIBE创建

对话指的是一对一的持续一段时间的连接关系,由Call-ID, From-tagTo-tag确定。当三个元素齐全的时候,即对话处于确定阶段时,对话已经建立起来。 Dialog IDCall-Id, 本地tag, 对端tag 组成

Dialog(会话) 会话是两个UAs(user agent) 之间持续一段时间的端到端(peer-to-peer)SIP 关系. 一个会话由一个Call-ID, 一个local tag 一个remote tag来标识.会话过去也叫做 "call leg".

 

1.       创建对话

1)          UAS

       i.  路由集由请求的Record-Route头字段提供,并要保留顺序和URI参数,实时更新,如果下一轮的请求中无Record-Route头字段,则路由集变为空

       ii本地URI填入回应的Contact头字段【关键】

       iii.布尔型标记“secure”,如果请求基于TLS(传输层安全协议),则由Request-URI中的secure参数来提供

       iv. 远端目的由请求的Request-URI提供

       v.  From-tag可能不存在,则默认为空

  UAS行为

     i如果请求To字段存在标签值UAS内核会计算与此请求相关的对话标签值,同时与已有的对话标签值比较如果匹配则为同一个对话中的请求。此UAS采用与对话外请求消息处理规则相同的流程进行处理;如果不存在匹配的对话,UAS可以拒绝(481)或接受这个请求。

     ii.如果远端序列号为空,则设置为请求消息中CSeq字段的序列号值;如果远端序列号存在并大于请求的CSeq序列号值,则认为请求次序颠倒,回500(服务器内不出错)消息。


 

2)          UAC

       i.  路由集必须为响应消息中的Record-Route头字段的URI列表,保持相反的顺序和保留所有的URI参数

       ii. 远端目的为响应消息的Contact头字段的URI

       iii. 本地序列号为请求消息的CSeq头字段的序列号值

       iv. 远端序列号必须为空,当远端UA发送一个本次对话中的请求后该值才能确定

       v.  To-tag可能不存在,则默认为空

    UAC行为

       i.  发起请求

        一个对话中的请求消息有对话所保存的状态信息来构建。

          1. 请求消息的To头字段的URI必须设置为对话状态的远端URI

          2. 请求消息的To头字段的标签值设置为对话ID的远端标签值

          3. 请求消息的From头字段的URI必须设置为对话状态的本端URI

          4. 请求消息的From头字段的标签值设置为对话ID的本端标签值

          5. 请求消息的Call-ID必须设置为对话的Call-ID

       而对话中的其它字段同样有限制:

          6. CSeq序列号。CSeq是按照各自方向严格增1的值,如果为空则设为初始值。

          7. Request-URI由远端目的指定

          8. Route由路由集指定,如果路由集为空,则无Route字段。如果路由集的第一个URI中包含lr参数,UAC必须将Request-URI设置为远端目的URI值;如果路由集的第一个URI中不包含lr参数,UAC必须将Request-URI设置为路由集的第一个URI,且不允许去掉任何参数,同时Route头字段在最后增加一个目的URI

          9.Contact。对话中任何一个更新目的的请求消息包含一个Contact头字段,Contact字段内URI为对话的远端目的URI

如果UAC收到对目的刷新请求消息的2**响应时,UAC必须将对话的远端目的URI设置为存在Contact字段的URI值。如果响应为481(呼叫/事务不存在)或408(请求超时),UAC应该终止对话;在无对方响应时也应该终止对话

 

 

13SIP应答头

1xx = 通知性应答 

 

100 正在尝试 

180 正在拨打 

181 正被转接 

182 正在排队 

183 通话进展 

2xx = 成功应答 

 

200 OK 

202 被接受:用于转介 

3xx = 转接应答 

 

300 多项选择 

301 被永久迁移 

302 被暂时迁移 

305 使用代理服务器 

380 替代服务 

4xx = 呼叫失败 

 

400 呼叫不当 

401 未经授权:只供注册机构使用,代理服务器应使用代理服务器授权407 

402 要求付费(预订为将来使用

403 被禁止的 

404 未发现:未发现用户 

405 不允许的方法 

406 不可接受 

407 需要代理服务器授权 

408 呼叫超时:在预定时间内无法找到用户 

410 已消失:用户曾经存在,但已从此处消失 

413 呼叫实体过大 

414 呼叫URI过长 

415 不支持的媒体类型 

416 不支持的URI方案 

420 不当扩展:使用了不当SIP协议扩展,服务器无法理解该扩展 

421 需要扩展 

423 时间间隔过短 

480 暂时不可使用 

481 通话/事务不存在 

482 检测到循环 

483 跳数过多 

484 地址不全 

485 模糊不清 

486 此处太忙 

487 呼叫被终止 

488 此处不可接受 

491 呼叫待批 

493 无法解读:无法解读 S/MIME文体部分 

5xx = 服务器失败 

 

500 服务器内部错误 

501 无法实施:SIP呼叫方法在此处无法实施 

502 不当网关 

503 服务不可使用 

504 服务器超时 

505 不支持该版本:服务器不支持SIP协议的这个版本 

513 消息过长 

6xx = 全局失败 

 

600 各处均忙 

603 拒绝 

604 无处存在 

606 不可使用

 

 

 

  SIP: From ,Contact, Via Record-Route/Route head

SIP: From ,Contact, Via Record-Route/Route head

From: 如果一个SIP消息中没有Contact或者Record-Route头域,那么callee就会根据From头域产生后续的Request如:如果 Alice打一个电话给BobFrom头域的内容是 From:Alice<sip:alice@example>。那么Bob打给Alice时就会使用 sip:alice@example作为To头域和Request-URI头域的内容。 

 

Contact: 后续Request将根据Contact头域的内容决定目的地的地址,同时将Contact头域的内容放到Request-URI中。它还可以用来指示没 有在Record-Route头域中记录的Proxies的地址。同时它还可以被用在Redirect servers 重定向服务器REGISTER requests 注册请求responses 

 

Record-Route/Route: Record-Route头域一般是被proxies代理人插入到request中的,这样后续的Request如何有着和前面一样的call-id就会被路由 到这些proxies。它也会被User Agent作为发送后续request的依据。这套机制很像source-routeRecord-Route头域的信息被复制到Route头域中。并 Request-URI头域会被设置为第一个Route头域的内容。 

 


 

Via: Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路。它不会对未来的request 或者是response造成影响。 

 

总的来说,如果有Routerequest就应该根据Route发送,如果没有就根据Contact头域发送,如果连Contact都没有,就根据From头域发送。 


 

dialog, transaction, session之我见

SIP3个很重要的概念,就是dialog, sessiontransaction 

 

以下是我学习中对这三个概念的心得,贴出来和大家探讨。 

 

 

dialog的建立是收到UAS的响应(To tag)时开始建立的。收到180响应时建立的 

dialog叫做早期对话(early dialog,收到2XX的应答开始才是真正的dialog建立。 

 

session 是媒体交换之后才建立的。具体而言就是通过offer/answer方式交换sdp的媒体。 

session的建立可以使INVITE-200 也可以是200-ACK。这要看媒体的交换发生的时间。 

具体来说,INVITE 中的消息体用sdp语言来描述自己可处理的媒体类型,200OK 

带回UAS端可处理的媒体类型。这个时候媒体交换就算是完成了。也就是session建立起 

来了。 

 

dialogend-pointend-point的关系。而transaction hop by hop的关系。dialog通过 

From tag, To tag(应该说local tag, remote tag--这两个tag随着UACUAS而不同。)以及 

Call-ID 来判别。而transaction是一个SIP entity和下一个SIP entity之间请求和应答关系,(无状态代理服务器不再此列) 

是通过对Via里的branch来判别的。 

 

Transaction:维护hop to hop状态,包括一个请求和其触发的所有响应,包括若干暂时响应和一个最终响应。生命周期从请求产生到收到最终响应。 

Dialog:维护peer to peer状态,目前只有invitesubscribe请求会触发dialog。其生命周期贯穿一个端到端会话的始终。 

 

 

 

 

 ptime指示接受的打包间隔,但并不要求双方的ptime值一致。但发送媒体流时应该按照ptime指示的打包间隔来发送。

 为了控制通过re-INVITEUPDATE方法进行周期性的会话(session)刷新,以判别会话两端是否存活,增加了两个头域:Session-Expires(会话的生命期)和Min-SE(会话时钟的最小值) 其中Min-SE头域中的值只能增加不能减少,Session-Expires头域的值只能减少不能增加,但不能少于Min-SE头域中的值

介绍:

       SIPRFC3261)没有提供已存在会话保持激活的机制,虽然可以终端可以使用某些方式了解会话是否存活,但proxy却无法做到这一点。Re-INVITEUPDATE方法就基于此进行的,这些刷新请求的周期是通过协商来确定的。当在规定的周期内没有新的刷新请求到来,即认为该会话结束。

 

 

五、SIP交互流程详解

 

1SIP注册

注册服务为特定地区的位置服务创建绑定关系,这个绑定关系是用来建立包含一个或者多个联系地址的address-of-record URI。因而,当那个地区的proxy接收到一个请求,这个请求的Request-URI和address-of-record的记录匹配,那么这个proxy会转发请求到这个address-of-record中登记的联系地址中去。

Address-of-Record: 记录地址。一个address-of-record(AOR)是一个SIP或者SIPS URI它指向了一个具有定位服务的主机,这个主机可以把URI映射成为用户真正物理位置的URI。通常情况下,定位服务器是通过登记服务来建立的。一个AOR经常被认为是一个用户的”公共地址” 。

需要注意的是,登记服务器(registrar)和proxy服务器都是逻辑上的角色,可以在网络中用一个设备来部属.还需要注意的是如果他们(登记服务器和proxy)本身是分开的,那么UA可以通过proxy服务器发送注册请求。 

1 构造一个REGISTER请求

REGISTER请求用来增加、删除、查询绑定资料。

下面这些头域,除了Contact,必须在REGISTER头域中包含。Contact头域可选。

Request-URI: 这个头域指明了登记服务所指明的位置服务所在的区域(比如sip:chicago。”userinfo”和”@”元素在SIP URI中不能出现。

To: 这个头域包含了被查询、增加、修改的address-of-record。to头域和Request-URI头域通常是不同的,因为这个由用户名组成。这个address-of-record必须是一个SIP URI或者SIPS URI.

From: 这个头域包含了提交这个注册信息的用户的address-of-record资料。这个值和To头域的值相同除非这个请求是第三方发起的注册请求。

客户端用REGISTER方法向SIP服务器注册TO报头域中列出的地址,通知当前所处位置。如果发起注册信息的用户From的地址和要注册To地址相同,则注册TO报头域中列出的地址可由用户完成,否则由第三方完成。注册地址上要绑定哪些联系人由后续的Contact头域指定。

Call-ID: UAC发出的给某个注册服务器(registrar)的所有注册请求都应该有相同的Call-ID头域值。如果相同的客户端用了不同的Call-ID值,注册服务器(registrar)就不能检测是否一个REGISTER请求由于延时的关系导致了故障。

Cseq: Cseq值保证了REGISTER请求的正确顺序。一个UA为每一个具备相同的Call-ID的REGISTER请求顺序递增这个Cseq字段。

Contact: REGISTER请求可以有一个Contact头域。这个头域可以有0个或者多个包含绑定地址信息的值。 “expires”参数表明UA的绑定的有效时间。以秒为单位的整数。如果本参数没有制定,那么这个参数的值就是Expires头域的值。实现中,可以把超过2**32-1的值(4294967295秒或者136年)认为是2**32-1。非法的值应当视同3600。

UA在没有收到上一个注册请求的应答或者上一个REGISTER请求超时之前,禁止发送新的注册请求(就是说,包含一个新的Contact头域值,而不是重发)。 

1.1 增加绑定

1.1.1 设置Contact地址的过期参数

当一个客户端发出一个REGISTER请求,它可能包含一个过期参数用来表示这个注册的地址的有效期。

客户端设置有效期的方法有两种:一个是通过设置Expires头域,一个是通过设置”expires”contact头域的参数来设置 后一种允许针对同一个REGISTER请求中的多个绑定联系地址中的每一个联系地址单独设定有效期,然后所有没有带”expires”参数的Contact头域的值都使用Expires的设置。

如果REGISTER中没有两种有效期都没有设置,这就表明这个有效期由服务器来决定。

1.1.2 Contact Adress的参数选择

如果在一个REGISTER请求中包含多个Contact,这说明UA想要把这些Contact头域的内容都和To头域中制定的address-of-record地址绑定起来。这个列表可以用”q”参数来区分Contact头域的优先级。”q”参数用来标志特定Contact头域值和其他绑定的address-of-record的联系地址之间的优先级。


1)首次试呼时,终端代理向代理服务器发送REGISTER注册请求
2)代理服务器通过后端认证/计费中心获知用户信息不在数据库中,便向终端代理会送401Unauthorized质询信息,其中包含安全认证所需的令牌
3)终端代理提示用户输入其标识和密码后,根据安全认证令牌将其加密后,再次用REGISTERZ消息报告给代理服务器
4)代理服务器将REGISTER消息中的用户信息解密,通过认证/计费中心验证其合法后,将该用户的信息登记到数据库里,并向终端代理返回成功响应信息200 OK

1.2 删除绑定

注册信息是一个纯粹软件的状态,并且如果不刷新会过期。如果需要,也可以被删除。一个客户端可以设置注册服务器(registar)的有效期(10.2.1)。一个UA可以通过发出有效期为”0”的REGISTER请求,使某一个联系地址立刻失效。UAS都需要实现这个机制使得在联系地址过期前能够被删除。

REGISTER规范中的Contact头域如果设置成为”*”则表示需要操作所有的注册项。但是也只能在具有一个Expires头域并且这个头域为’0’的情况下能够使用。(这就是说,只能够在要删除所有的注册项的时候使用”*”)。

用”*”来删除所有的注册项有一个好处,就是使得UA不需要知道每一个注册项的精确值。


1)终端代理向代理服务器发送REGISTER消息注销,其头中exprie字段置0
2)代理服务器收到后回发200 OK响应,并将数据库中的相关用户信息注销

1.3 访问绑定

无论请求是否包含了Contact头域,给任何REGISTER请求的成功应答都包含了一个完整的绑定列表。如果REGISTER请求头域中不包含Contact头域,那么注册服务器的绑定列表将不会改变

1.4 刷新绑定

每一个UA都对先前它建立的绑定信息由刷新的义务。禁止对其他UA建立的绑定信息进行刷新。 于是在这些绑定信息过期前,UA为每个绑定发出REGISTER请求来刷新绑定。也可以通过一个REGISTER请求来刷新数个绑定请求。

UA在一个刷新周期中,应该使用相同的Call-ID来进行注册调用。

1.6 寻找注册服务器

UA有3种方法来决定向哪里发出注册请求:通过配置,使用address-of-record,广播方式。

1)一个UA可以用非本文档规定的方式,配置一个注册服务器的地址。

2)用请求的Request-URI部分种的address-of-record的服务器部分(host part),用普通的SIP服务器定位机制。比如,用户”sip:carol@chicago”地址的注册服务应该是”sip:chicago”。

3)UA可以通过监听广播的形式来获得注册服务器地址。

1.8 错误响应

如果UA接收到一个423(间隔太简略)应答,它可能需要更改REGISTER请求中的所有有效期,使得这些有效期必须大于等于423应答头中的Min-Expires头域中的有效期,并且重新尝试发送这个REGISTER请求。 

 

2 处理REGISTER请求

一个注册服务器(registrar)就是一个UAS,这个UAS用来响应REGISTER的请求,并且维持一个绑定表,这个绑定表用来提供给它所管理的区域中的proxy服务器和重定向服务器的。

一个注册服务器禁止产生6xx应答。

一个注册服务器可以适当的转发REGISTER请求。通常用于一个注册服务器(registar)监听一个多点广播,并且通过302应答(临时转移)转发这个多点广播的REGISTER请求到它正确的处理位置。

一个注册服务器必须知道(例如,通过配置)它所管理的区域。注册服务器一定需要按照接收到的REGISTER请求顺序进行处理。

 

当接收到一个REGISTER请求,注册服务器(registrar)按照如下步骤处理:

1、 注册服务器(registrar)检查Request-URI来决定是否它属于本注册服务器所管理的区域的Request-URI。如果不是,并且如果这个服务器同时也作为一个proxy服务器,那么这个服务器应当转发这个请求到指定的区域。

2、 为了保证注册服务器能够支持所需要的扩展,注册服务器必须处理Require头域。

3、 一个注册服务器应当对UAC进行身份认证。

4、 注册服务器应当检查认证的用户是否通过认证来更改这个address-of-record的登记权限。

5、 注册服务器(registrar)从REGISTER请求的To头域中解出address-of-record。如果这个address-of-record并非在这个Request-URI指明的区域中合法,那么注册服务器必须发出一个404(没有找到)的应答,并且跳过后续步骤。接着URI必须转换成为标准的格式。所有的URI参数都必须删去(包括用户参数user-param),并且任何非法(escaped)字符必须转换成为合法字符(unescaped)格式。最后形成一个可以用于绑定的列表。

6、 注册服务器(registrar)检查是否请求包含了一个Contact头域。

如果没有包含,它跳过到最后一步。

如果Contact头域包含了,注册服务器检查是否有一个Contact头域值是”*”,并且包含了一个Expires头域。如果请求有其他的Contact头域或者任何有效期的值是非0的,这个请求就是非法请求,并且服务器必须送回一个400(非法请求)的应答,跳过后续步骤。如果没有,那么注册服务器检查是否Call-ID复核每一个绑定的值。如果不符合,它必须删除绑定。如果符合,它必须仅仅删除保存的绑定表中CSeq值小于请求中的Cseq值的记录。否则,更新必须终止,请求失败。

7、 现在注册服务器(registrar)可以依次处理Contact头域中的联系地址了。

8、 注册服务器(registrar)返回一个200(OK)应答。这个应答必须包含Contact头域,并且这个头域的值中列举了所有当前绑定的注册信息。每一个Contact值都必须包含一个”expires”参数,用来标志还有多久这个绑定信息就过期了。应答也必须包含一个Date头域。

 

 

 

 

2、基本呼叫建立过程

INVITE:发起会话请求。用于邀请用户加入一个会话,会话描述消息体中。它在SIP报头中包含了呼叫方、Call-ID、被叫方、呼叫顺序编号和其他内容。也可以在呼叫过程中通过INVITE请求修改呼叫的操作状态(如让一方等待)。

上图为基于SIP的会话发起的基本过程。SIP建立通讯通常需要六个步骤:
1)注册,发起和定位用户
2)进行媒体协商通常采用SDP协议来携带媒体参数
3)由被叫方来决定是否接纳该呼叫
4)呼叫媒体流建立并交互
5)呼叫更改或处理如呼叫转移等
6)呼叫终止

https://blog.csdn/yunmao2882/article/details/86715395

 


1)用户摘机发起一路呼叫,终端代理A向该区域的代理服务器发起Invite请求;
2)代理服务器通过认证/计费中心确认用户认证已通过后,检查请求消息中的Via头域中是否已包含其地址,若已包含,说明发生环回,返回指示错误的应答;如果没有问题,代理服务器在请求消息的Via头域插入自身地址,并向Invite消息的To域所指示 的被叫终端代理B转送Invite请求;
3)代理服务器向终端代理A送呼叫处理中的应答消息,100 Trying
4)终端代理B 向代理服务器送呼叫处理中的应答消息,100 Trying
5)终端代理B指示被叫用户振铃,用户振铃后,向代理服务器发送180 Ringing振铃消息;
6)代理服务器向终端代理A转发被叫用户振铃信息;
7)被叫用户摘机,终端代理B向代理服务器返回表示连接成功的应答(200 OK);
8)代理服务器向终端代理A转发该成功指示(200 OK);
9)终端代理A收到消息后,向代理服务器发ACK消息确认;
10)代理服务器将ACK确认消息转发给终端代理B
11)主被叫用户之间建立通信连接,开始通话。

 

3、会话更改流程      用户代理服务端向用户代理客户端发送Invite消息,带有新的SDP协商信息;


1)用户代理服务端向用户代理客户端发送Invite消息,带有新的SDP协商信息;
2)用户代理客户端回复200 OK,并将协商后的SDP信息带回;
3)用户代理服务端发送ACK给用户代理客户端进行确认。

4、正常呼叫释放过程  主叫用户挂机后


2)用户通话结束后,被叫用户挂机,终端代理B向代理服务器发送Bye消息;
3)代理服务器转发Bye消息至终端代理A,同时向认证/计费中心送用户通话的详细信息,请求计费;
4)主叫用户挂机后,终端代理A向代理服务器发送确认挂断响应消息200 OK
5)代理服务器转发响应消息200 OK给终端代理B

5、被叫忙呼叫释放    呼叫请求送到被叫终端代理B后,被叫忙


1)用户A发起一路呼叫,终端代理A向代理服务器发送Invite请求;
2)代理服务器收到呼叫请求后向被叫终端代理转发该Invite消息;
3)代理服务器向终端代理A回送100 Trying,告知终端代理A呼叫正在处理;
4)终端代理B向代理服务器回送100 Trying,告知代理服务器呼叫正在处理;
5)呼叫请求送到被叫终端代理B后,被叫忙,终端代理B向代理服务器送486被叫忙响应;
6)代理服务器向终端代理A转发该响应消息;
7)终端代理A向代理服务器回送ACK确认消息;
8)代理服务器向终端代理BACK确认消息。

6、被叫无应答流程一  被叫久振铃无应答,终端代理A判断超时


1)用户A发起一路呼叫,终端代理A向代理服务器发Invite请求消息;
2)代理服务器向被叫用户的终端代理B转发该Invite请求;
3)代理服务器向终端代理A回送100 Trying响应,表示呼叫已在处理中;
4)终端代理B向代理服务器回送100 Trying,告知代理服务器呼叫正在处理。
5)被叫用户振铃,终端代理B向代理服务器送180 Ringing响应;
6)代理服务器向终端代理A转发该响应消息;
7)被叫久振铃无应答,终端代理A判断超时后,向代理服务器送Cancel消息放弃该呼叫;
8)代理服务器将Cancel消息转发给终端代理B
9)代理服务器收到Cancel消息后,向终端代理A回送200 OK响应;
10)终端代理B向代理服务器回送200 OK响应;
11)终端代理B向代理服务器送487请求已撤销的响应消息;
13)代理服务器向终端代理A487请求已撤销消息;
14)代理服务器收到后回送ACK确认;
15)终端代理A向代理服务器回送ACK确认。

7、被叫无应答流程二  被叫久振铃无应答,终端代理B判断超时后


1)用户A发起一路呼叫,终端代理A向代理服务器发Invite请求消息;
2)代理服务器向被叫用户的终端代理B转发该Invite请求;
3)代理服务器向终端代理A回送100 Trying响应,表示呼叫已在处理中;
4)终端代理向代理服务器回送100 Trying,告知代理服务器呼叫正在处理;
5)被叫用户振铃,终端代理B向代理服务器送180 Ringing响应;
6)代理服务器向终端代理A转发该响应消息;
7)被叫久振铃无应答,终端代理B判断超时后,向代理服务器送408 Request timeout消息放弃该呼叫;
8)代理服务器收到408 Request timeout消息后,转发该消息向终端代理A
9)代理服务器收到后回送ACK确认给终端代理B
10)终端代理A向代理服务器回送ACK确认。

 

8、遇忙呼叫前转流程  终端代理B忙线中,代理服务器对此呼叫进行前转,向终端代理C发送Invite请求消息


1)用户A发起一路呼叫,终端代理A向代理服务器发Invite请求消息;
2)代理服务器向被叫用户的终端代理B转发该Invite请求;
3)代理服务器向终端代理A回送给100 Trying响应,表示呼叫已在处理中;
4)终端代理B向代理服务器回送100 Trying,告知代理服务器呼叫正在处理;
5)终端代理B忙线中,终端代理B 向代理服务器回送486 Buzy here响应;
6)代理服务器向终端代理B发送ACK响应消息;
7)代理服务器对此呼叫进行前转,向终端代理C发送Invite请求消息
8)代理终端C收到Invite请求后,指示用户振铃,同时向代理服务器发送180Ringing响应;
9)代理服务器向代理终端A转发收到的180 Ringing响应;
10)被叫用户C摘机接听电话,代理终端C向代理服务器发送200 OK响应;
11)代理服务器向代理终端A转发收到的200 OK响应;
12)终端代理A向代理服务器回送ACK确认;
13)代理服务器向代理终端C转发收到的ACK确认;
14)主叫挂机,代理终端A向代理服务器发送BYE请求消息,请求挂机;
15)代理服务器向代理终端C转发收到的BYE请求消息,指示用户C挂机;
16)用户C放催挂音,同时向代理服务器回应200 OK响应;
17)代理服务器向代理终端A转发收到的200 OK响应。

 

9、无应答呼叫前转    被叫久振铃无应答,代理服务器判断超时后,向终端代理BCancel消息放弃该呼叫,代理服务器对此呼叫进行前转,向终端代理C发送Invite请求消息;


1)用户A发起一路呼叫,终端代理A向代理服务器发Invite请求消息;
2)代理服务器向被叫用户的终端代理B转发该Invite请求;
3)代理服务器向终端代理A回送给100 Trying响应,表示呼叫已在处理中;
4)终端代理B向代理服务器回送100 Trying,告知代理服务器呼叫正在处理;
5)被叫用户振铃,终端代理B向代理服务器送180 Ringing响应;
6)代理服务器向终端代理A转发该响应消息;
7)被叫久振铃无应答,代理服务器判断超时后,向终端代理BCancel消息放弃该呼叫;
8)终端代理B收到Cancel消息后,向代理服务器回送200 OK响应;
9)终端代理B向代理服务器送487请求已撤销的响应消息;
10)代理服务器收到后回送ACK确认;
11)代理服务器对此呼叫进行前转,向终端代理C发送Invite请求消息;
12)代理终端C收到Invite请求后,指示用户振铃,同时向代理服务器发送180Ringing响应;
13)代理服务器向代理终端A转发收到的180 Ringing响应;
14)被叫用户C摘机接听电话,代理终端C向代理服务器发送200 OK响应;
15)代理服务器向代理终端A转发收到的200 OK响应;
16)终端代理A向代理服务器回送ACK确认;
17)代理服务器向代理终端C转发收到的ACK确认;
18)主叫挂机,代理终端A向代理服务器发送BYE请求消息,请求挂机;
19)代理服务器向代理终端C转发收到的BYE请求消息,指示用户C挂机;
20)用户C放催挂音,同时向代理服务器回应200 OK响应;
21)代理服务器向代理终端A转发收到的200 OK响应。

10、呼叫保持         被叫用户摘机,代理终端向代理服务器发送Reinvite请求消息


1)用户摘机发起一路呼叫,终端代理A向该区域的代理服务器发起Invite请求;
2)代理服务器通过认证/计费中心确认用户认证已通过后,检查请求消息中的Via头域中是否已包含其地址,若已包含,说明发生环回,返回指示错误的应答;如果没有问题,代理服务器在请求消息的Via头域插入自身地址,并向Invite消息的To域所指示 的被叫终端代理B转送Invite请求;
3)代理服务器向终端代理A送呼叫处理中的应答消息,100 Trying
4)终端代理B 向代理服务器送呼叫处理中的应答消息,100 Trying
5)终端代理B指示被叫用户振铃,用户振铃后,向代理服务器发送180 Ringing振铃消息;
6)代理服务器向终端代理A转发被叫用户振铃信息;
7)被叫用户摘机,终端代理B向代理服务器返回表示连接成功的应答(200 OK
8)代理服务器向终端代理A转发该成功指示(200 OK);
9)终端代理A收到消息后,向代理服务器发ACK消息确认;
10)代理服务器将ACK确认消息转发给终端代理B
11)主被叫用户之间建立通信连接,开始通话;
12)代理终端向代理服务器发送Reinvite请求消息,SDPc域等于0.0.0.0
13)代理服务器转发此消息给代理终端A
14)代理终端A收到Reinvite后,回应200 OK响应,表示接受会话更改,同时根据协商结果修改会话方式;
15)代理服务器转发200 OK给代理终端B
16)终端代理B收到消息后,向代理服务器发ACK消息进行确认;
17)代理服务器将ACK确认消息转发给终端代理A

11、呼叫等待         用户A,B正处于通话阶段,用户CA发起呼叫,然后B保持,AC通话。


2)用户A,B正处于通话阶段,用户CA发起呼叫,终端代理C发送Invite消息给代理服务器;
3)代理服务器向终端代理C回送100 Trying响应,表示呼叫已在处理中;
4)代理服务器转发invite消息给代理终端A
5)用户A振铃,终端代理A向代理服务器发送180 Ringing响应;
6)代理服务器向终端代理C转发响应消息;
7)用户A按下呼叫保持键,代理终端A向代理服务器发送Invite消息,请求域代理终端呼叫保持;
8)代理服务器转发此消息给终端代理B
9)代理服务器向终端代理A回送100 Trying响应,表示呼叫已在处理中;
10)终端代理B收到呼叫保持请求后,发送200 OK给代理服务器,表示接收呼叫保持;
11)代理服务器转发200 OK响应给终端代理A
12)终端代理A向代理服务器回送ACK确认;
13)代理服务器向代理终端B转发收到的ACK确认;
14)终端代理A发送200 OK给代理服务器,表示接收C的呼叫;
15)代理服务器转发200 OK响应给终端代理C
16)终端代理C向代理服务器回送ACK确认;
17)代理服务器向代理终端A转发收到的ACK确认;
AC之间开始通话;
18)用户A挂机,终端代理A向代理服务器发送Bye请求消息;
19)代理服务器转发Bye消息向终端代理C
20)终端代理C发送200 OK响应给代理服务器。表示接受请求;
21)代理服务器转发200 OK响应给终端代理A
22)终端代理A重新发送Invite请求给代理服务器,请求和终端代理B恢复通话;
23)代理服务器向代理终端代理B转发收到的Invite请求。

 

 

 

 

 

事务(Transaction

事务包括发送的请求和相应的回应,指的是UA之间的请求和应答关系。而VIA中的branch参数用于确定事务。

 

 

SIP中的DNS过程

1.1.SIP消息涉及的DNS过程

SIP消息涉及到的DNS过程主要包括两个方面:一方面是如何发送请求消息,发送方需要通过DNS过程得到传输层协议类型,下一跳的IP地址和端口等信息;另一方面是如何返回响应消息,需要决定上一跳的地址和端口,尤其是上一跳网元发生故障时,如何返回响应消息。

1.2.如何发送SIP请求消息

定义一个名为TARGET的变量,如果URI定义了maddr参数,TARGET取值于该参数,否则取值于URIhostport部分。

第一步是决定使用哪种传输层协议发送请求消息,包括下列步骤

1  如果URI定义了传输层协议,则使用该传输层协议,否则转步骤2

2  如果TARGET包含IP地址,那么对于SIP URI使用UDP协议,SIPS URI使用TCP协议,否则转步骤3

3  如果TARGET包含了端口,那么对于SIP URI使用UDP协议,SIPS URI使用TCP协议,否则转步骤4

4  使用TARGET中的域名进行NAPTR查询,如果NAPTR返回的记录为空转步骤5,否则查看返回的记录,记录中的service域一般取值为”XXX+D2U”, X+D2T”, XX+D2S”, 其中XXX表示服务名称,可以是”SIP””SIPS”D2U表示使用UDP协议,D2T表示使用TCP协议,D2S表示使用SCTP协议;

5  根据RFC3261的传输准则判断是否需要使用某种强制协议,如果需要使用强制协议,则使用该强制协议,否则对于SIP URI使用UDP协议,SIPS URI使用TCP协议;

第二步是决定目标的IP地址和端口,包括下列步骤

1  如果TARGET包含了IP地址和端口,则使用该地址和端口,否则转步骤2

2  如果TARGET包含了IP地址,则使用对应传输协议的默认端口,否则转步骤3

3  如果TARGET不包含IP地址,但包含了端口,则使用AAAAA查询,获得域名对应的IP地址,否则转步骤4

4  如果在第一大步的第四小步没有进行NAPTR查询,转步骤5,则使用该查询返回的记录中的replacement域中域名进行SRV查询,然后转步骤6

5  TARGET包含的域名加上_XXX._YYY.前缀(其中XXX表示服务类型,可以取值sipsipsYYY表示传输类型,可以取值udp, tcpsctp等),然后使用加了前缀的域名进行SRV查询,并转步骤6

6  如果SRV返回了记录,记录会包含端口和最新域名,然后对最新域名进行AAAAA查询得到IP地址,如果SRV没有返回记录转步骤7

7  直接对TARGET中的域名使用AAAAA查询得到IP地址,端口则根据传输协议使用默认端口;

一个发送请求消息例子,下一跳消息的SIP URI为:sip:example,如下是向该网元发送SIP请求消息的过程:

首先对域名example进行NAPTR查询,查询的结果为:

order  pref  flags  service      regexp     replacement

IN NAPTR  50    50   "s"   "SIPS+D2T"   ""    _sips._tcp.example.

IN NAPTR  90    50   "s"   "SIP+D2T"    ""    _sip._tcp.example

IN NAPTR  100   50   "s"   "SIP+D2U"    ""    _sip._udp.example.

NAPTR返回了多条记录,根据orderpref的取值选择了第一条记录,flags表示下一步进行SRV查询,serviceSIPS+D2T表示使用TCP作为传输层协议,同时使用sips方式传输消息,replacement表示使用_sips._tcp.example进行获取目标网元的地址信息。

然后对域名_sips._tcp.example进行SRV查询,查询的结果为:

Priority   Weight  Port     Target

IN  SRV   0        1     5060    server1.example

IN  SRV   0        2     5060    server2.example

SRV返回了两条记录,根据priorityweight选择其中一条,假设选择的是第一条,那么意味这目标端口为5060Target包含了目标网元的域名server1.example

最后对域名server1.example进行AAAAA查询,得到目标网元的IP地址:

IN AAAA 5F05:2000:80AD:5800:0058:0800:2023:1D71

1.3.如何发送响应消息

一般情况下,对于可靠的传输层协议,响应消息在请求消息所在的连接上返回,对于非可靠的传输层协议,响应消息通过发送请求消息的源IP地址以及Via中的端口返回。但是如果UAC发送完请求消息后就发生了异常,UAS应当如何返回响应消息?具体包括如下过程:

1  如果Top Via包含了IP地址和端口,向该地址和端口返回响应消息

2  如果Top Via包含了IP地址,没有包含端口,使用传输层协议的默认端口返回响应消息;

3  如果Top Via包含了域名和端口,使用AAAAA查询,获得IP地址列表,然后试图向列表中的每一个IP地址发送响应消息,只到有一个发送成功为止;

4  如果Top Via包含了域名,没有包含端口,使用SRV查询,获得端口和新域名,对新域名的处理和步骤3类似;

 

虚拟号/转接号/Sip号码

你通过虚拟号,可以同时拥有北京,深圳等地的电话号码做为你的客服电话号码,这样,给客户的感觉,这是一家较大的企业。而实际上,你所有的客服都在上海的办公室里接听全国各地的来电。 现在很多网络电话的免费服务都是有地域限制的,能够享受免费服务的国家以英、美、法等西方 发达国家居多。 虚拟号可以打破国别范围,在网络上它可以从一个国家辐射到世界各地。

美国虚拟号,说的简单一点,这就是一个可以被直接拨打的美国电话号码,网上有一些网站会提供此项功能,我选择的是 www.virtualphoneline 的服务。

5.进入 www.virtualphoneline 页面,进行帐号申请,注册过程比较常规不再赘述,推荐使用 gmail

6.获得号码后进入 http://www.virtualphoneline/MyNumbers.php 更改号码设置,Ring to Number 处进行更改,gtalk 的话可以直接选择 Google,将自己的gmail完整地址填写进去,同时 Virtualphoneline 还支持其 他的转发格式如SIP

注:Virtualphoneline 申请到的美国虚拟号是有20天左右的免费期限。如果要长期使用美国虚拟号,推荐使用 voxox ,需要短信验证或者 ipkall 的,后者的注册周期比较长,需要1-2天的审核。

 

什么是转接号呢?

转接号与虚拟号是不同的,其作用也不一样。转接号就像一个服务台,它可以把打到这个号码的电话,根据用户的需要转到指定国家的电话号码上。在网络电话中, 也有很多可以利用的免费转接号。此外,转接号的作用和类别也不尽相同,有的转接号是通用的,只要你能打通它,它都可以帮你转接;有的则是某个网络电话服务 商专门提供的,非该服务注册使用者不能使用;还有一些网络电话服务商提供专用转接号,经过事先配置,只要打到该号码的电话都会转到指定的电话号码上去。在 网络电话中,还会提到接入号,我认为它也就是转接号的另一个称呼,其作用应该是一样的

 

简单地说Sip号码是网络电话服务商提供的内部号码,网络电话服务商的内部成员或者相互有协议的服务商之间能通过网络电话软件相互通话;Sip号码不同于普通的电话号码,这个号码用普通的手机或座机是打不通的。

 

 

 

 

 

 

 

 

产品参考

http://www.dscti/506.html

 

 

参考:

sip相关参考

 

https://blog.csdn/blade2001/article/details/8954347?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-6.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-6.control

 

SIP协议二(基本呼叫流程详解)

https://blog.csdn/weixin_44209155/article/details/98722925

 

1.2 业务过程和协议流程

https://wwwblogs/lidabo/p/7486197.html

学习总结http://m.doczj/doc/1ebd5344482fb4daa48d4b4a-3.html

 

详解外网SIP呼叫的SBC/IPPBX认证流程

https://www.jianshu/p/d27abe5815a6?utm_campaign=maleskine

 

视频会议混音算法https://blog.csdn/blade2001/article/details/7163352

 


 

 

 

更多推荐

VoIP的落地通信模型和要考虑几个大的方面问题及基本概念和交互流程整理

本文发布于:2023-04-21 08:18:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/e3ea778dcbb501636b8aec27d39a744e.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:几个   基本概念   模型   流程   通信

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 92833文章数
  • 23616阅读数
  • 0评论数