[SIP00]SIP 概念总结
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:cancelSIP 由哪些组成?
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 概念总结的更多相关文章
- SIP协议入门:初学者必须明白的几个重要概念
SIP协议初学者必须明白的几个重要概念 http://blog.sina.com.cn/s/blog_60e1d7bb0100f6er.html 一. SIP协议的分层结构 SIP是一个分层结构协议, ...
- SIP vs XMPP
sip和xmpp都是应用层的协议,主要用来在互联网上发送语音和即时通讯IM,rfc3521定义了sip,rfc3920定义了xmpp.xmpp来自即时通讯系统,sip类似语音和视频通信. xmpp协议 ...
- 流媒体学习三-------SIP消息结构详解
SIP消息由三部分组成,即:开始行(start line).消息头(header).正文(body)Start-line:请求行Request-line 消息为 request消息时使用reques ...
- 《FreeSWITCH: VoIP实战》:SIP 模块 - mod_sofia
SIP 模块是 FreeSWITCH 的主要模块,所以,值得拿出专门一章来讲解. 在前几章时里,你肯定见过几次 sofia 这个词,只是或许还不知道是什么意思.是这样的,Sofia-SIP 是由诺基亚 ...
- Android IOS WebRTC 音视频开发总结(十四)-- sip和xmpp异同
这篇文章主要介绍XMPP与SIP,很多人容易混淆这两个概念,转载请说明出处(博客园RTC.Blacker). 简介:XMPP和SIP都是应用层协议,主要用于互联网上发送语音和即时通讯. SIP在RFC ...
- STUN/TURN/ICE协议在P2P SIP中的应用(一)
1 说明 本文详细描述了基于STUN系列协议实现的P2P SIP电话过程,其中涉及到了SIP信令的交互,P2P的原理,以及STUN.TURN.ICE的协议交互 本文所提到的各个服务 ...
- STUN/TURN/ICE协议在P2P SIP中的应用(二)
1 说明 2 打洞和穿越的概念... 1 3 P2P中的打洞和穿越... 2 4 使用STUN系列 协议穿越的特点... 2 5 STUN/ ...
- Android Sip学习(三)Android Voip实现
Android Sip学习(三)Android Voip实现 Android Sip学习(准备知识)SIP 协议完整的呼叫流程 Android Sip学习(一)Android 2.3 APIs S ...
- Sipdroid实现SIP(六): SIP中的请求超时和重传
目录 一. Sipdroid的请求超时和重传 二. SIP中超时和重传的定义 三. RFC中超时和重传的定义 一. Sipdroid的请求超时和重传 Sipdroid实现SIP协议栈系列, 之前的文章 ...
随机推荐
- vue设置title和ioc图标
vue设置ioc图标和title 1.ioc图标设置 在根目录中的index.html中引入代码: <link rel="shortcut icon" type=" ...
- leetcode744
public class Solution { public char NextGreatestLetter(char[] letters, char target) { //a-97 z-122 v ...
- django -- url (模版语言{{ request.path_info }})
在django的模版语言中中可以使用 {{ request.path_info }} 帮助生成url. urls.py from django.conf.urls import url, incl ...
- HTTP 状态信息
一.1xx 消息 该类型的状态码代表请求已被接受,需要继续处理. 100 Continue 客户端应当继续发送请求,这个临时响应是用来通知客户端的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续 ...
- spring security的原理及教程
spring security使用分类: 如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为:1.不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo: ...
- onload函数和自执行函数的区别(jquery API网址:http://jquery.cuishifeng.cn/)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 这几天搞UNITY遇到的坑
都是在IPHONE设备上遇到的,UNITY版本是5.4.4f1 1.EASY AR出现扫描蓝线绿块的,是因为不是EASY AR的CameraDeviceBehavior默认参数1280X720 2.自 ...
- unity在安卓中横屏闪退
竖屏没问题,横屏闪退 配置文件的AndoridManifest.xml横竖屏设置要和UNITY设置的一致,否则就会强退 UNITY横竖屏设置
- Web内容回顾
-----------------siwuxie095 Java EE 三层结构 1.Web 层:Struts2 框架 2.Service 层:Spring 框架 3.DAO 层:Hibernate ...
- H5/
1.value: 2.selected="selected": 设置selected="selected"属性,则该选项就被默认选中. 下拉列表也可以进行多选操 ...