目录

一. 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中的请求超时和重传的更多相关文章

  1. 解决在vue中axios请求超时的问题

    查看更多精彩内容请访问我的新博客:https://www.cssge.com/ 自从使用Vue2之后,就使用官方推荐的axios的插件来调用API,在使用过程中,如果服务器或者网络不稳定掉包了, 你们 ...

  2. angular学习笔记(二十六)-$http(4)-设置请求超时

    本篇主要讲解$http(config)的config中的timeout项: $http({ timeout: number }) 数值,从发出请求开始计算,等待的毫秒数,超过这个数还没有响应,则返回错 ...

  3. Mac-App Store 购买过程中出错 请求超时

    打开终端 输入下面命令回车: defaults delete com.apple.appstore.commerce Storefront 接上步骤,继续输入下面命令回车: defaults writ ...

  4. vue-resource请求超时timeout设置

    请求超时设置通过拦截器Vue.http.interceptors实现具体代码如下 main.js里在全局拦截器中添加请求超时的方法 方法1:超时之后会调用请求中的onTimeoutd方法,then方法 ...

  5. Android 网络请求超时处理方案

    以用户登录为例介绍用户访问网络时的请求超时处理的两种方法: 1)使用android提供的工具类AsyncTask类,此类提供了一个AsyncTask.execute().get(timeout, un ...

  6. 使用VSTS的Git进行版本控制(六)——拉取请求

    使用VSTS的Git进行版本控制(六)--拉取请求 在将代码合并到主干之前,拉取请求让团队对特性分支的更改提供反馈.审阅人可以通过建议修改留下评论,并投票批准或拒绝代码. 任务1:在Visual St ...

  7. 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 ...

  8. charles 抓取eclipse中的请求

    charles抓取eclipse中的请求 有时候,想要监测eclipse中发送get获取post请求,一样可以使用代理方式: 1.eclipse代码设置 代码中添加,可以就写在主函数中,然后再调用请求 ...

  9. web过滤器中获取请求的参数(content-type:multipart/form-data)

    1.前言: 1.1 在使用springMVC中,需要在过滤器中获取请求中的参数token,根据token判断请求是否合法: 1.2 通过requst.getParameter(key)方法获得参数值; ...

随机推荐

  1. 值为NULL的对象指针

    相信大家对NULL不会很陌生,NULL 是一个标准规定的宏定义,用来表示空指针常量,当一个指针变量被赋值为NULL时,表示它不再指向任何有效地址,无法在访问任何数据.在VS2012库文件stdio.h ...

  2. oracle实现自加力id

    --oracle实现自加力id --创建一个T_StudentInfo表 create table T_StudentInfo ( "id" integer not null pr ...

  3. 如何给TableLayout加边框

    呵呵,其实很简单 就是将TableLayout定义一种颜色,在给TableRow定义一种颜色.通过TableRow的layout_margin挤出一个像素的宽度就变成了TableLayout的宽度.这 ...

  4. SongTaste音乐下载器

    SongTaste音乐下载器 Songtaste是一个非常好的音乐推荐网站, 奈何和duomi搅合在一起, 导致下载音乐非常的麻烦, 现在写了一个简单的"下载器", 通过它可以下载 ...

  5. 推送之HelloWorld及个推Smart Push

    最近有个朋友想要推送一些消息到自己的APP上,自己用了HTTP轮询的方式比较耗电,也比较占用流量,一旦用户关闭了进程,消息则很难触达,于是,咨询我有没有什么好的解决方案.我告诉他其实可以使用推送,他瞪 ...

  6. Objective-c 总结(一):OC类的设计

    (一)学习目标: 1.面向对象基本概念: OOP的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在整个解决问题步骤中的行为. 2.熟悉OC类的定 ...

  7. xquery

    XQuery 相对于 XML,等同于 SQL 相对于数据库.设计用来查询 XML 数据.- 不仅仅限于 XML 文件,还包括任何可以 XML 形态呈现的数据,包括数据库. FLWOR 是 " ...

  8. 原生Js 两种方法实现页面关键字高亮显示

    原生Js 两种方法实现页面关键字高亮显示 上网看了看别人写的,不是兼容问题就是代码繁琐,自己琢磨了一下用两种方法都可以实现,各有利弊. 方法一 依靠正则表达式修改 1.获取obj的html2.统一替换 ...

  9. 测试驱动 ASP.NET MVC 和构建可测试 ASP.NET MVC 应用程序

    [测试驱动 ASP.NET MVC] http://t.cn/8kdi4Wl [构建可测试 ASP.NET MVC 应用程序]http://t.cn/8kdi4Wj

  10. 【转】Objc的底层并发API

    本文由webfrogs译自objc.io,原文作者Daniel Eggert.转载请注明出处! 小引 本篇英文原文所发布的站点objc.io是一个专门为iOS和OS X开发者提供的深入讨论技术的平台, ...