首页 > 代码库 > SIP包的分析

SIP包的分析

今天工作碰到了两个装置之间SIP包的抓取和分析,然后结合RFC3261的文档说明,记录下今天所理解的。

1.SIP协议:
SIP的详细RFC文档可见:rfc3261
Session Initiation(会话初始协议),允许使用Internet端点(用户代理)来寻找参与者并且允许建立一个可共享的会话描述。SIP允许创建基础的 networkhosts(叫做代理服务器),并且允许终端用户注册上去,发出会话邀请,或者发出其他请求。可以用来创建,修改和终止会话,它独立运作于通讯协议之下,并且
不依赖建立的会话类型。
SIP不是一个垂直集成的通讯系统。SIP可能叫做是一个部件更合适,SIP应该和其他的协议一起工作,才能提供完整的对终端用户的服务。虽然基本的 SIP协议的功能组件并不依赖于这些协议。
SIP本身并不提供服务。但是,SIP提供了一个基础,可以用来实现不同的服务。

2.SIP实施
每个SIP端点都有个用户名,也即是表示其身份的ID号,通过其ID,可以呼叫对方.比如,在IP电话A中,可以用这个ID来表示对方装置:sip: 0502004@192.168.2.30.前面表示电话号码,后是其IP地址.
当然,以上ID的形式只是一种彼此规定的代号而已,完全可以用shi@web.com来表
示其ID.

SIP是基于一个类似HTTP协议的请求应答的通讯模式。每一个通讯都包含对某个功
能的请求,并且起码需要一个应答。
比如,IP电话A在注册SIP服务器的过程中,就需要一个请求:Request: Register
192.168.2.13 (电话A->服务器)
而SIP服务器则必须给一个应答:Status: 200 OK (服务器->电话A)
又比如,电话A如欲与电话B通话,则首先,电话A给SIP服务器一请求,请求服务器帮它接上电话B,则这时候又需要一个请求.
如:Request: INVITE sip :0502004@192.168.2.13 (电话A->服务器)
服务器又必须给其一个应答:Status: 100 Trying .(服务器->电话A) 表示服务
器正在尽百分之百的力量帮它联系上.
这时候,服务器找到电话B,就给电话B一个请求,告诉它,有人想找你.你有空吗?
Request:INVITE sip: 015B0081587310007000D0000C578@192.168.2.40 (服务器
->电话B)
这时候,如果电话B恰巧有空(非通话断线状态),则会答服务器,说,空!请你
去叫一下他到我这儿来吧!
电话B会给出两条应答给服务器:Status: 100 Trying /Status: 180 Ring
服务器收到应答后,再给电话A发发送一个应答.Status: 180 Ring ,这时候电话A
的状态就表示响铃.
当电话A一摘机,则电话A和电话B就有个通话,此时,电话B给服务器一个条应答,
让他传到到电话A.
Status:200 OK
此时通话建立的所有准备工作完成,这时就只剩下RTP语音包在两个电话之间传
输,当然,SIP包还会时不时的出来调解一下,看看有没有异常状态.
最后一方挂断,则服务器又出作调停工作,发送一个请求给另一方:
Request:BYE sip: 015B0081587310007000D0000C578@192.168.2.40
而另一方则回一个应答:Status: 200 OK
通话完成!

这些SIP消息都是附在UDP包中完成传输的,通过ethereal截包工具,可以详细的看到其状态.
以下是一个请求连接的SIP包的图例:

技术分享

可以看到,SIP包有三个主要部分:Request-Line(表示是请求信息),Message Header(SIP包的消息头哉),Message Body(SIP包的消息主体).

其中有几个要注意的: VIA域告诉大家本请求发送到哪里并且应答到哪里,Contract域告诉大家将来的请求将发送到哪里. To和From分别表示这个包下一站到哪个主机上面,来自哪里。
  CALL-ID包含一个全局的唯一标志,用来唯一标志这个呼叫,通过随机字串和softphone的自己名字或者IP抵制混和产生的。
   通过TO TAG, FROM TAG和CALL-ID完整定义了两端之间的端到端的SIP关系,并且表示这个是一个对话性质的关系。

至于消息的主体。则会描述媒体的类型,codec,或者采样速率。




3.一个具体的在正式通话前两个电话所发出的SIP包。
  ethereal截图:
   
技术分享

SIP包的分析