Sipdroid实现SIP(六): SIP中的请求超时和重传-程序员宅基地

技术标签: java  网络  

目录

一. 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协议]学习初学笔记

 

转载于:https://www.cnblogs.com/elsarong/p/6246075.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30460489/article/details/95955781

智能推荐

51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)_51单片机电子时钟-程序员宅基地

文章浏览阅读3.4w次,点赞72次,收藏925次。51单片机数字闹钟_51单片机电子时钟

HTML+CSS+JavaScript网页特效源代码(复制代码保存即可使用)_var speednormal-程序员宅基地

文章浏览阅读1w次,点赞196次,收藏842次。网页特效源代码(HTML+CSS+JavaScript)网页特效源代码_var speednormal

VMware虚拟机按照MacOS的一些可能的问题_sierra custom installer"上没有足够的可用空间来进行安装-程序员宅基地

文章浏览阅读347次。一直对MacOS的系统非常感兴趣,最近就鼓捣了一台MacOS的虚拟机,写一篇文章来简单记录一下安装过程中的遇到的问题。_sierra custom installer"上没有足够的可用空间来进行安装

Laravel框架之调取微信公众号第三方接口_laravel 对接第三方接口一般放哪里-程序员宅基地

文章浏览阅读1k次。使用laravel框架来开发微信公众号其实也很简单,我之前已经写过一篇关于授权微信公众号获取用户基本信息的文章,再次也就不多说了,如果想了解的话,可以查看:授权微信查看个人基本信息我们使用laravel框架开发微信公众号,可以直接放在public目录下,然后通过输入相应的目录名字,也可以直接复制微信提供的api进行封装注意:要将$postStr改成$postStr = file_get_co..._laravel 对接第三方接口一般放哪里

Labview队列使用方法----一文读懂队列底层原理及用法-程序员宅基地

文章浏览阅读2.3k次,点赞35次,收藏41次。题主非常详细的介绍了队列的原理及使用方法,帮助读者在原理上深刻理解队列的底层逻辑,并介绍了队列使用时的注意事项。后续将更新更多相关文章记得点赞加关注,谢谢~_labview队列

教你用Python爬取哔哩哔哩全站视频信息_b站访问权限不足爬虫-程序员宅基地

文章浏览阅读1.8k次。哔哩哔哩全站视频信息爬虫(可能会漏爬)B 站感觉最近几年发展得太快了,不由得想知道有多少视频,翻阅了一大半网络找了很多爬虫感觉都不是特别的复合自己的胃口(挑食~),于是自己写一个(才学习爬虫没多久写得垃圾代码大佬别喷我啊….)很多人学习python,不知道从何学起。很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。很多已经做案例的人,却不知道如何去学习更加高深的知识。那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!??¤QQ群_b站访问权限不足爬虫

随便推点

没戏,做不到,不存在的“不可能三角”-程序员宅基地

文章浏览阅读332次。“有得必有失”在各个领域里都会有体现,于是,我们有了很多的“不可能三角”。设计领域:好看,便宜,快速这个不用解释,看图就行。金融领域:资本自由流动、汇率稳定、货币政策独立..._好看 便宜 快速 不存在

编程环境安装指南:Java、Python 和 Burp Suite抓包工具_python burpsuite 免费使用,安装-程序员宅基地

文章浏览阅读943次,点赞2次,收藏4次。Java环境安装、python环境安装、Burpsuite安装_python burpsuite 免费使用,安装

This beta version of Typora is expired, please download and install a newer version. 解决方案-程序员宅基地

文章浏览阅读2.4w次,点赞135次,收藏153次。今日打开 Typora 软件时,突然报错,提示软件版本已过期,需要安装新版本,如下图所示。关闭错误提示框后会自动跳转到:https://typora.io/#download。根据博文里修改系统时间的方法1,我们知道 Typora 打开时会获取系统时间,然后判断是否过期。打开 Typora 的缓存目录:,如下图:发现有两个文件在软件打开后会被修改,因此可能与获取系统时间相关。综合网络上的方法,主要有以下几种:打开前修改系统时间正常打开 Typora,此时进入 目录发现,部分软件的修改日期变成了修_this beta version of typora is

Linux Samba 出现:访问samba服务器错误:"您可能没有权限使用网络资源"-程序员宅基地

文章浏览阅读1k次。访问samba服务器错误:"您可能没有权限使用网络资源"(2010-09-18 15:09:56)转载<!-- 正文开始 -->在使用Samba进行建立Window与Linux共享时,要是不能访问,出现“您可能没有权限使用网络资源”,那就是SELinux在作怪了[SELinux(Security-Enhanced Linux) 是美国国家安全局(..._你可能没有权限使用网络资源. nas

JAVA_Quartz框架初探_java quartz框架-程序员宅基地

文章浏览阅读110次。JAVA Quartz框架一种定时器,相当于加强版本的java.unti.Timer。支持集群。在使用这个框架之前需要先链接几个概念:** 触发器 Trigger**: 什么时候工作* Trigger 就是触发器的意思,用来指定什么时间开始触发,触发多少次,每隔多久触发一次。SimpleTrigger 可以方便的实现一系列的触发机制。* Cron 是Linux下的一个定时器,功能很强大..._java quartz框架

推荐文章

热门文章

相关标签