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. 我想操作的是利用SqlDataAdapter的几个Command属性(InsertCommand,UpdateCommand,DeleteCommand)来更新数据库

    我想操作的是利用SqlDataAdapter的几个Command属性(InsertCommand,UpdateCommand,DeleteCommand)来更新数据库代码:SqlConnection ...

  2. 猜数游戏-flag的运用

    package my;import java.util.Scanner;public class MyJava {        public static void main(String[] ar ...

  3. 织梦系统与discuz论坛整合方法

    如何完成dedecms模板系统与discuz论坛整合呢? 这里的整合指会员信息,会员登陆.退出的同步:论坛信息的引用:等等. 首先,我们先来安装织梦(dedecms)系统. 然后,我们在网站根目录下建 ...

  4. hibernate和ibatis的区别

    通过别人的资料,进行自己关注的一些扼要点的整理 共同点: 1. 不同点:1. 自动化程度上,hibernate是全自动化的orm框架,提供了对象到数据库的完全映射和sql的内部自动生成,其对象映射是指 ...

  5. iOS多视图传值方式之通知传值(NSNotification;NSNotificationCenter)

    iOS传值方式之5:通知传值 第一需要发布的消息,再创建NSNotification通知对象,然后通过NSNotificationCenter通知中心发布消息(NSNotificationCenter ...

  6. [Unity c#]c#中的反射

    什么是反射 在.NET中的反射也可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET中的反射还可以运态创建出对象并执行它其中的方法. 反 ...

  7. Xcode--Alcatraz来管理Xcode插件

    简介 Alcatraz是一个帮你管理Xcode插件.模版以及颜色配置的工具.它可以直接集成到Xcode的图形界面中,让你感觉就像在使用Xcode自带的功能一样. 安装和删除 使用如下的命令行来安装Al ...

  8. <转>SQL的执行顺序

    SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...

  9. mac解压缩

    tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)---------------.gz解压1:gunz ...

  10. 重拾python

    前一段碰到几次关于日期计算的题:给出一个日期,计算下一天的日期.虽然不限语言,可是我就C/C++还算熟悉,别的都是刚了解皮毛,根本不会用现成的库啊,无奈啊...只好用c语言一点点实现了,当时真是无比怀 ...