首页 > 其他分享 >osip 重复报文发送问题记录

osip 重复报文发送问题记录

时间:2023-03-22 19:32:14浏览次数:44  
标签:状态机 transaction invite 报文 osip T1 发送 TIMEOUT

场景

拱墅项目,国标服务每次发送SIP报文都出现重复的情况,服务器IP地址:

33.86.188.60,下级国标服务IP地址:33.88.0.211

osip 重复报文发送问题记录_osip  重发 事务

针对下级发送过来的心跳保活报文,回复的200 OK的报文也是一样重复的

两个数据包之间的时间间隔是18微妙,还不到一毫秒。

疑窦

按照osip重发的逻辑,至少也要等500毫秒才会重发

osip库数据重发解读

osip库超时重传的时间间隔是500ms,相关代码在osip2/osip.h文件中:

#define DEFAULT_T1 500          /* 500 ms */

当需要创建新的ICT的transaction时,TIMEOUT_B被启动,时长为64*DEFAULT_T1(DEFAULT_T1为500ms),TIMEOUT_B为整个transaction的生命周期时长,如果超过这个时间,transaction会被结束。

如果传输层是没有传输保证的UDP,则设置TIMEOUT_A、TIMEOUT_D的间隔时间为DEAULT_T1和64*DEFAULT_T1;

TIMEOUT_A管理Invite的发送,发送时启动TIMEOUT_A,如果超时还没收到response,则重发该Invite;

TIMEOUT_D管理ACK

INVITE事务处理逻辑

首先系统调用osip_transaction_init产生一个新的状态机。在发送invite请求的时候,这个状态机是ICT (带invite的client端状态机)。状态机产生后,系统调用函数把消息扔给状态机处理, osip_transaction_add_event负责把消息插到队列中,

A的ICT状态机调用ict_snd_invite函数发送invite包给对方,状态机自身从初始状态跳转到calling状态, 等待对方回应,并设置响应的A超时(重发invite)和B超时(结束本次请求),当A超时到达的时候, 向对方重发一次数据包,并且把A时间的时间增加一倍(最长为4S,如果超过4S,将不再增加)。 当B时间到达后,系统认为对方没有响应,则释放资源,结束本次操作。










标签:状态机,transaction,invite,报文,osip,T1,发送,TIMEOUT
From: https://blog.51cto.com/fengyuzaitu/6143121

相关文章

  • golang解决kafka消息重复发送和重复消费
    1、解决消息重复发送当使用Kafka生产者发送消息时,可以设置消息的Key,使用Key来保证相同Key的消息不会被重复发送。在发送消息时,可以使用带Key的消息发送方式,如下所示:msg......
  • spring MVC 中json格式数据发送与接收
    在web程序开发中,前端和服务器数据的传输方式常用的有两种,一种是以表单的形式提交,此时可以利用jquery的serialize()方法将表单内容转为a=1&b=2&c=3&d=4&e=5这样的格式传输过......
  • java通过短信发送验证码
    /**如uid是:test,登录密码是:123123pwd=md5(123123test),即pwd=b9887c5ebb23ebb294acab183ecf0769线生成地址:http://www.sms.cn/password*/......
  • #yyds干货盘点#php curl发送post请求,向接口发送请求并返回数据
    在微信开发中,很多请求都是用curl实现的,并不是跳转的curl或者ajax。index.php<?php//api接口$url="server.php";//发送请求functionhttpGet($url){$curl=curl_init(......
  • java发送验证码
    导入maven包(commons-email)<dependency><groupId>org.apache.commons</groupId><artifactId>commons-email</artifactId><version>1.5</version></......
  • Jenkins - 发送邮件扩展
    下载插件:emialexthttps://plugins.jenkins.io/email-ext/插件市场无法下载最新版本,去发布版本中找一个较老的版本,2.86下载到本地,进行安装。系统设置-插件管理-高......
  • Node向Mysql数据发送请求响应请求
    //导入mysql依赖(想要先安装依赖,在终端输入:npminstallmysql)varmysql=require('mysql');//配置mysql的数据信息varmy=mysql.createConnection({//mysql连接地址......
  • Node向后端发送请求响应请求
    //导入模块(请求是http)//Node.js//理解:Node.js和jdk差不多是一样的道理,是基于coogle的v8引擎//在控制台进行打印node运行方式:node文件名称nodeHello.jsconsthttp=requ......
  • 如何向Teams发送Azure服务运行状况通知
    在本文中,我们将向大家演示如何将MicrosoftAzureServiceHealth的警报信息发送到MicrosoftTeams,以便于公司的Azure运维团队可以在Azure资源出现问题时可以及时收到通知。......
  • jmeter发送http请求
    一、发送get请求1、发送get请求时,参数有两种构造方式,一个是通过请求体的方式传递,一个是将参数与url放一起进行传递  二、发送post-json请求 ......