目录

一. 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. 通过SqlClr制作Sql自动化批量执行脚本

    原文:通过SqlClr制作Sql自动化批量执行脚本 通过SqlClr制作Sql自动化批量执行脚本 在与同事一起做项目时,看到同事用sqlclr做批量执行脚本,感觉挺新奇的就上网搜集资料自己模仿跟做了个 ...

  2. 33、Python.Unix和Linux系统管理指南.(美)基弗特

  3. ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork 制作一个添加新闻功能

    本文将交大伙怎么集成ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork来制作一个新闻系统 先上截图: 添加页面如下: 下面来看代码部分 列表页如下: @ ...

  4. 序列化(ObjectOutputStream和ObjectInputStream)(切记:out是输出到本地中,in是输入到程序中)

    注意:序列化自定义类必须实现一个接口Serializable,在c#中序列化自定义类是使用特性也就是[Serializable] //要实现序列化的类 public class Student imp ...

  5. Asp.Net异步编程

    Asp.Net异步编程-使用了异步,性能就提升了吗? Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出 ...

  6. DefaultModelBinder

    Asp.net MVC的Model Binder工作流程以及扩展方法(3) - DefaultModelBinder Default Binder是MVC中的清道夫,把守着Model Binder中的 ...

  7. 创建FTP的Site并用C#进行文件的上传下载

    创建FTP的Site并用C#进行文件的上传下载 文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服 ...

  8. MVC中用Jpaginate分页

    MVC中用Jpaginate分页 So easy!(兼容ie家族)   看过几款分页插件,觉得Jpaginate比较简约,样式也比较容易的定制,而且体验也比较好,支持鼠标滑动效果.先上效果图: 整个过 ...

  9. Day3:T3DP T4堆排序

    QAQ因为T3的题解说的不是很清楚,但是blogs又不能按照自己想要的顺序排+略有一点强迫症 所以先挖个坑放着,过几天再补上

  10. GNU Make 学习系列一:怎样写一个简单的Makefile

    编程通常遵循一个相当简单的程序:编辑源文件,编译源代码成可执行的格式,调试结果.尽管将源代码翻译成可执行程序是常规的过程,如果做的不正确,程序员可能会浪费大量的时间去追踪问题.大多数的开发者都经历过这 ...