zoukankan      html  css  js  c++  java
  • SIP协议分析

     音视频通话控制协议SIP介绍。


    SIP(Session Initiation Protocol),即会话发起协议,在RFC2543、RFC3261等中被定义,是一个VOIP信令协议,其目的是在IP网络中实现电话功能,即软电话功能。


    在互联网基础期,SIP协议常在硬件电话终端中,随着网络的发展,越来越多的软件也使用SIP来作为语音视频通话的控制协议。因此,SIP在协议还原领域从未缺位,并且地位相当重要。


    SIP协议是纯文本协议,通常为UDP承载,使用端口5060,本文对SIP协议的流程作简单描述,然后对格式进行分析。


    注意:网络流量中SIP协议还会使用TCP承载,也会使用其它端口。


    01

    SIP流程


    一个标准的SIP通话流程如下:

    640?wx_fmt=png

    1、 A向B发送一个INVITE消息,邀请B通话。

    2、B振铃,向A回复一个RING消息,通知A振铃中,A等待。

    3、B提机,向A发一个OK消息,  通知A可以通话,并进行双方协商,协商信息常用SDP协议承载,SDP信息作为SIP报文的一部分。

    4、A向B回复一个回应ACK消息,根据协商的结果正式启动通话。

    5、双方通话,通话过程通常在另一条会话中进行,常见的是RTP承载。

    6、B挂机,向A发一个BYE消息,通知A通话结束。

    7、A向B回复一个OK消息,通话结束。


    SIP的整个协议里,除上图中的消息外,还有REGISTER等消息。

    但是,在音视频IM软件中,SIP作为控制协议并不完全遵循于这个流程,需要具体情况具体分析,一般处理关键的SIP消息报文即可。


    进行通话协商一般是使用SDP承载,但并不局限于SDP,通话过程则很多情况下是使用RTP、RTCP等,也有可能使用私有协议或者RTP的修改版本。


    02


    SIP格式


    SIP消息分为Request和Response两种,通常Request消息有六种方法:

    REGISTER,INVITE,ACK,CANCEL,BYE,OPTIONS。
    Response则为状态码和状态内容,如100 Trying,180 Ringing, 200 OK,401 Unauthorized等。
    一个完整的SIP消息由一系列行组成,每行以 结束,这些行分成4个部分:
    1、起始行(start line)。2、消息头部(message header),内含多个头部字段(head field),每个头部字段为一行。3、空行(empty line),仅包含一个 ,表示头部的结束。4、消息体(message body),可有可无。
    可以看出,SIP的消息和HTTP类似,因为它们是同一个组织IETF制定的。
    下面将以几个实例来体会消息的格式。

    REGISTER消息:

    REGISTER sip:sip.cybercity.dk SIP/2.0

    Via: SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp151248737-46ea715e192.168.1.2;rport

    From: <sip:voi18063@sip.cybercity.dk>;tag=903df0a

    To: <sip:voi18063@sip.cybercity.dk>

    Call-ID: 578222729-4665d775@578222732-4665d772

    Contact:  <sip:voi18063@192.168.1.2:5060;line=9c7d2dbd8822013c>;expires=1200;q=0.500

    Expires: 1200

    CSeq: 68 REGISTER

    Content-Length: 0

    Max-Forwards: 70

    User-Agent: Nero SIPPS IP Phone Version 2.0.51.16 



    终端向代理服务器sip.cybercity.dk发起注册消息。第一行即为起始行,它的格式为:method request-uri sip-version 其中method为请求的方法,即前文中的六种方法,request-uri为请求的用户或服务器,sip-version为SIP版本号,三者间为空格,结束为 。
    之后为消息头部,消息头部一般要包括Via, From, To, CSeq, Caller-ID, Max-Forwards等字段,每个字段的格式为:name: value;value;value 。name即字段名,value为一个或多个,每个之间为“;”,结束为 。每个value内部可包含多段,消息头的最后一行为空行,仅含 。
    对协议还原,在消息头部需要关注的是提取 From, To字段内的发送者接收者等标识用户的信息,当然,对REGISTER方法,目的地址为服务器,则From、To字段内的用户信息是相同的,Via字段内的IP、端口信息,如果有其它字段,如User-Agent,可提取终端信息,Contact则是绑定的联系地址。另外,如果存在Content-Length字段,值非0,则表示带有消息体,需要对消息体进行解析。
    Response 100 Trying消息

    SIP/2.0 100 Trying

    Call-ID: 578222729-4665d775@578222732-4665d772

    CSeq: 69 REGISTER

    From: <sip:voi18063@sip.cybercity.dk>;tag=8e948b0

    To: <sip:voi18063@sip.cybercity.dk>

    Via: SIP/2.0/UDP 192.168.1.2;received=80.230.219.70;rport=5060;branch=z9hG4bKnp149505178-438c528b192.168.1.2

    Content-Length: 0



    Response消息是对请求的六个消息的响应,第一行同样为起始行,它的格式为:sip-version status-code reason-phrase 其中sip-version为SIP版本号;status-code为三位数字组成的返回状态码,其中第一个数字表示状态的类型,如1xx表示中间状态,收到的消息正在处理,2xx表示某个阶段的成功,另外还有3xx,4xx,5xx,6xx等,分别表示不同含义,如跳转,失败,错误等;reason-phrase为对状态码的描述;三者间为空格,结束为 。
    之后的消息头部与请求一致。同样,响应消息也可以带有消息体,由消息头部的相关字段确定。
    INVITE消息:

    INVITE sip:0097239287044@sip.cybercity.dk SIP/2.0

    Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bKnp85213694-430aa1de192.168.1.2;rport

    From: "arik" <sip:voi18062@sip.cybercity.dk>;tag=51449dc

    To: <sip:0097239287044@sip.cybercity.dk>

    Call-ID: 85216695-42dcdb1d@192.168.1.2

    CSeq: 1 INVITE

    User-Agent: Nero SIPPS IP Phone Version 2.0.51.16

    Expires: 120

    Accept: application/sdp

    Content-Type: application/sdp

    Content-Length: 270

    Contact: <sip:voi18062@192.168.1.2>

    Max-Forwards: 70

    Allow: INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, INFO


    v=0

    o=SIPPS 85214742 85214739 IN IP4 192.168.1.2

    s=SIP call

    c=IN IP4 192.168.1.2

    t=0 0

    m=audio 30000 RTP/AVP 0 8 97 2 3

    a=rtpmap:0 pcmu/8000

    a=rtpmap:8 pcma/8000

    a=rtpmap:97 iLBC/8000

    a=rtpmap:2 G726-32/8000

    a=rtpmap:3 GSM/8000

    a=fmtp:97 mode=20

    a=sendrecv


    终端向代理服务器sip.cybercity.dk发起请求通话的消息,服务器收到消息后会向目的终端发起通话消息。
    在INVITE消息的消息头部,从From、To字段内就能够提取到通话双方的账号信息,以及昵称。在这个消息中,Content-Length非0,说明带有消息体,长度为270,Content-Type字段,描述了消息体的类型,消息体可以有很多中类型,此处为SDP。
    根据SDP协议的格式,可以提取到通话内容使用的IP、端口、承载协议、可使用的语音编码相关信息。如上述消息中,提取的本端可连IP为192.168.1.2,端口为30000,内容承载协议为RTP/AVP,可选语音编码分别为pcmu、pcma、iLBC、G726-32、GSM等,采样频率均为8000,传输中对应的编号为0,8,97,2,3。
    ACK消息:

    ACK sip:0097239287044@sip.cybercity.dk SIP/2.0

    From: "arik" <sip:voi18062@sip.cybercity.dk>;tag=51449dc

    Call-ID: 85216695-42dcdb1d@192.168.1.2

    Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bKnp85213694-430aa1de192.168.1.2;rport

    To: <sip:0097239287044@sip.cybercity.dk>;tag=00-04073-1701b482-069239f90

    CSeq: 1 ACK

    Content-Length: 0 



    ACK消息表示在对端返回Response消息之后对对端的回应,格式内容与其它消息类似。
    CANCEL消息和BYE消息:

    CANCEL sip:97239287044@voip.brujula.net SIP/2.0

    Via: SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp104984053-44ce4a41192.168.1.2;rport

    From: "arik" <sip:816666@voip.brurjula.net>;tag=6433ef9

    To: <sip:97239287044@voip.brujula.net>

    Call-ID: 105090259-446faf7a@192.168.1.2

    CSeq: 1 CANCEL

    Content-Length: 0

    Max-Forwards: 70

    User-Agent: Nero SIPPS IP Phone Version 2.0.51.16 



    CANCEL消息和BYE消息使用在不同的场景,按理解,CANCEL消息为取消的意思,而BYE消息则为结束的意思。在一次通话请求的过程中,CANCEL一般为拒绝通话,使通话结束,而BYE则是通话正常结束,对语音的控制消息的处理,二者稍有差异,但本质上是相同的。
    另外,在使用SIP协议的APP中,常常会使用SIP协议进行文本聊天,文件传输等功能的实现,这样,一般是承载在消息体内的,根据具体消息格式进行解析即可。
    如果觉得本文有价值,请关注我,come on~

    640?wx_fmt=jpeg

    长按进行关注。






  • 相关阅读:
    cf round #421 div2 D. Mister B and PR Shifts
    cf round #421 div2 C. Mister B and Boring Game(trick)
    UVa 12716 GCD XOR
    cf 821E Okabe and El Psy Kongroo(矩阵快速幂)
    hdu 6109 数据分割(并查集+set)
    poj 2887 Big String(块状链表)
    hdu 6119 小小粉丝度度熊(区间双指针)
    hdu 6118 度度熊的交易计划(可行费用流)
    hdu 6015 Gameia(树上博弈)
    hdu 6096 String(AC自动机巧妙建图)
  • 原文地址:https://www.cnblogs.com/protosec/p/11673353.html
Copyright © 2011-2022 走看看