`

SIP消息结构详解

 
阅读更多

原文链接:http://www.cnblogs.com/cy568searchx/p/4369253.html

 

SIP消息由三部分组成,即:开始行(start line)、消息头(header)、正文(body)
<iframe id="iframe_0.8989546257682932" style="margin: 0px; padding: 0px; border-width: initial; border-style: none; width: 670px; height: 635px;" src="data:text/html;charset=utf8,%3Cstyle%3Ebody%7Bmargin:0;padding:0%7D%3C/style%3E%3Cimg%20id=%22img%22%20src=%22http://img.bimg.126.net/photo/6zCV9tOENPAr39esVsGRoQ==/5787125521171557461.jpg?_=4369253%22%20style=%22border:none;max-width:987px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.8989546257682932',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no"></iframe>
Start-line:
请求行Request-line
  消息为 request消息时使用request-line
  Request-Line = Method SP Request-URI SP SIP-Version CRLF
状态行Status-line
  消息为响应消息时使用Status-line
  Status-Line = SIP-Version SP Status-Code SP Reason-Phrase CRLF


请求行Request-line由消息方法+Request-URI+SIP版本组成:
消息方法: 以下列出了六种消息方法
  REGISTER: 注册联系信息
  INVITE: 发起会话请求
  ACK:对 INVITE 请求的响应的确认
  CANCEL: 取消请求
  BYE: 终结会话
  OPTIONS: 查询服务器能力
Request-URI: 指示请求的用户或者服务的地址信息
SIP-version: 请求和响应消息都需要包含SIP版本信息

举例: INVITE sip:bob@zte.com SIP/2.0
 
状态行Status-line由SIP版本+状态码+原因短语组成
举例: SIP/2.0 200 OK
 
---------------------------------------------------------------
消息头:
格式: 字段名(field-name): 参数值(field-value)
Example: REGISTER sip:registrar.zte.com SIP/2.0
        Via: SIP/2.0/UDP bobspc.zte.com:5060;branch=z9hG4bKnashds7
        Max-Forwards: 70
        To: Bob <sip:bob@zte.com>
        From: Bob <sip:bob@zte.com>;tag=456248
        Call-ID: 
[email=843817637684230@998sdasdh09]843817637684230@998sdasdh09[/email]
        CSeq: 1826 REGISTER
        Contact: <sip:bob@192.0.2.4>
        Expires: 7200
        Content-Length: 0

上面via、max-forwards、to、from、call-id等这些都是些常有的头域,SIP的头域总共有44个之多。

 

 

sip事务的概念:一个sip请求以及由它触发的一系列应答(包括临时应答和一个最终应答)。
sip请求有6种(核心规范定义的,也有扩展),也叫6个方法(Method字段标识):INVITE, ACK, OPTIONS, BYE, CANCEL, REGISTER
sip 请求的格式包括请求行(如INVITE sip:192.168.101.30 SIP/2.0),sip应答的格式包括状态行(如SIP/2.0 100 Trying);sip应答的状态码从100到699,其中100~199是临时(provisional)应答。
INVITE请求是三次握手机制,其他请求都采用两次握手机制。


CANCEL 请求用于取消悬而未决的事务,我的理解是一方发出INVITE,但是另一方始终没有做出应答,发出200OK消息(超过了默认的振铃时长),那么UAC会 自动发出一个CANCEL请求,UAS返回200OK,并且同时发出487状态码的应答,UAC再对收到的487消息发出ACK确认,即最开始的 INVITE和487以及ACK构成三次握手。

OPTIONS请求用于询问服务器的性能情况,包括这个服务器所支持的方法(可能会有扩展方法)和会话描述协议。
代理服务器的三种类型:保留呼叫状态代理、保留状态代理、不保留状态代理。这三种类型的代理在处理能力和所占用资源上有差别,在代理分发中我们采用网络核心无状态,而在流量较小的网络边界采用智能性高的保留(呼叫)状态服务器处理路由。

sip消息编码采用文本方式(即使用字符串),相对的是二进制的编码方式,前者易于调试和扩展,后者则有利于节省带宽。

sip标题头
CALL-ID 字 段用于标识一个特定邀请以及与这个邀请相关的所有后续事务(即标识一个会话),比如一方发起邀请加入一个国际象棋的会话,那么INVITE请求以及应答, BYE请求以及应答都共享一个CALL-ID,因为这两个事务都属于一个特定邀请。而两个用户之间可以同时存在多个邀请(比如在下象棋的同时发起聊天的邀 请),那么一个邀请中的后续事务将通过这个邀请特有的CALL-ID来区分,如一方发出BYE消息来结束聊天,但是下棋仍然进行中,那么另一方将根据 BYE消息的CALL-ID来确定要结束的究竟是哪一个会话。 

CSeq
 字段是用来给同一个会话中的 事务进行排序的。可以理解为,会话由CALL-ID来标识,会话中的事务则由CSeq标识。除了ACK请求和CANCEL请求,INVITE之后的请求中 CSeq字段的数字是最初请求(INVITE)的CSeq递增的结果。而ACK和CANCEL请求则拥有与它所确认(取消)的请求相同的CSeq数字部 分,只是方法名不同。

  

(sip标题头续)
Contact 字段是被呼叫方发送200OK消息时带上的,包含了被叫方的真实IP,这样sip服务器在路由第一个INVITE请求之后就可以被卸载掉(越过),不再需要存在于信令路径中。

Recode-RouteRoute字 段是用来使sip服务器保留在每次请求中,不被绕过。Record-Route字段由信令路径上的服务器添加(每经过一个信令路径上必须存在的代理,就添 加一个Record-Route标题头),maddr参数包含该代理的IP地址。被叫方发出的200OK应答包含Record-Route和 Contact字段(Record-Route可能有多个),呼叫方收到200OK后根据这两个字段创建用于后续请求的Route标题头(可能有多个), 其包含的是信令路径上的下一跳的下一跳的(hehe,有点别扭,不过意思是对的)真实IP。

To 字段 总是包含被呼叫方的地址(通过sip代理时是公用地址,点对点时是真实ip),要注意的是区别该标题头和sip消息请求行中的Request-URI。 To在信令路径中不会被代理改变,然而Request-URI包含的是信令路径中下一跳的地址,因此在路途中被每个代理改变。

Via 字 段存储所有处理请求的代理地址(包括用户代理和sip代理),它可以用来检测路由循环,也用于使应答消息经过请求消息来时相同的路径(方向相反)。因此, 在请求消息发送时,via标题头的数量是随着跳数逐渐增加的,而应答消息返回时,via标题头的数量则逐渐递减(每经过一跳则剥离一个有它自己地址的 Via标题头)。
(sip标题头完)

 
sip消息可能含有消息体(一个或多个),通常是会话描述符,也可以是照片或其他附件。一般情况下,消息体只对UA有意义,因此可被端到端加密。有时候,sip代理处于控制的原因也需要检查被交换媒体的信息。 

 

NVITE事务:

SIP使用UDP传输协议来传送INVITE消息时,要使用逐 跳重传机制保证INVITE的最终传送,即用户代理UA和sip代理proxy都要保证INVITE到达下一跳,下一跳收到时会返回一个临时应答 (proxy返回100Trying,UA返回100Trying和180ringing),代理在限定时间内收不到应答即会重传INVITE。


临时应答(100~199)用于阻止逐跳INVITE重传,没有端到端的可靠传输,也就是说当被叫方返回180应答时,如果在路径中途丢失,也不会重传。
最终应答(200~699)能被保证到达它们想要去的目的地。
成 功应答(200~299)被可靠地传送到呼叫方UA,但不是使用逐跳重传机制。只有呼叫方UA能为最终成功应答发送一个ACK(直接发送到被叫方UA), 如果成功应答在路径中途丢失或者UA发出的ACK丢失,那么被叫方会在限定时间内收不到ACK时重新发送最终应答,直到收到ACK的确认。
非成功最终应答(300~699)使用和INVITE一样的逐跳机制。被叫方用户代理将持续重传非成功应答(给前一跳),直到收到ACK为止(proxy也可以为非成功应答发送ACK)。

 

CANCEL事务:
CANCEL事务与INVITE事务都是逐跳事务,但是处理方法不同,路径上的每一个代理收到CANCEL请求时,都会发送一个最终应答来响应(而不是发出临时应答),并且向下一跳发送一个CANCEL请求。  

 

实例说明:

抓取“成功注册”,“呼叫--通话” ,“挂断”“注销”四种情况做典型包的分析。

Ø 注册流程:

 

wps_clip_image-6298

 

以上是REGISTER包。

 

我们可以看到在注册的时候,终端会向代理服务器59.64.135.22发送REGISTER请求注册。

 

wps_clip_image-6365

 

以上是REGISTEROK包。服务器返回200 OK,表示注册成功。

 

Ø 基本呼叫建立过程:

 

wps_clip_image-6413

 

以上是INVITE包。我们可以看到在发起呼叫初期,终端向825002发出Invite的呼叫请求。

 

wps_clip_image-6465

 

以上是Trying包,说明终端825003正在试着连通服务器,进一步转接到825002.

 

由于设置了自动接听,所以此次通话没有振铃的包。

 

wps_clip_image-6538

 

这是ACK包,代表确认信号。

 

Ø 正常呼叫释放过程:

 

wps_clip_image-6566

 

以上是BYE包。这是825002挂断后服务器向825003发送的释放呼叫信号。

 

Ø 注销流程:

 

wps_clip_image-6615

 

以上是825003注销的包,我们注意到expires=0这说明是注销。

分享到:
评论

相关推荐

    sip消息头功能详解

    理解SIP消息头的结构和功能对于实现和维护SIP通信系统至关重要,尤其是在设计VoIP(Voice over IP)和实时通信服务时。通过深入解析SIP消息头,我们可以更有效地构建和调试SIP网络,确保通信的顺利进行。

    sip消息详解

    SIP消息结构 SIP消息主要分为两种类型:请求(Request)与响应(Response)。每个SIP消息都由起始行(Start-Line)、一个或多个头部域(Header Fields)、空行(CRLF)以及可选的消息体(Message Body)组成。 #### 3. 请求...

    SIP协议详解(中文)

    7、SIP消息: 14 8 一般用户代理行为 18 9 取消一个请求(Cancel) 28 10 注册(Registrations) 30 11 查询能力 35 12 对话(Dialog) 37 13 初始化一个会话 41 14 更改已经存在的会话 46 15 结束一个会话 48 16 proxy...

    sip协议详解 中文版_sip_中文_

    ### SIP消息结构 SIP消息分为请求消息和响应消息。请求消息用于启动、改变或结束一个会话,如INVITE、ACK、BYE、CANCEL等。响应消息则表示对请求的回应,如200 OK表示成功,404 Not Found表示目标未找到。 ### SIP...

    SIP协议中文版详解

    **SIP协议中文版详解** SIP(Session Initiation Protocol)是一种用于控制多媒体通信会话(如语音和视频通话)的信令协议。它在互联网电话、即时消息和在线会议等应用中扮演着核心角色。SIP协议由IETF(Internet ...

    SIP协议格式详解

    SIP消息结构主要包括三部分:起始行、消息头和消息体。起始行描述了消息的类型,例如INVITE、ACK或BYE。消息头包含了关于呼叫的各种信息,如联系人、路由、呼叫标识等。消息体通常包含SDP(Session Description ...

    sip.rar_SIP 协议_SIP协议详解_sip协议_sip协议详解 pdf

    3. SIP消息结构 每个SIP消息都包含一个起始行、消息头和可能的消息体。起始行包括请求行或状态行,消息头包含各种参数,如From、To、Call-ID、CSeq、Via等,消息体可能携带SDP(Session Description Protocol)信息...

    SIP 协议详解 协议 SIP SDP

    2. SIP消息结构 SIP消息包括请求消息和响应消息。请求消息由方法字段(如INVITE、ACK、BYE等)、URI(统一资源标识符)、协议版本、头域和消息体组成。响应消息包含状态码、原因短语、协议版本、头域和可能的消息体...

    华为sip协议详解华为sip协议详解

    1. **协议结构**:SIP协议基于TCP或UDP,由请求消息和响应消息组成,采用客户端/服务器模型,发起呼叫的一方为客户端,接收呼叫的一方为服务器端。 2. **基本元素**:包括用户代理(UA)、代理服务器、重定向服务器...

    SIP消息之逐项讲解.ppt

    **SIP消息详解** SIP(Session Initiation Protocol)是一种应用层控制协议,用于创建、修改和终止多媒体通信会话,如语音通话、视频会议等。这个名为“SIP消息之逐项讲解”的PPT文件可能包含了对SIP协议消息结构、...

    SIP协议主要消息讲解[汇编].pdf

    SIP 消息结构请求消息和响应消息都包括 SIP 消息头字段和 SIP 消息体字段;SIP 消息头主要用来指明本消息是由谁发起和由谁接受,经过多少跳转等基本信息;SIP 消息体主要用来描述本次会话具体实现方式。 SIP 请求...

    SIP协议内容详解与应用

    历史回顾和概述 SIP的结构和消息 SIP的具体呼叫流程 SIP与H.323的比较

    SIP协议详解中文版.doc

    通过一系列的消息交换,如INVITE、ACK、BYE等,SIP能成功建立和结束会话。 在实际应用中,SIP协议的实现要考虑不同层次的需求,如网络拓扑、安全策略、服务质量(QoS)以及与现有通信基础设施的兼容性。这些因素...

    sip协议内容详解与应用(包含sip与h.323的比较)

    历史回顾和概述 SIP的结构和消息 SIP的呼叫流程 SIP与H.323的比较

    jsr180 sip格式消息封装

    #### JSR180中的SIPAPI详解 JSR180提供的SIPAPI主要包括以下几大组件: - **SipStack**:代表了SIP协议栈的实例,负责管理与SIP相关的所有资源。 - **SipProvider**:提供了对SIP服务器的访问点,用于注册、发起和...

    SIP协议详解

    ### SIP协议详解 #### 3.1 概述 ##### 3.1.1 基本概念 会话启动协议(SIP, Session Initiation Protocol)是由互联网工程任务组(IETF)提出的一种用于控制多媒体通信的应用层协议。它的主要目的是在IP网络上创建...

    SIP协议中文版详细解读学习sip协议最佳资料值得学习强烈推荐.zip

    SIP协议基于客户端-服务器模型,但其结构相对简单,由用户代理(User Agent, UAs)、代理服务器(Proxy Server)、重定向服务器(Redirect Server)、注册服务器(Registration Server)和各种中间实体组成。...

    SIP协议分析.pdf

    - **构建多媒体会议的结构**:SIP不仅适用于点对点的会话控制,还能支持更复杂的场景,如多方视频会议等。 #### 总结 SIP协议作为一种应用层控制协议,在多媒体通信领域扮演着至关重要的角色。通过对SIP协议的设计...

    SIP协议详解(中文).rar

    **SIP协议详解** SIP(Session Initiation Protocol,会话初始协议)是一种应用层控制协议,用于创建、修改和终止多媒体通信会话,如语音和视频通话、即时消息、在线游戏等。它在互联网电话(VoIP)领域中扮演着...

Global site tag (gtag.js) - Google Analytics