SIP协议的INVITE消息发起流程

当通过sip协议发起一个会话时,需要通过invite消息实现该流程。而SIP协议是一个基于事务的协议,每一个sip会话的都是通过sip部件间的一系列消息来完成的。首先需要明确的重要概念就是事务。

事务

在SIP协议中,一个事务是指完成一次消息交互的整个流程。以INVITE消息为例,一个基于代理服务器交换信令和语音视频数据包的事务模型如下图所示:

如图所示,对于1003来说,虚线框内的从INVITE消息到代理服务器回送的200OK整个消息交互流程称为一个客户端事务,而对于1005来说,虚线框内的从INVITE消息到代理服务器回送的200OK整个消息交互流程称为一个服务器事务。

不管是客户端事务还是服务器事务,都必须维护一个有限状态机,记录当前事务的进展情况,事务和其状态机的维护,构成了一款SIP终端软件最重要的一部分。

客户端INVITE事务的状态转换如上图所示。

当用两个终端发起INVITE呼叫时,用wireshark抓包得到的结果如下图所示:

其中ip:192.168.1.33是代理服务器的地址,ip:192.168.1.104是客户端sip终端的地址。这里,代理服务器的作用相当于一个UAS。这里总共有两个事务流程,整个过程如下:

a)        Sip终端在地址192.168.1.104向服务器发起一个会议3000的INVITE消息,客户端进入calling状态,启动A和B的定时器,用于INVITE消息的超时重传。

b)        服务器发送100/trying,客户端收到后进入proceeding状态,取消A和B定时器。

c)        服务器发送407要求认证,客户端进入Completed状态。

d)        客户端通过ACK发送认证信息。

e)        进入Terminated状态后销毁该事务。

到此为止,一个客户端INVITE事务结束。

a)        Sip终端在地址192.168.1.104再次向服务器发起一个会议3000的INVITE消息,启动A和B的定时器,用于INVITE消息的超时重传

b)        服务器发送100/trying,客户端收到后进入proceeding状态,取消A和B定时器。

c)        服务器发送200OK,客户端进入Accepted状态。

d)        客户端向服务器发送ACK应答。

注:其中在进入calling状态之前,也就是在发送INVITE消息时,客户端必须将其中的SDP消息包含着INVITE消息的content中传送到。

在客户端接收到Accepted消息(200Ok)后,或根据得到的SDP做解析,启动正确的音视频编解码器,生成RTP端口,在最后的ACK中发送给服务器,这是,通话开始进行。

在Doubango协议栈中,最后一步的处理由tsip_dialog_invite.client.c文件的int c0000_Outgoing_2_Connected_X_i2xxINVITE(va_list *app)函数处理。

doubango(5)--SIP协议栈传输层的启动的更多相关文章

  1. doubango(4)--SIP协议栈传输层的启动

    协议栈的默认传输结构 对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点.每一个传输结点对应于一个端口,若采用TCP连接,一个传输结点就针对于一个点到点的连接,这个连接负责sip信令的 ...

  2. Sipdroid实现SIP(四): 传输层和应用层之间的枢纽SipProvider

    目录 一. 概述 二. 主要变量 三. 主要方法 四. 在Sipdroid中的应用 一. 概述 在整套Sipdroid源码中, 类SipProvider是最靠近TCP/UDP的一层, 在Sipdroi ...

  3. [tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研

    如题,以下是一份简单的快速调研. TLDK: Transport Layer Development Kit 一 什么是TLDK transport layer development kit 处理t ...

  4. 实验:传输层:UDP协议 学习笔记

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP数据报首部就标明了这两台主机的IP地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地 ...

  5. 传输层:UDP 协议

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此, ...

  6. doubango(2)--底层协议栈结构分析

    tsip_stack_handle_t 实例 1.        tsip_stack_handle_t的创建 在底层,真正运转的协议栈结构式tsip_stack_handle_t的一个实例,它的创建 ...

  7. Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)

    catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...

  8. doubango(1)--从协议栈结构说起

    自顶向下与自底向上 软件设计的两种方法不过于自顶向下与自底向上. 对于自顶向下而言,先设计好用户接口,再往下延伸至各个功能块的具体实现.而对于自底向上而言,自然是有了设计好的各个功能代码块,再将这些功 ...

  9. [转帖]技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解

    技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解    http://www.52im.net/thread-1309-1-1.html   本文来自腾讯资深研发工程师罗成的技术分享, ...

随机推荐

  1. Python异常处理体系

    1.Python内建异常体系结构 The class hierarchy for built-in exceptions is: BaseException  +-- SystemExit  +-- ...

  2. 如何在Android中添加系统服务

    一,在frameworks/base/core/java/android/content/Context.java中添加 public static final String RADIO_SERVIC ...

  3. php 注意点

    1.如果一个方法可静态化,就对它做静态声明.速率可提升至4倍. 2.echo 比 print 快. 3.使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接. 4.在执行for循环之前确定 ...

  4. FreeRTOS代码剖析

    FreeRTOS代码剖析之1:内存管理Heap_1.c   FreeRTOS代码剖析之2:内存管理Heap_2.c   FreeRTOS(V8.0.1)系统之xTaskGenericCreate() ...

  5. Java内存回收 - 落日之心的日志 - 网易博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  6. Unity 3d中Shader是什么,可以吃吗?

    众所周知,Unity3d是一款跨平台非常广的游戏引擎,上手容易,界面友好,集成功能众多,是目前开发手游的主流引擎.本人有幸使用Unity 3d进行开发已一年多时间,已领略了这歀引擎的强大之处. 编写s ...

  7. RabbitMQ 消息队列 配置

    CentOS 7 x64  rabbitmq 一.CentOS 7 yum 添加epel 源 yum -y install epel-release 1. yum -y install erlang ...

  8. macbook pro 突破校园网inode客户端限制分享网络

    [原创] 环境: 1. macbook pro (retina) 2. mac os x 10.9 3. H3C inode for mac 7.0 分享方法: 1.打开inode联网. 2.打开设置 ...

  9. POJ 3458 Colour Sequence

    水题. #include<cstdio> #include<cstring> #include<cmath> + ; char s[maxn], v[maxn], ...

  10. JNI错误总结(转)

    源:JNI错误总结 最近公司里要用JNI技术,用java去调用已经写好的本地DLL库.之前自己也没接触过相关技术,其中花了大部分时间在调试改错上面,网上对于错误的解决方案也不多,现在项目接近完工,自己 ...