SIP协议解析与实现

article/2025/9/23 7:20:43

SIP协议解析与实现

本文将按照RFC3261逐步的介绍SIP协议,介绍了c和c++语言的实现,分析了osip库的使用和实现。

第一章 概述

一 概述

SIP协议是一个基于应用层的会话控制协议。它可以创建、修改、终止多媒体会话(会议),也可以邀请参与者加入到一个现有的会话。

因为SIP是一个基于应用层的协议,所以它不是一套完整的通讯系统方案,它需要和其它的方案或者协议结合起来实现整套系统。例如,实时传输协议(RTP)(RFC1889)用来传输音视频等实时的流媒体数据。实时流协议(RTSP)(RFC2326)用来控制媒体流的传递。媒体网关控制协议(MEGACO)(RFC3015)用来控制PSTN网关。

由此可见,SIP协议应该用来组合其它协议,从而实现完整的服务。但是,SIP基础的功能和操作不依赖于其它协议。

二 第一个例子

下面引用RFC3261的例子来说明sip的基本功能,包括:定位终端,发送通讯请求,协商会话参数,建立会话和撤销建立的会话。图1显示了用户Alice和Bob使用SIP交换信息的一个典型的例子(每一个消息用字母F和一个数字来标号,标号的前面有一个简短的消息类型说明)。在这个例子中,Alice使用一个在她的PC机中的SIP应用程序呼叫Bob,Bob使用他的SIP电话,这个SIP电话登录了互联网。同时,请注意两个SIP代理服务器在Alice和Bob的会话的建立中起到的作用。

Alice呼叫Bob是使用他的SIP标识符。SIP标识符是一种URI(Uniform Resource Identifier),称之为SIP URI。SIP URI格式很象email地址,包含一个用户名和一个主机名,如:sip:bob@biloxi.com。这里biloxi.com是Bob的SIP服务提供者的域名。Alice的SIP URI是:sip:alice@atlanta.com。SIP也支持安全URI,叫做SIPS URI,例如,sips:bob@biloxi.com。一个向SIPS URI的呼叫使用加密传输(也就是TLS)来携带从呼叫者到被呼叫者所有的SIP消息。

SIP是一个与HTTP协议很像的,请求/应答式的事务模型。每一个事务最少由一个要完成特定方法或功能的请求,和服务器端的一个应答组成。在这个例子中,这个事务从Alice的软电话发送一个INVITE请求到Bob的SIP URI开始。INVITE是一个SIP消息,它表示请求者Alice想与Bob通话。INVITE请求包含一些头域。头域被称为属性,可以提供关于这个消息的额外信息。关于头域我们一会儿将会详细说明它们。图1中的INVITE信息(F1)可能像这样:

INVITE sip:bob@biloxi.com SIP/2.0

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds

Max-Forwards: 70

To: Bob <sip:bob@biloxi.com>

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710@pc33.atlanta.com

CSeq: 314159 INVITE

Contact: <sip:alice@pc33.atlanta.com>

Content-Type: application/sdp

Content-Length: 142

 

