SIP
---------------------------
  Session Initiation Protocol
---------------------------
  create, manage and terminate sessions in an IP based network.

SIP 可以干什么? 

      
    sip 只用于建立,修改和结束的sessions,**4个主要目的**:
1. 建立用户的location信息:把用户名和地址绑定起来:register
2. 提供一个共同准则的Session,让所有同意这些准则的用户聚在一起
3. 管理call management,加入,删除,改变参与者的状态
4. 可以改变进行中的session:cancel

SIP 由哪些组成?

    1 UA 通常会把UAC,UAS集成在一起
        - User Agent Client (UAC) : It generates requests and send those to servers.
        - User Agent Server (UAS) : It gets requests, processes those requests and generate responses.
    2 Client
       使用设备的终端:IP phone,PC:是发给UAC的前做的工作
    3 Servers
     - Proxy Server: 最常见的一种server:最初的requests里面的消息不能准备的定位到接收者的位置, 所以发给了Proxy Servers去找到准备位置
     - Redirect Server:重定向server:当前的router 找不到目的地时:返回给client要重新router找:比如:你的上海注册的电话,跑到广州去了,然后朋友打电话给你就要重定向操作
     - Registrar:所有的用户都会注册到Registrar上,[遵守统一的Url方法](http://wiki.mbalib.com/wiki/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%AE%9A%E4%BD%8D%E7%AC%A6)在Internet上所有资源都有一个独一无二的URL地址。(虽然不注册也可以发signalling,但通常都是要注册的)
- Location Server: 真正存放Registrar的地址的地方

SIP有哪些常用的方法(Method)

INVITE:发出邀请:与ACK配合建立session
         1. Invite 里面包含了SDP(会话描述)
         2. 如果已在session中,也可以用re-invite来调整会话(先ALice和Bob在语音会话,然后聊着聊着就又加入了视频会话)
     ACK:Acknowledgement 确认
     与invite形成一个三次握手:Invite ->最终应答(200ok)->ACK

[Question]为什么要三次握手?
  Note :Invite是Method里面唯一一个三次握手(其它都是用请求->应答模式)
     1. Invite建立session的时间很长,要用User来最终确定建立会话
     2. 使派生代理成为可能,Client会从不同的服务器得到应答,向每个发送应答的服务器发Ack请求来保证在UDP等不可靠协议的SIP操作。(如果其中一个成功了,让其它的会话也能清理干净)
     3. Alice 发Invite给Bob---> Bob没有收到--->Alice 再发Invite--->Bob收到返回200ok--->这时200ok在网络中又丢失了(悲剧)--->Alice没有收到200ok,会认为没有Invite成功,又发Invite---->直到成功收到200ok--->会话还没有建立(再发个ACK确认)这个例子的点在于:如果Alice 发了Invite没有收到200ok后就直接关掉了,Bob在这里发出200ok后,发现Alice没有再发Invite了,Bob就认为会话建立成功了,天哪,只是Alice不线了,如果再加上一个ACK就可以避免这种情况了
  Cancel 取消一个没有最终应答的请求。
    1. 发生一个transcation里面,请求取消已最终应答的Invite是无效的,比如:Alice 对Bob 发出Invite,Bob一直振铃(1XX,临时应答)没有接,然后Alice就发Cancel取消Invite。
        *Attaction*服务对Cancel处理完后还是会发200ok的让Invite的三次握手还是正常进行
    2.Cancel在派生代理里面的应用:Alice 给Bob发Invit-->Registar发现有3个地址可用:Bob@home,Bob@office,Bob@outside-->派生代理会向三个派发-->其中Bod@home返回200ok-->200ok沿路返回派生代理时,派生代理会给余下2个请求发cancel让他们停止(Invite事务)振铃
Bye 请求放弃session
  1. 会话只有2方时,其中一方放弃就会terminate session
  2. 会话多方时,只是自己退出会话,其它不受影响。(实现中,其它人离开通常不做Bye处理)
Register 注册
  1. 用户发出Register告诉服务器用户当前的位置(可多个)所以常和位置定位服务绑定在一起
  2. 上面说的是最简单的注册方式,基本上没有人用,因为网络总是不安全的,还要加入各种安全认[著名而有意思的RSA](http://zh.wikipedia.org/wiki/%E5%85%AC%E5%BC%80%E5%AF%86%E9%92%A5%E5%8A%A0%E5%AF%86)
  3. UAC 发给UAS Register--->UAS 返回401Unauthorized(表明UAC要认证),返回时会加 proxy-Authenticate,noce(这个就是用RSA生成的钥匙)--->UAC得到这个消息后再加上Username,Url等发给专门注册的UAS,然后这个UAS会去根据这个钥匙再复杂地认证是不是真的-->然后就注册成功{ok,200,Opt}.bababa.....实际应用很复杂的,不要想帮简单了。
 OPTIONS: 请求服务器的性能,查看对方支持什么?                
    例如:请求后知道服务器支持SDP,支持哪一种压缩方式,那么客户端就可以发送相应的压缩SDP,从而节省带宽。

SIP Session

 

1xx = 通知性应答 2xx = 成功应答
100 正在尝试
100 正在尝试
180 正在拨打
181 正被转接
182 正在排队
183 通话进展
200 OK
202 被接受:用于转介
3xx = 转接应答 4xx = 呼叫失败
300 多项选择
301 被永久迁移
302 被暂时迁移
305 使用代理服务器
380 替代服务
400 呼叫不当
401 未经授权:只供注册机构使用,代理服务器应使用代理服务器授权407
402 要求付费(预订为将来使用)
403 被禁止的
404 未发现:未发现用户
405 不允许的方法
406 不可接受
407 需要代理服务器授权
408 呼叫超时:在预定时间内无法找到用户
410 已消失:用户曾经存在,但已从此处消失
413 呼叫实体过大
414 呼叫URI过长
415 不支持的媒体类型
416 不支持的URI方案
420 不当扩展:使用了不当SIP协议扩展,服务器无法理解该扩展
421 需要扩展
423 时间间隔过短
480 暂时不可使用
481 通话/事务不存在
482 检测到循环
483 跳数过多
484 地址不全
485 模糊不清
486 此处太忙
487 呼叫被终止
488 此处不可接受
491 呼叫待批
493 无法解读:无法解读 S/MIME文体部分
5xx = 服务器失败 6xx = 全局失败
500 服务器内部错误
501 无法实施:SIP呼叫方法在此处无法实施
502 不当网关
503 服务不可使用
504 服务器超时
505 不支持该版本:服务器不支持SIP协议的这个版本
513 消息过长
600 各处均忙
603 拒绝
604 无处存在
606 不可使用

以下只是一个典型的SIP case(实际复杂多了


  
  SIP 请求消息格式
   

INVITE sip:user2@server2.com SIP/2.0
Via: SIP/2.0/UDP pc33.server1.com;branch=z9hG4bK776asdhds Max-Forwards: 70
To: user2 <sip:user2@server2.com>
From: user1 <sip:user1@server1.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.server1.com
CSeq: 314159 INVITE
Contact: <sip:user1@pc33.server1.com>
Content-Type: application/sdp
Content-Length: 142
---- User1 Message Body Not Shown ----

上面是一个INVITE 的Request最基本消息(会话描述的协议没有写出来哦,少年是不是感觉和http一个样子):

一个SIP请求由**一个请求行(Request_line),几个标题头(Headers),一个空行(Empty line),一个消息体(Message body)**,消息体是可选的,一些请求可以不带。

*Request_line*:

    方法(INVITE) 请求URL(sip:user2@server2.com) 版本号(SIP/2.0)

SIP 应答消息格式

  

SIP/2.0 200 OK
Via: SIP/2.0/UDP site4.server2.com;branch=z9hG4bKnashds8;received=192.0.2.3
Via: SIP/2.0/UDP site3.server1.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.server1.com;branch=z9hG4bK776asdhds;received=192.0.2.1
To: user2 <sip:user2@server2.com>;tag=a6c85cf
From: user1 <sip:user1@server1.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.server1.com
CSeq: 314159 INVITE
Contact: <sip:user2@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
---- User2 Message Body Not Shown ----

一个应答消息由**一个状态行(Status line),几个标题头(Headers),一个空行(Empty line),一个消息体(Message body)**,消息体是可选的,一些应答可以不带。

Status line

        协议版本(SIP/2.0) 状态码(200) 一些原语(OK)

原语只给人阅读用,于机器没一点用。

Note

我们只要保证可靠的最终应答(如:200),临时的可以不在乎,因为我们只关心session是否被建立,失败是由于什么原因,而不关心会话是怎么建立的

SIP各标题头的作用

1. From:user1 <sip:user1@server1.com>;tag=1928301774

    人名+他的SIP Url+tag=

2. CallID:a84b4c76e66710@pc33.server1.com

    不同的事务有不同的callid,Bob和Alice在进行棋盘会话Call_id1,这里2人想语音会话,发Invite里Callid2,这callid1=/=callid2用于标识不同的transcation!

3. Content: <sip:user2@192.0.2.4>

    根据这个可以直接找到用户的URL,这个特性非常重要,因为他会话建立后,再建立下一个同样的会话就可以不经过第一次那么麻烦的寻求了,这理论是很美好的,但现实中,为了计费,绝对不可能让content给client给存起来(这样以后client就可以直接联系,不经对服务器),所以这个东西一定存在server上,client如果需求,就会发请求,由server来处理,但也不用像第一次复杂(因为Server是知道Bob在哪的)

4. CSeq: 314159 INVITE

    - 一个整数字段 方法名,整数部用于同一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的应答了。

[SIP00]SIP 概念总结的更多相关文章

  1. SIP协议入门:初学者必须明白的几个重要概念

    SIP协议初学者必须明白的几个重要概念 http://blog.sina.com.cn/s/blog_60e1d7bb0100f6er.html 一. SIP协议的分层结构 SIP是一个分层结构协议, ...

  2. SIP vs XMPP

    sip和xmpp都是应用层的协议,主要用来在互联网上发送语音和即时通讯IM,rfc3521定义了sip,rfc3920定义了xmpp.xmpp来自即时通讯系统,sip类似语音和视频通信. xmpp协议 ...

  3. 流媒体学习三-------SIP消息结构详解

    SIP消息由三部分组成,即:开始行(start line).消息头(header).正文(body)Start-line:请求行Request-line  消息为 request消息时使用reques ...

  4. 《FreeSWITCH: VoIP实战》:SIP 模块 - mod_sofia

    SIP 模块是 FreeSWITCH 的主要模块,所以,值得拿出专门一章来讲解. 在前几章时里,你肯定见过几次 sofia 这个词,只是或许还不知道是什么意思.是这样的,Sofia-SIP 是由诺基亚 ...

  5. Android IOS WebRTC 音视频开发总结(十四)-- sip和xmpp异同

    这篇文章主要介绍XMPP与SIP,很多人容易混淆这两个概念,转载请说明出处(博客园RTC.Blacker). 简介:XMPP和SIP都是应用层协议,主要用于互联网上发送语音和即时通讯. SIP在RFC ...

  6. STUN/TURN/ICE协议在P2P SIP中的应用(一)

    1           说明 本文详细描述了基于STUN系列协议实现的P2P SIP电话过程,其中涉及到了SIP信令的交互,P2P的原理,以及STUN.TURN.ICE的协议交互 本文所提到的各个服务 ...

  7. STUN/TURN/ICE协议在P2P SIP中的应用(二)

    1       说明 2       打洞和穿越的概念... 1 3       P2P中的打洞和穿越... 2 4       使用STUN系列 协议穿越的特点... 2 5       STUN/ ...

  8. Android Sip学习(三)Android Voip实现

    Android Sip学习(三)Android Voip实现   Android Sip学习(准备知识)SIP 协议完整的呼叫流程 Android Sip学习(一)Android 2.3 APIs S ...

  9. Sipdroid实现SIP(六): SIP中的请求超时和重传

    目录 一. Sipdroid的请求超时和重传 二. SIP中超时和重传的定义 三. RFC中超时和重传的定义 一. Sipdroid的请求超时和重传 Sipdroid实现SIP协议栈系列, 之前的文章 ...

随机推荐

  1. DotNetBar For Windows Forms 12.5.0.2 官方原版及注册

    转自原文DotNetBar For Windows Forms 12.5.0.2 官方原版及注册 DotNetBar是一款带有56个 Windows Form 控件的工具箱,使开发人员可以轻而易举地创 ...

  2. linux命令 环境设置 顺序

    转 http://blog.csdn.net/dingxy/article/details/4016383 在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/prof ...

  3. Git(一):Eclipse中配置Git

    在Eclipse中配置Git: 一,由于我使用的是新版本的eclipse j2ee 4.4默认集成git,所以不用手动安装git插件 二,Eclipse配置基础信息.Windows->Prefe ...

  4. Oracel官网下载各类版本的JDK

    下载地址 http://www.oracle.com/technetwork/java/javase/downloads/index.html 拉到最下面 点download 在这里就可以下载到各个版 ...

  5. C语言之单链表的使用

    #include <stdio.h> #include <stdlib.h> typedef struct LNode{ int data; struct LNode *nex ...

  6. 第2章地址Address(WCF全面解析3)

    WCF顾明思义,就是在Windows平台下解决通信(C,Communication)的基础框架(F,Foundation)问题. 终结点是WCF最为核心的对象,因为它承载了所有通信功能.服务通过相应的 ...

  7. Linux环境下安装myeclipse+破解

    1.下载myeclipse安装包,下载myeclipse破解文件. 2.修改myeclipse-pro-2014-GA-offline-installer-linux.run的权限 sudo chmo ...

  8. MySQL数据库篇之索引原理与慢查询优化之二

    接上篇 7️⃣  正确使用索引 一.索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果, 我们在添加索引时,必须遵循以下问题: #1 范围问题,或者说条件 ...

  9. FreeSWITCH 启用多域(多租户)的配置

    如果将FreeSWITCH用于云端, 支持大规模并发呼叫, 就要用到 多域/多租户 技术了, FreeSWITCH 本身可以直接支持. 每个域可以单独, 拥有相同的分机号也互相打不通, 各自线路, I ...

  10. [C++] const object

    const  object const 对象只能调用const函数 const函数不能改变一般成员变量的值,但是mutable的变量不受限制