sip协议详解_SIP协议详解-INVITE消息发送过程

SIP协议是VoIP中最重要的信令控制协议。SIP中第一件事情就是主叫发送INVITE给被叫,被叫响铃。本文从多角度详细描述INVITE消息发送的全过程。


一、阅读RFC权威描述

关于INVITE消息发送,先查看RFC 3261中权威描述:

INVITE client transaction: https://tools.ietf.org/html/rfc3261#page-128

  • 从TU收到发送INVITE的要求,通过transport层发出去,进入Calling状态
  • 启动Timer A,Timer A触发时发送INVITE
  • 启动Timer B,Timer B触发时通知TU
  • 网络错误或收到1xx,2xx,300-699响应时处理逻辑各不相同

6d5d71b10721921c6083b9cfe4ec0a8a.png
Figure 5: INVITE client transaction

INVITE server transaction: https://tools.ietf.org/html/rfc3261#page-136

  • 收到INVITE时,将INVITE传给TU,并进入Proceeding状态
  • 从TU收到100-199响应,通过transport层发出去
  • 在Proceeding状态收到INVITE,发送response

57ebe620394fe534802362a8aa2d8965.png
Figure 7- INVITE server transaction

很容易产生几个疑问:

  • Q1: TU是什么意思?实际中TU具体是什么?
  • Q2: 为什么要启动Timer A和Timer B?
  • Q3: 被叫收到INVITE是从哪里收到的?
  • Q4: “send 100 if TU won't in 200ms” 是什么意思?实际中是怎样的?

二、理解基础细节

Q1: TU是什么意思?实际中TU具体是什么?

TU是Transaction User的缩写,表示的是使用Transaction层服务的上层模块。从RFC 3261的 5 Structure of the Protocol 小节可以知道:SIP协议是分层阐述的,总结如下图:

072a14fc70aa1e10c2bb1d7e37946cfc.gif

从上图可知,Transaction层上面是Core层,所以TU就是Core层。对于主叫端是UAC Core,对于被叫端是UAS Core,对于代理服务器就是Proxy Core。如下面两图所示:

b964ba2a6226eedac69a20671da6cbb8.gif

b41656ac3df59d24a5698fd103689334.gif

Q3: 被叫收到INVITE是从哪里收到的?

从上面的分层描述总很容易看出:被叫收到INVITE是从Transport Sublayer收到的,而Transport Sublayer是从具体使用系统网络传输层如UDP或TCP层收到的。

小结:

将上面两个状态机和相关SIP消息综合在一起,可以得到下图:

db71bf7f374816443cebe0f9ec023de4.png
INVITE client and server transaction

三、理解关键设计

第一节阅读RFC时产生的疑问Q2和Q4都涉及到timer,为什么要引入这些timer呢?

这就涉及到SIP协议设计上对底层网络的假设。RFC 3261中明确表示:

SIP works with both IPv4 and IPv6.

即SIP是设计运行在IP网络协议之上的(SIP最初设计就是为VoIP服务的)。

SIP协议对网络传输层没有可靠性的要求,在不可靠的传输层如UDP上可以良好地工作。

所以SIP就要自己保证信令消息的可靠性传输,这也是SIP Transaction层的主要职责:消息丢失重传、消息去重。自然地,SIP Transaction层的状态机就要通过timer来实现重传,通过状态迁移实现去重。具体解释如下:

Q2: 为什么要启动Timer A和Timer B?

Timer A的工作逻辑:发出第一次INVITE请求,在超时时间(第一次是0.5秒)内未收到任何响应,则Timer A触发,此时发出第二次INVITE请求,将超时时间加倍后(0.5x2=1秒)重新计时,超时未收到任何响应,则Timer A再次触发INVITE的发送,依此类推,每次Timer A超时时间加倍。

这样Timer A就实现了以经典的指数型延迟重试策略来确保INVITE的发送和响应接收

  • 如果INVITE发送失败,如下图F01,则Timer A会触发INVITE请求重发
  • 如果INVITE发送成功,但响应返回途中丢失,如下图F05,则Timer A也会触发INVITE请求重发,UAS收到重复的INVITE请求后,保持状态为Proceeding不变,重新发送响应给UAC

789279f77fdf08ebfa69412db8e64d60.png
INVITE client and server transaction with timers

上面解释了Timer A的作用:确保INVITE成功送达且成功收到响应。

那么Timer B呢,很简单,在无网或者网络很差的情况下,INVITE不应无限重发,这就是Timer B的作用,当Timer B超时(RFC建议为32秒)触发时,则停止发送,给TU报告发送失败。