(Alice's SDP not shown)       

第一行文本是这个请求的方法名(INVITE)。后面的行是多个头域。这里只列出了最少需要的头域。先在这里对这些头域做一个简要的介绍:

Via头域包含Alice希望收到对于这个请求的应答的地址。也就是她告诉请求的接收者,应答应该发送到pc33.atlanta.com。后面的branch参数是这个事务的标识符。

To头域包含一个显示名(Bob)和一个SIP URI或者SIPS URI,这里是使用的SIP URI(sip:bob@biloxi.com)。这个SIP URI就是这个请求要发送的目标。

From头域也包含一个显示名(Alice)和一个SIP URI或者SIPS URI,这里是使用的SIP URI(sip:alice@atlanta.com)来指出请求的发起人。这个头域还包含了一个tag参数,这个参数包含了一个随机字符串(1928301774),这个字符串的数字会被软电话自动增加,它主要起到鉴别的作用,后面还会说明它。

Call-ID头域包含一个全局唯一标识符来标识这次呼叫。这个标识符使用一个随即字符串和软电话所在的主机名(或者IP地址)一起生成。这样,To头域、From头域和Call-ID这三个头域就可以唯一的确定了Alice和Bob的这条点对点的通信关系,并且将这个通信关系交给一个对话(dialog)来处理了。

Cseq头域(命令序列)包含一个整数和一个方法名字。在这个对话中每一个新的请求都会增加这个整数的值,保证这个数值是有序的。

Contact头域包含一个SIP URI或者SIPS URI指出一个能够接触到Alice的直接路由,一般这个SIP URI由用户名和一个完全限定域名(FQDN)构成。因为许多终端系统没有注册域名,所以也可以使用IP地址代替FQDN。Via头域向对方指出了这个请求的应答应该发送到哪里,而Contact头域向对方指出了将来的请求应该发送到哪里。

Max-Forwards头域限制了在这个请求传送到目的地的时候最多可以有多少跳。它包含一个整数,在每一跳这个整数都会被减少。

Content-Type头域描述消息体的类型(在这个例子里消息体采用了SDP描述,但是消息体内容没有给出)。

Content-Length头域指出了消息体的字节数。

在后面我们将完整的介绍SIP头域(RFC3261第20节)。

在会话中像媒体类型、编码方式、采样率等信息都不使用SIP描述,而是在消息体中使用其它会话描述协议的格式。这个例子中采用了SDP描述(RFC2327)。

软电话不知道Bob或者拥有biloxi.com域名的SIP服务器,它将INVITE请求发送给为Alice提供服务的域名为atlanta.com的SIP服务器。关于Alice如何获得atlanta.com SIP服务器的地址,可以使用由Alice的软电话指定,或者使用DHCP探测到等方式。

atlanta.com SIP服务器是一个SIP代理服务器。一个代理服务器接收SIP请求,为请求的发送者转发请求。在这个例子中,代理服务器接收到INVITE请求后发送一个100应答(Trying)给Alice的软电话。100应答(Trying)指出这个INVITE请求已经被代理服务器接收到,并且已被经进一步向目的地路由。SIP中的应答使用3位数字表示,每一个编号都表示一个描述短语。这个100应答(Trying)也同样包含和INVITE请求一样的To、From、Call-ID、CSeq和Via以及branch参数,这样可以使Alice的软电话知道这个应答是对应发送的INVITE请求的。atlanta.com代理服务器定位出biloxi.com代理服务器(这可能需要通过域名解析服务器(DNS)等实现,后面还会详细讲解)获得了它的IP地址,并且准备把INVITE请求转发给biloxi.com代理服务器。在转发请求之前,atlanta.com代理服务器增加了一个额外的Via头域,这个Via头域包含自己的地址(这时候这个INVITE请求的第一个Via头域包含Alice的软电话的地址)。biloxi.com代理服务器接收到这个INVITE请求,并且也发送一个100(Trying)应答给atlanta.com代理服务器指出它已经接收到这个INVITE请求,并正在处理这个请求。biloxi.com代理服务器知道Bob的IP地址(这可能需要定位服务),它又在这个INVITE请求中加入了一个新的Via头域,值为自己的地址,然后它把这个INVITE请求发送给Bob的SIP电话。

Bob的SIP电话接收到这个INVITE请求,发送一个180(Ringing)应答,同时使用铃声通知Bob有一个来自Alice的呼叫,让Bob决定是否接听。这个180(Ringing)应答反向经过这两个代理服务器被发送到Alice。每一个代理服务器使用Via头域决定向哪里发送这个应答,并且把移除它自己添加的Via头域。这样,虽然只有初始的INVITE请求发送的时候使用了DNS服务和定位服务,而这个180(Ringing)应答没有使用,同时代理服务器也不需要记录整个通讯的状态,但是这个应答还是能够成功的发送给请求的发送者Alice。

当alice的软电话接收到180(Ringing)应答后,它将这个消息告诉给Alice,也许使用一个声音(彩铃)或者在Alice的屏幕上显示一个消息。

在这个例子中,Bob决定接听电话,当他按下接听按钮时,他的SIP电话发送200(OK)应答表示接受了这个呼叫。这个200(OK)应答包含一个消息体,消息体使用SDP描述Bob准备和Alice建立的会话的媒体类型等信息。这样,Alice和Bob交换了一次SIP信息:Alice用INVITE请求发送一次给Bob,Bob用200(OK)应答发送一次给Alice。这个交换实现了基本的协商能力和简单的offer/answer模型。如果Bob不希望接听电话,或者他现在正忙(接听其它电话),那么他会发送一个错误应答而不是200(OK)应答。一个错误应答将不会建立会话。

Bob发送的200(OK)应答可能是这样的:

SIP/2.0 200 OK

Via: SIP/2.0/UDP server10.biloxi.com

;branch=z9hG4bKnashds8;received=192.0.2.3

Via: SIP/2.0/UDP bigbox3.site3.atlanta.com

;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2

Via: SIP/2.0/UDP pc33.atlanta.com

;branch=z9hG4bK776asdhds ;received=192.0.2.1

To: Bob <sip:bob@biloxi.com>;tag=a6c85cf

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710@pc33.atlanta.com

CSeq: 314159 INVITE

Contact: <sip:bob@192.0.2.4>

Content-Type: application/sdp

Content-Length: 131

 

(Bob's SDP not shown)      

应答的第一行包含一个应答代码(200)和一个解释短语(OK)。其它行就是应答的头域。Via,To,From,Call-ID和CSeq头域的值都从INVITE请求拷贝而来(这时候应该有3个Via头域,分别由Alice的SIP软电话,atlanta.com代理服务器,和biloxi.com代理服务器添加)。Bob的SIP电话添加一个tag参数到To头域。以后所有的属于这个对话的请求和应答都要包含这个tag参数。

当Alice的软电话接收到这个200(OK)应答后,马上停止响铃并显示呼叫已经被接听了。最后,Alice发送一个确认信息(ACK)给Bob的SIP电话,表示自己收到了最终应答(200(OK))。这个例子中的最终应答由Alice直接发送给了Bob,这是因为Alice的软电话从Contact头域里面可以得到Bob的地址信息。通过INVITA/200/ACK的三步握手,SIP会话就建立起来了。关于SIP会话建立的详细步骤请参看RFC3261第13节。

现在Alice和Bob的多媒体会话已经建立起来了,他们可以发送通过SDP协商好的格式的媒体数据了。一般来说,媒体数据包的传输与SIP消息的传输采用不同的通信方式。SIP消息大多通过代理服务器转发,而媒体数据多使用点对点的传输。

在会话过程中,无论是Alice还是Bob决定改变这个媒体会话,都要通过发送一个re-INVITE请求。这个re-INVITE请求包含新的媒体描述(可能是SDP),它不会建立新的会话,而是修改当前已经存在的会话。对方接收到这个请求后,发送一个200(OK)同意这个改变,最后请求者发送ACK。如果对方不同意这个修改,可能会发送一个错误应答,比如488(不接受)。但是这个失败应答不会使已存在的会话退出,而是继续使用以前协商的媒体进行通信。关于修改一个会话的详细说明,请参看RFC3261第14节。

最后,Bob发送BYE消息挂断电话。BYE消息直接发送到Alice的软电话。Alice发送200(OK)确定接收到了BYE消息,并且终止这个会话。Bob不用发送ACK,因为ACK只有在接收到对INVITE的应答时才被发送。关于终止一个会话更详细的说明,请参看RFC3261第15节。

还有一个问题就是关于biloxi.com服务器如何获得Bob的位置。Bob的SIP电话开机的时候会向一个注册服务器发送REGISTER消息。REGISTER消息的作用是将Bob的SIP URI或者SIPS URI与Bob当前使用的电话地址进行帮定,并将这个帮定信息保存到数据库中,这被称之为定位服务(location service)。biloxi.com代理服务器使用定位服务获得Bob的地址。注册服务器、代理服务器、定位服务器都是逻辑上的服务器,而不是物理上的服务器,所以他们可以位于同一台服务器上。

 

转自:http://blog.csdn.net/braveyly/article/details/6419471


http://chatgpt.dhexx.cn/article/M8jNdmZG.shtml

相关文章

SIP协议-01 简介与入门

文章目录 1 介绍1.1 VoIP技术1.2 SIP&#xff08;Session Initiation Protocol&#xff09;1.3 SIP承载1.4 SIP的几个主要标准协议 2 SIP协议栈2.1 PJSIP协议栈2.2 ReSIProcate协议栈2.3 OPAL协议栈2.4 VOCAL协议栈2.5 sipX协议栈2.6 oSIP协议栈 SIP&#xff08;Session Initia…

通信系列2: 深入浅出SIP协议

传统电话是电磁波的通信&#xff0c;当电话技术发展到IP技术时代&#xff0c;SIP协议成为了电话通信标准协议&#xff0c;不仅可以通电话、还可以收发信息、视频、开会、放PPT。事实上&#xff0c;今天的通信业已全面采用SIP协议作为通信标准&#xff0c;无论是固定电话、还是移…

SIP协议简介(一)之SIP基本的概述

本篇文章主要是对RFC3261翻译进行的&#xff0c;也包含着自己的一些理解。希望能给需要的人带来一些帮助 补充说明&#xff1a;RFC即Request For Comments&#xff08;RFC&#xff09;&#xff0c;是一系列以编号排定的文件。文件收集了有关互联网相关信息&#xff0c;以及UNI…

SIP协议(一)

熟悉SIP的一些基本常识概念相关协议&#xff0c; 网络元素&#xff0c;分层结构&#xff0c; 不同请求消息类型&#xff0c;响应消息类型 SDP的一些概念基础 SIP SIP&#xff08;Session Initiation Protocol&#xff09;会话初始化协议&#xff0c;是有IETE&#xff08;I…

SIP协议简介(比较全面)

介绍 通信提供商及其合作伙伴和用户越来越渴求新一代基于 IP 的服务。现在有了 SIP协议&#xff08;会话启动协议&#xff09;&#xff0c;一解燃眉之急。SIP协议 是不到十年前在计算机科学实验室诞生的一个想法。它是第一个适合各种媒体内容而实现多用户会话的协议&#xff0…

【入门篇】SIP 协议详解

本博客转载自&#xff1a;https://xiaxl.blog.csdn.net/article/details/104661248 SIP 协议详解 2013年参与过一个“视频通讯的App”项目&#xff0c;使用Sip协议通信。当时通信协议这块不是自己负责&#xff0c;加上时间紧、任务重等方面的原因&#xff0c;一直未对Sip协议进…

[Appium] Appium自动化测试原理及配置项

Appium自动化测试原理及配置项 一、App自动化测试原理 通过设计自动化脚本&#xff0c;通过发送指令到Appium Server&#xff0c;然后Appium Server转发指定到Android SDK框架来操作被测手机&#xff0c;这个类似于selenium通过浏览器驱动来操作浏览器 Android SDK不同系统不…

Appium 使用

前提是手机易经通过adb连接到电脑 1、打开Appium 点击startServer 2、打开Appium Inspector 填写下面的数据 desired_caps常用参数:platformName 平台的名称&#xff1a;iOS, Android, or FirefoxOSplatformVersion 设备系统版本号deviceName 设备…

Appium+Python第一篇:appium的基本使用及启动APP

一、appium的基本使用 appium环境安装 1、安装Android SDK &#xff08;1&#xff09;配置环境变量 用户变量的path添加以下三个路径&#xff1a; %ANDROID_HOME%\build-tools\31.0.0 %ANDROID_HOME%\platform-tools %ANDROID_HOME%\tools - 系统变量添加&#xff1a; 变量…

Appium - 入门指南(偏重于实际操作)

前言 此文章 偏向于实操 appium支持在不同平台上&#xff08;windows&#xff0c;linux、mac&#xff09; - 使用测试脚本&#xff08;支持不同语言C #&#xff0c;json&#xff0c;Ruby等等&#xff09; - 模拟测试各个平台的app&#xff08;web、windows、mobile等&#xff…

appium原理常用指北

环境搭建外文链接 1、appium电脑手机连接 环境需要&#xff1a;jdk、sdk、appium服务、手机(打开开发者模式) 检验&#xff1a;手机数据线连接电脑&#xff0c;电脑终端输入查看命令&#xff0c;出现设备表示连接成功。 adb devices启动appium服务&#xff0c;默认端口4723就…

手机APP自动化 Appium教程

Appium原理与安装 Appium 是一个移动 App &#xff08;手机应用&#xff09;自动化工具。 手机APP 自动化有什么用&#xff1f; 自动化完成一些重复性的任务比如微信客服机器人爬虫自动化测试 Appium 自动化方案的特点&#xff1a; 开源免费支持多个平台支持多种类型的自动…

Appium 简介

1.1 Appium 概述 Appium 是一个开源、跨平台&#xff08;测试程序跨平台、支持多平台上的app测试&#xff09;、多语言支持的&#xff08;开发语言&#xff09;移动应用自动化工具。 1.1.1 测试对象 Appium 的测试对象包括&#xff1a;原生 app&#xff0c;混合 app&#xf…

Appium 简明教程

转载&#xff1a;Appium 简明教程&#xff1a;http://www.testclass.net/appium https://www.cnblogs.com/fnng/p/4540731.html Appium 官网&#xff1a;http://appium.io/ Github 地址&#xff1a;https://github.com/appium/appium 主要包括以下几部分&#xff1a; appium新…

Appium框架原理和工作流程

一、Appium的框架原理 Appium是在手机操作系统自带的测试框架基础上实现的&#xff0c;Android和iOS的系统上使用的工具是&#xff1a; Android4.2以后是基于UIAutomator框架实现查找注入事件&#xff0c;iOS是UIAutomation Appium的架构原理如图&#xff0c;由客户端和服务…

Selenium+Appium底层原理

selenium 从某一方面来讲其实就是一个web服务器。 我们启动webdriver服务时&#xff0c;会在webdriver服务里生成对应的session,只要服务启动起来了&#xff0c;无论什么类型的客户端&#xff0c;理论上只要获取到了生成的session,请求时带上此session,应该都是可以和webdriver…

appium底层实现原理解析

appium原理 转自 木木L玲 一、什么是Appium Appium是一个开源、跨平台的测试框架&#xff0c;可以用来测试原生及混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台。Appium使用WebDriver的json wire协议&#xff0c;来驱动Apple系统的UIAutomation库、Android系统…

【Appium学习总结1】----原理

Appium 是一个开源工具&#xff0c;用于自动化 iOS 手机、 Android 手机和 Windows 桌面平台上的原生、移动 Web 和混合应用。 appium安卓设备通信流程&#xff1a; 脚本-----------------> appium server-----------------> bootstrap.jar-----------------> uiauto…

Appium的使用

一、环境配置&#xff1a; 1、安装Node.js 2、配置JDK环境 3、配置Android SDK环境 4、安装Appium桌面版本 5、配置Python环境&#xff0c;安装selenium、Appium-Python-Client库 6、安装模拟器&#xff08;MuMu模拟器&#xff09; 环境配置参考&#xff1a; 这里是引用 二、使…

Appium 介绍以及工作原理

目录 1、什么是Appium&#xff1a;2、Appium各类组件&#xff1a;3、Appium理念&#xff1a;4、三张图了解 Appium工作原理&#xff1a; 1、什么是Appium&#xff1a; appium是一个移动端的自动化测试框架&#xff0c;可用于测试原生应用、移动网页应用、混合型应用&#xff0…