Sipdroid实现SIP(六): SIP中的请求超时和重传
目录
一. Sipdroid的请求超时和重传
二. SIP中超时和重传的定义
三. RFC中超时和重传的定义
一. Sipdroid的请求超时和重传
Sipdroid实现SIP协议栈系列, 之前的文章仅涉及了SIP消息的基本概念, 比如:
- 请求型消息: INVITE, REGISTER...
- 应答型消息: 100 Trying, 180 Ringing, 200 OK, BYE, ACK...
- 携带SDP信息
- 携带认证信息
这篇文章更深入一些, 介绍了SIP作为一种可靠传输, 涉及到的超时和重传机制. 也是在调试bug时发现的新大陆.
1.1 出现的问题
注册在同一个SIP Server的两个SIP Client互相呼叫时, 会话建立前的SIP信令一切正常, 双发也开始响铃, 但是被叫5s内不接听或拒接, 主叫就会发送CANCEL, 被叫就会回复100 Trying + 487 + 200 OK, 然后会话中断. 也就是响铃时间只有5s, 主叫就取消了呼叫.
1.2 初步推测
- 被叫回复的100 Trying和180 Ringing都没有收到?
- 服务器转发的被叫回复的100 Trying和180 Ringing都没有收到?
- 主叫的代码里是否有修改响铃时间的参数?
- 主叫本地有什么超时CANCEL的机制被魔法般地启动了?
1.3 解决方法
从主叫对象ua开始追踪基类: UA->InviteDialog->InviteTransactionClient, 发现在发送各类请求msg前有一个线程类InnerTimer对象的启动, 这个线程的休眠时间, 就是响铃时间.
1.4 问题原因
Sipdroid的请求超时参数设置错误. RFC推荐的32000被设置成5000, 导致INVITE请求在5s内没有收到200 OK回执, 就被视为超时, 主叫主动CANCEL了呼叫请求. 要修改的代码在SipStack类里, 该类描述了SIP协议栈的一些基本属性, 包括SIP默认使用端口, 默认传输协议, 默认超时时间等. 修改参数如下:
/**
* starting retransmission timeout (milliseconds); called T1 in RFC2361;
* they suggest T1=500ms
*/
public static long retransmission_timeout = 2000; /**
* maximum retransmission timeout (milliseconds); called T2 in RFC2361; they
* suggest T2=4sec
*/
public static long max_retransmission_timeout = 16000; /** transaction timeout (milliseconds); RFC2361 suggests 64*T1=32000ms */
//public static long transaction_timeout = 5000;[CHG]这里应该修改为RFC推荐值
public static long transaction_timeout = 32000; /** clearing timeout (milliseconds); T4 in RFC2361; they suggest T4=5sec */
public static long clearing_timeout = 5000;
一直知道TCP协议里有重传算法, 确保了传输可靠性, 而且是应用层基本无法质疑的可靠.
在有超时机制的msg发送前, 初始化类对象, 它们一般会被命名为transaction
class InnerTimer extends Thread {
    long timeout;
    InnerTimerListener listener;
    public InnerTimer(long timeout, InnerTimerListener listener) {
        this.timeout = timeout;
        this.listener = listener;
        start();
    }
    public void run() {
        if (listener != null) {
            try {
                Thread.sleep(timeout);
                listener.onInnerTimeout();
            } catch (Exception e) {
                e.printStackTrace();
            }
            listener = null;
        }
    }
}
class InnerTimerST extends java.util.TimerTask {
    static java.util.Timer single_timer = new java.util.Timer(true);
    // long timeout;
    InnerTimerListener listener;
    public InnerTimerST(long timeout, InnerTimerListener listener) { // this.timeout=timeout;
        this.listener = listener;
        single_timer.schedule(this, timeout);
    }
    public void run() {
        if (listener != null) {
            listener.onInnerTimeout();
            listener = null;
        }
    }
}
参考
[1] [SIP协议]学习初学笔记
Sipdroid实现SIP(六): SIP中的请求超时和重传的更多相关文章
- 解决在vue中axios请求超时的问题
		查看更多精彩内容请访问我的新博客:https://www.cssge.com/ 自从使用Vue2之后,就使用官方推荐的axios的插件来调用API,在使用过程中,如果服务器或者网络不稳定掉包了, 你们 ... 
- angular学习笔记(二十六)-$http(4)-设置请求超时
		本篇主要讲解$http(config)的config中的timeout项: $http({ timeout: number }) 数值,从发出请求开始计算,等待的毫秒数,超过这个数还没有响应,则返回错 ... 