Q4: “send 100 if TU won't in 200ms” 是什么意思?实际中是怎样的?

在RFC 17.2.1 INVITE Server Transaction 中有明确说明:

When a server transaction is constructed for a request, it enters the
"Proceeding" state. The server transaction MUST generate a 100
(Trying) response unless it knows that the TU will generate a
provisional or final response within 200 ms, in which case it MAY
generate a 100 (Trying) response. This provisional response is
needed to quench request retransmissions rapidly in order to avoid
network congestion.

简单来说,如果transaction知道TU不会在200毫秒内发送一个响应,那么transaction应立刻回一个100 Trying响应,以便告知发送方自己已经接收到INVITE请求了,请不要重传INVITE了。这样可以降低网络拥堵。

要回答实际中UAS是否会发100 Trying响应,要看端到端的消息发送过程了。我们看常见的 “客户端 - 服务端 - 客户端” 的网络拓扑下的情况:

25081ce15f42002eddc752fd8b7725a8.png

从上图可以看到:从主叫客户端UAC到服务端,服务端要转发给被叫客户端,服务端无法确定多久能转发完成,于是在F02步骤立刻回复主叫客户端UAC一个100 Trying响应,告诉主叫:

我收到你的INVITE了,我在努力发送给被叫,请不要重发INVITE了

然后我们看被叫客户端UAS在F04步骤收到INVITE请求,被叫的transaction知道其TU即UAS Core会立即响应一个180 Ringing,所以被叫客户端UAS不会回复服务端100 Trying响应。


总结一下整个INVITE发送到响铃的过程如下图:

16ea79bd8d48e2454b67a9d04eb1675a.png

要点如下:

  • 通过Timer A和B来保障消息可靠送达
  • 通过状态机来实现消息去重

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【杭州云栖】飞天技术汇CDN与边缘计算专场:让内容离消费者更进一步

【杭州云栖】飞天技术汇CDN与边缘计算专场:让内容离消费者更进一步 在5G移动通信、IoT万物智联时代即将到来的大背景下,越来越多的应用和数据来自边缘位置,呈现低延时、高带宽、大连接、本地化的业务特征,那么如何协同阿里云全球…

迈克尔·戴尔再次到访2019戴尔科技峰会,为“戴尔中国4.0+战略”加个码……

10月25日,以“拓界成真”为主题的2019戴尔科技峰会在北京国家会议中心隆重举行。戴尔科技集团董事长兼首席执行官迈克尔戴尔出席峰会,发表主题演讲,见证集团与多个地方政府、高校、企业签署战略合作协议,并与教育部领导一起&#…

【杭州云栖】边缘计算ENS:拓展云的边界

在9月19日下午的杭州云栖大会飞天技术汇-CDN与边缘计算专场中,阿里云边缘计算团队的高级技术专家王广芳,从边缘计算的定义、场景的需求和挑战、ENS产品的价值及能力,以及典型的应用场景和案例等几个方面,详细解读了阿里云对于边缘…

Centos7 解决Docker拉取镜像慢的问题

配置加速Docker镜像源 vi /etc/docker/daemon.json在配置文件中加入 {"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"] }[rootkm docker]# systemctl daemon-reload [rootkm docker]# systemctl restart dockerhttps://cr.console.aliyun.com…

你的食物变质没?用AI算法来检测一下吧

最近一条幼儿园采用过期食物的新闻引起了社会的强烈关注,对于食品安全而言,国家一直是严格要求的,尤其是对于婴幼儿食品安全的标准,部分已经超越了国际上的标准。但可能是由于无法严格地执行到每一个地方且检测周期较长&#xff0…

CAS项目部署和基础操作

文章目录一、部署cas1. 复制cas.war到webapps2. 登录页面二、CAS服务端配置2.1. 添加用户2.2. 端口修改2.3. 去除https认证一、部署cas 1. 复制cas.war到webapps 把cas.war放到tomcat的webapps下面启动Tomcat即可 2. 登录页面 二、CAS服务端配置 2.1. 添加用户 找到指定文…

基于POLARDB数据库的压测实践

