SIP 会话初始化协议

会话初始化协议(SIP)简介及应用

随着移动通信技术的迅猛发展,将我们带入丰富多彩的 3G 多媒体信息时代。特别是互联网的飞速发展,越来越多的用户能够使用更快、更便宜的因特网联接,这使得需要持续在线的应用实现成为可能。而传统电信网是为电话业务所设计的,那种拨一个号码并交谈的模式已经远远不能满足这种多媒体应用的需求,需要设计新的网络结构来支持。第三代网络的出现就是为用户提供包括语音业务和互联网数字业务在内的各种多媒体服务,SIP 协议作为第三代网络中重要的软交换协议发挥了重要的作用。本文将首先简单介绍 SIP 协议的概念,体系组成结构以及协议组成部分。并结合 Android Framework API 中新增加的 SIP 协议栈的支持,编写一个简单的基于 SIP 协议的 Android 应用。

SIP Header Fields里面各字段用途

INVITE sip:[email protected] SIP/2.0      
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds     
Max-Forwards: 70      
To: Bob <sip:[email protected]>      
From: Alice <sip:[email protected]>;tag=1928301774      
Call-ID: [email protected]      
CSeq: 314159 INVITE      
Contact: <sip:[email protected]>      
Content-Type: application/sdp      
Content-Length: 142      (Alice’s SDP not shown)

1. Via

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


1.1 用来标识Responeses消息的返回路径(todo:各router的区别),包含SIP版本,通过的路径,branch;每个Request-Line(请求消息)路过代理Server时都会记录,然后原路返回;

1.2 用来检查路由环,因为每经过server都会把他放在via里面,每都一个Server里先检查via头里面有没有这个server如果有,出现了路由环【Todo:出错?】;

1.3 Branch是一个事务ID(Transaction ID),用于区分同一个Client所发起的不同Transaction,它不会对未来的request 或者是response造成影响,对于遵循RFC3261规范的实现,这个branch参数的值必须用magic cookie”z9hG4bK”打头. 其它部分是对“To, From, Call-ID头域和Request-URI”按一定的算法加密后得到;

1.4 全局唯一性,【Todo:与CallID全局唯一性区别】.

2.Max-Forwards


 Max-Forwards: 70

2.1 用于表示这个包最多可以传送多少跳,当Max-Forwards==0&&没到达目的地时,系统会返回483(Too many hops);一般会在有Request的包里面;

2.2 默认为70;

2.3 原理:每经过一跳时【Todo:一个代理?】都会减一向下一跳传去.

3. To

        To: Bob <sip:[email protected]>

3.1 目的地的绝对地址,包含补叫的display name 和被 叫URL,&前面带的是设备号或被叫号码,&后带的是Proxy地址;

3.2 这个地址用于给Proxy们找路由的,一般会经过Proxy一步步定位到最精确的位置【改为其它精确地址】.

4. From

        From: Alice <sip:[email protected]>;tag=1928301774

4.1 格式与To一样,表示Caller的绝对地址,但是会加一个Tag标签;

4.2  Tag 他是一个随机码【Todo:可不可变?】用于 identification purposes.

5. Call-ID

       Call-ID: [email protected]

5.1 Call-ID由本地设备(Client)生成,全局唯一,每次呼叫这个值唯一不变;

5.2 对于用户发出Invite消息,本地会生成From Tag 和Call-ID全局唯一码,被叫方代理生成 To tag全局唯一码,这三个随机码做为整个对话中对话标识(dialog indentifier).

6. Cseq

        CSeq: 314159 INVITE

6.1  又叫Command Seqence(命令队列),每发一个新的请求,这个数就会+1,要用于2*31;

6.2 用来标识命令和命令顺序,整数部用于同一session(CallID决定)中不同的请求排序,它会与将请求和应答想匹配:比如:Alice 发1 Invite 没返回--->再发 2 Invite--->没返回--->再发3 Invite--->这时返回了2 Invite就知道是第2个请求得到了响应(这个数是一直递增1的); 
    - Ack的CSeq:这个是与Invite里面的一样的,这使代理为非成功最终应答产生Ack时不用再建立新的CSeq,保证唯一性,只用client代理创建哦;  
    - Cancel的CSeq:这个也是与Invite里面的一样的,这也是为什么CSeq里面要加Method的原因,如果不加,client就不知道这个是cancel还是invite的应答了;












你可能感兴趣的:(SIP 会话初始化协议)