- Mac-App Store 购买过程中出错 请求超时
		打开终端 输入下面命令回车: defaults delete com.apple.appstore.commerce Storefront 接上步骤,继续输入下面命令回车: defaults writ ... 
- vue-resource请求超时timeout设置
		请求超时设置通过拦截器Vue.http.interceptors实现具体代码如下 main.js里在全局拦截器中添加请求超时的方法 方法1:超时之后会调用请求中的onTimeoutd方法,then方法 ... 
- Android 网络请求超时处理方案
		以用户登录为例介绍用户访问网络时的请求超时处理的两种方法: 1)使用android提供的工具类AsyncTask类,此类提供了一个AsyncTask.execute().get(timeout, un ... 
- 使用VSTS的Git进行版本控制(六)——拉取请求
		使用VSTS的Git进行版本控制(六)--拉取请求 在将代码合并到主干之前,拉取请求让团队对特性分支的更改提供反馈.审阅人可以通过建议修改留下评论,并投票批准或拒绝代码. 任务1:在Visual St ... 
- Open Source VOIP applications, both clients and servers (开源sip server & sip client 和开发库)
		SIP Proxies SBO SIP Proxy Bypass All types of Internet Firewall JAIN-SIP Proxy Mini-SIP-Proxy A very ... 
- charles 抓取eclipse中的请求
		charles抓取eclipse中的请求 有时候,想要监测eclipse中发送get获取post请求,一样可以使用代理方式: 1.eclipse代码设置 代码中添加,可以就写在主函数中,然后再调用请求 ... 
- web过滤器中获取请求的参数(content-type:multipart/form-data)
		1.前言: 1.1 在使用springMVC中,需要在过滤器中获取请求中的参数token,根据token判断请求是否合法: 1.2 通过requst.getParameter(key)方法获得参数值; ... 
随机推荐
- CentOS下JAVA WEB 环境搭建
			首先介绍下我的软件环境.虚拟机Vmware9.0(已经汉化),CentOS6.4(选择安装语言为简体中文),xshell4.0(强大的安全终端模拟软件),xftp4.0(FTP工具). 方便大家环境搭 ... 
- 国内外最全面和主流的JS框架与WEB UI库
			当下对于网站前段开发人员来说,很少有人不使用一些JS框架或者WEB UI库,因此这些可以有效提高网站前段开发速度,并且能够统一开发环境,对于不同浏览器的兼容性也不需要程序员操心,有了这些优点,当然大家 ... 
- 网页头一定要加的代码段(加注版)一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
			网页头部常见的一段代码 <!--[if lt IE 7 ]><html class="ie6"><![endif]--> <!--[i ... 
- Amazon前技术副总裁解剖完美技术面试
			Amazon前技术副总裁解剖完美技术面试 投递人 itwriter 发布于 2014-03-03 14:30 评论(0) 有1729人阅读 原文链接 [收藏] « » 英文原文:The Anat ... 
- 监听JVM关闭
			使用Runtime的addShutdownHook(thread)方法: for(int i=0; i<5; i++){ System.out.println(i); } Thread th = ... 
- c#XML配置文件辅助类
			在开发中经常会用到各种kv类型的配置 文件,像这样的 <?xml version="1.0" encoding="utf-8" ?> <sou ... 
- c# 控制职能运行单一实例,再次运行显示已经运行的实例
			有这么个需求,软件只能运行一个实例,软件运行后可以让其隐藏运行 再次运行这个软件的时候就让正在运行的实例显示出来 ================================= 当软件隐藏后没办法 ... 
- JVM内存划分
			JVM内存划分吗? 前言: 大家都知道虚拟机,都知道JVM,其实这些都是基于sun公司[oracle公司]的HotSpot虚拟机,当然本篇博文也是以sun公司为基础.还有其他的虚拟机,常见的就有JRo ... 
- 测试Data ORM的性能
			闲着无聊,测试了一下公司ORM的性能,和其它的ORM相比,该有的都有了,不该有的也勉强塞了进去,总体考虑是并发与扩展性问题,譬如读写分离,消息总线服务整合,缓存内置. 测试机是I7,16G内存,这里只 ... 
- MyEclipse修改默认的workspace路径
			在此只提供一个自己认为可行的办法(已验证可行) 已MyEclipse8.5为例 打开安装路径C:\Program Files\Genuitec\MyEclipse 8.5\configuration下 ... 