POLARDB架构简介 PolarDB是阿里云ApsaraDB数据库团队研发的基于云计算架构的下一代关系型数据库(暂时仅支持MySQL,PostgreSQL正在紧锣密鼓的开发中),其最大的特色是计算节点(主要做SQL解析以及存储引擎计算的服务器)与存储节点(主要做数据块存储&#x…

戴尔科技:以技术突破创新边界!

2019戴尔科技峰会今天在北京隆重举行,戴尔科技集团与数千位全国企业级精英、合作伙伴、业内专家、媒体及分析师代表等齐聚一堂,分享了在5G、云计算、存储、数据保护、服务器等领域的最新技术产品、最佳实践经验及最新发展趋势。此次峰会还完整地展示了戴…

让你久等了!《码出高效:Java 开发手册》正式发布

可爱的Java开发者们,让你们久等了! 9月22日杭州云栖大会,众所期待的新书《码出高效:Java 开发手册》正式发布,并宣布将所有图书收益捐赠于公益项目。 此书从立意到付梓,历时超过两年,期间推翻数…

python中is和 的区别_Python中is和==的区别

"""is和 的区别"""a abcb abcprint("都是字符串-a is b--", a is b)print("都是字符串-a b--", a b)c 11d 11print("都是数字-c is d--", c is d)print("都是数字-c d--", c d)e [0, 1, 2]f …

(Docker实战) 第1篇:Centos7 环境准备和安装Docker-ce

文章目录一 、安装docker1. 卸载以前安装的docker2. 安装必要的系统工具4. 更新yum缓存5. 安装docker6. 更改docker仓库为国内仓库7. 重启docker8. 安装docker-compose一 、安装docker docker优点 快速上手新技术,把精力放在业务上而非安装和配置服务器快速搭建开发…

初入数据科学领域,你需要有七个这样的思维

假设你刚刚被一家小型软件公司聘为数据科学家。你感到欣喜若狂!你的辛勤工作和坚持不懈终于得到了回报。是时候将你的统计数据和机器学习知识付诸实践了。那么恭喜你终于加入了数据革命。 第1天到来,每个人都很高兴见到这位“数据科学家”。该公司以前从…

输入文字自动生成图片_原来Word还可以自动生成图片和图表目录!

小李接到了一个任务,将技术文档中的示意图目录做出来,让客户能根据需求快速找到操作示意图,可是这份文档有三百多张图片,不过,这可难不倒小李。说到Word目录,大多数人都知道,可以为文档的标题设…

反转!物联网火爆,开发者却很难入门?

在 2019 北京网络安全大会上,工信部负责人表示,我国面向 5G 和车联网将建设网安防护体系,提升监测预警和应急响应能力。其中物联网设备已成为网安防护新重点。为什么工信部会这么重视物联网?物联网开发者的现状又是如何呢&#xf…

如何深度理解RNN?——看图就好!

欢迎来到循环神经网络的插图指南。我是迈克尔,也被称为LearnedVector,我是AI语音领域的机器学习工程师。如果你刚刚开始使用ML并希望在Recurrent神经网络背后获得一些直觉,那么这篇文章就适合你。 循环神经网络是一种强大的技术,…

java有string这个类型吗_关于java的String类型

String类型的不可变众所周知,String类型是不可变的,一旦String对象被创建好了则这个字符串中的序列就不可改变。为什么String类型是不可变?根据阅读源码可知,String类是一个final类,但是String不可变并不是因为它是一个…

理论与实践:如何从Hadoop迁移到MaxCompute

直播视频回看,传送门!分享资料下载,传送门!更多精彩内容传送门:大数据计算技术共享计划 — MaxCompute技术公开课第二季 以下内容根据演讲视频以及PPT整理而成。 通常而言,将Hadoop迁移到MaxCompute会分为…

rocketmq原理_彻底看懂RocketMQ事务实现原理

面试中经常会问到比如RocketMQ的事务是如何实现的呢?学习框架,我们不仅要熟练使用,更要掌握设计及原理,才算熟悉一个框架。1 RocketMQ 事务使用案例public class CreateOrderService { Autowired private OrderDao orderDao; A…

要活 102 年,阿里凭借的是什么?

戳蓝字“CSDN云计算”关注我们哦!作者 | 屠敏责编 | 阿秃由浅到深、由轻到重、由拥抱到创新,看似“风平浪静”的历史背后,中国互联网江湖的发展实则“波涛汹涌”。对于身处核心位置的科技巨头阿里巴巴而言,将如何更好地去实现“希…

阿里云 x 蒙牛 | 打通数据孤岛,基于MaxCompute实现产销协同的智慧运营

每一个公司转型的背后 都有着不为人知的秘密 今天,让我们一起探秘 内蒙古蒙牛乳业(集团)股份有限公司是中国发展速度最快的乳品企业之一,2017年实现收入601.56亿元,位列全球乳业第10位,与2016年同比收入增…