SIP(Session Initiation Protocol,会话初始协议)

SIP(Session Initiation Protocol,会话初始协议)的开发目的是用来帮助提供跨越因特网的高级电话业务。因特网电话(IP电话)正在向一种正式的商业电话模式演进,SIP就是用来确保这种演进实现而需要的NGN(下一代网络)系列协议中重要的一员。支持H.264协议

SIP学习笔记 2007-12-28 21:39:23

学习 SIP 协议最快捷的方法是通过范例来学习,

找到了一个完整的呼叫流程,let‘s go!

INVITE

主叫方Tesla首先发起 INVITE 消息到被叫方Marconi。INVITE 消息包含会话类型和一些呼叫所必须的参数。会话类型可能是单纯的语音,也可能是网络会议所用的多媒体视频,还可能是游戏会话。下面是消息体范例,我们来详细分析各个字段的意义。

INVITE sip:[email protected] SIP/2.0
    <= 请求方法、请求地址(Request-URI)、SIP 版本号(目前都是 SIP/2.0)
        <= 请求地址一般就是被叫方地址,跟 MSN 中好友 eMail 地址类似

Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
    <=SIP 版本号(2.0)、传输类型(UDP)、呼叫地址、
        <=branch是一随机码,它被看作传输标识
        <=Via 字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成
        <=传输类型可以为 UDP、TCP、TLS、SCTP

Max-Forwards: 70
    <=最大跳跃数,就是经过 SIP 服务器的跳跃次数,主要是防止循环跳跃
    <=每尽管一台代理服务器,该整数减一

To: G. Marconi
From: Nikola Tesla ;tag=76341
    <=表示请求消息的发送方和目标方
        <=如果里面有用户名标签,地址要求用尖括号包起来
        <=对于 INVITE 消息,可以在 From 字段中包含 tag,它也是个随机码

Call-ID: [email protected]
    <=呼叫ID是由本地设备生成的,全局唯一值。每次呼叫该值唯一不变
        <=对于用户代理发送 INVITE 消息,本地将生成 From tag 和 Call-ID 全局唯一码,被叫方代理则生成 To tag 全局唯一码。这三个随机码做为整个对话中对话标识(dialog indentifier)在通话双方使用。

CSeq: 1 INVITE
    <=CSeq,又叫命令队列(Command Seqence),每发送一个新的请求,该数自动加1
* 以上几个字段是所有 SIP 消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须

Subject: About That Power Outage...
Contact:
    <=Contact 是 INVITE 消息所必须的,它用来路由到被叫设备地址,也称为用户代理(UA)
Content-Type: application/sdp
Content-Length: 158
    <=最后两位附属字段说明消息体类型以及字段长度

v=0    <=SDP版本号,目前都是 0
o=Tesla 2890844526 2890844526 IN IP4 lab.high-voltage.org    <=主叫源地址,类型等
s=Phone Call    <=主题
c=IN IP4 100.101.102.103    <=连接
t=0 0    <= 时间戳
m=audio 49170 RTP/AVP 0   <=媒体
a=rtpmap:0 PCMU/8000    <=媒体属性

<=从上面 SDP 消息体我们可以得出下面信息
        <=连接 IP 地址:100.101.102.103
        <=媒体格式:audio
        <=端口号:49170
        <=媒体传输类型:RTP
        <=媒体编码:PCM u Law
        <=采样率:8000 Hz

180 Ringing

当被叫方接收到 INVITE 请求消息后,将回复 180 Ringing。顾名思义,就是发回铃音,提示主叫方电话已连接上了,正等待被叫应答。被叫方接收到 INVITE 消息后也会发生响铃或者其它有呼入提示,这由被叫方设定(我们可以把它想象成我们自己设定手机铃声)。对于 180 响应又被称为“消息及时响应”,它是一种用来测试被叫状态的一种响应。因此它所包含的信息不多,具体 180 响应消息如下:

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103    <=这里增加一个 received 参数,标识接收方 IP 地址
To: G. Marconi ;tag=a53e42    <=上已提到,To tag 做为被叫方标识
From: Nikola Tesla ;tag=76341  <=要求很发送方 From tag 一致
Call-ID: [email protected]
CSeq: 1 INVITE
Contact:
Content-Length: 0
    <=对于 180 Ringing 响应,基本上就是将 INVITE 的 Via、To、From、Call-ID 和 CSeq 内容复制过来,对于首行标出 SIP 版本号,响应代码(180)和动作原因(reason phrase)
    <=注意这里 From 和 To 地址,因为它们用来指定呼叫方向,因此这里的 200 OK 响应并没有将地址对调,仍然保持原样。一点不同的是 To 头字段添加了由被叫方 Marconi 生成的 tag 标识

200 Ok

被叫响铃后,如果被叫用户 Marconi 接起电话,则发出 200 OK 响应。这个响应除了做为接通指示之外,还有一个功能是用来指定被叫允许的连接媒体格式,让主叫方确认是否可以接收该媒体。
消息体如下

SIP/2.0 200 OK
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103
To: G. Marconi ;tag=a53e42
From: Nikola Tesla ;tag=76341
Call-ID: [email protected]
CSeq: 1 INVITE
Contact:
Content-Type: application/sdp
Content-Length: 155
    <=头字段部分基本同上

v=0
o=Marconi 2890844528 2890844528 IN IP4 tower.radio.org
s=Phone Call
c=IN IP4 200.201.202.203
t=0 0
m=audio 60000 RTP/AVP 0
a=rtpmap:0 PCMU/8000

<=从上面 SDP 消息体我们可以得出下面信息
        <=终端 IP 地址:200.201.202.203
        <=媒体格式:audio
        <=端口号:60000
        <=媒体传输类型:RTP
        <=媒体编码:PCM u Law
        <=采样率:8000 Hz

ACK

通话前最后一步是主叫方确认 200 OK响应。该项确认证明连接被允许,即将使用另一种协议开始媒体连接。这另一种协议是上面在 SDP 消息段中所协商好的 RTP 格式。该 ACK 响应内容如下:

ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bK321g
Max-Forwards: 70
To: G. Marconi ;tag=a53e42
From: Nikola Tesla ;tag=76341
Call-ID: [email protected]
CSeq: 1 ACK
Content-Length: 0

BYE

通话完毕后,由被叫方 Marconi 首先挂机,发送 BYE 请求命令。注意这回由 Marconi 做为主叫方了,因此 Via 字段和 From、To 与 INVITE 字段有所不同。其实也就是倒置。

BYE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
Max-Forwards: 70
To: Nikola Tesla ;tag=76341
From: G. Marconi ;tag=a53e42
Call-ID: [email protected]
CSeq: 1 BYE
Content-Length: 0

200 OK

BYE 之后,要求被叫方发 200 Ok 确认,也就是让主叫知道被叫已经知道你挂断了。(注意这里所说的主被叫角色已经倒过来了)打个比方,通话之后,有一方要求挂机,另一方需要知道它已经挂机了。

SIP/2.0 200 OK
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
;received=200.201.202.203
To: Nikola Tesla ;tag=76341
From: G. Marconi ;tag=a53e42
Call-ID: [email protected]
CSeq: 1 BYE
Content-Length: 0

到此,就是最简单的呼叫过程。该过程简单在于两个终端之间没有其它设备,完全的点对点连接,它们之间只需要知道对方 IP 地址即可。现实生活中这种呼叫形式是很少见的。

时间: 2024-10-14 15:43:29

SIP(Session Initiation Protocol,会话初始协议)的相关文章

[百科] - SIP(会话发起协议)

SIP(会话发起协议)SIP是类似于HTTP的基于文本的协议.SIP可以减少应用特别是高级应用的开发时间.由于基于IP协议的SIP利用了IP网络,固定网运营商也会逐渐认识到SIP技术对于他们的深远意义. SIPSIP(Session Initiation Protocol)是一个应用层的信令控制协议.用于创建.修改和释放一个或多个参与者的会话.这些会话可以是Internet多媒体会议[1] .IP电话或多媒体分发.会话的参与者可以通过组播(multicast).网状单播(unicast)或两者的

【转】SIP协议 会话发起协议

转自:https://www.cnblogs.com/gardenofhu/p/7299963.html 会话发起协议(SIP)是VoIP技术中最常用的协议之一.它是一种应用层协议,与其他应用层协议协同工作,通过Internet控制多媒体通信会话. SIP - 概述 以下是有关SIP的几点注意事项 - SIP是用于通过因特网协议创建,修改和终止多媒体会话的信令协议.会话只不过是两个端点之间的简单调用.端点可以是智能电话,笔记本电脑或可以通过因特网接收和发送多媒体内容的任何设备. SIP是由IET

Session攻击(会话劫持+固定)与防御

1.简介 Session对于Web应用无疑是最重要的,也是最复杂的.对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而保存到数据层. 然而,为了维持来自同一个用户的不同请求之间的状态, 客户端必须要给服务器端发送一个唯一的身份标识符(Session ID). 很显然,这和前面提到的安全原则是矛盾的,但是没有办法,http协议是无状态的,为了维持状态,我们别无选择. 可以看出,web应用程序中最脆弱的环节就是sess

ARP(Address Resolution Protocol)地址解析协议初识

ARP址解析协议是根据IP地址获取物理地址的一个TCP/IP协议.它工作在OSI七层模型的中第二层--数据链路层. 使用ARP地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址(MAC地址)信息,以保证通信的顺利进行. 可能会受到恶意攻击--ARP欺骗 与IPV6的NDP协议相比,ARP使用广播的效率偏低. ARP是通过报文工作的,报文的结构如下图所示: 假设同一个网络中的主机A要与主机B进行通信,A和B的信息如下: 主机A的IP地址为192.168.1.1,MAC地址为

使用msm(memcached session manager)实现会话服务器

很多场景下,用户的访问网站的会话信息都需要保存,实现会话保存的方式有三种: 1.session绑定 2.session复制,在多个集群的节点间复制会话信息到各个节点 3.session服务器,使用单独的服务器专门用于保存会话信息.实验过程要实现的是第三种方式,使用session服务器的方式来保存用户的会话信息. 实验用机: 两台前端tomcat集群,使用httpd做反向代理,请用户请求转发至后端的tomcat集群,同时有两台memcached服务器用于保存用户的会话信息,其中有一个节点作为备用会

tomcat session server实现会话绑定

tomcat session server 此前已经进行过Tomcat的其他配置信息,这里不再进行重复的描述,会把重要的地方写上,不会影响实验 要想能够实现追踪有状态的web apps,对应的状态信息,有三种方式 session stickysession replication clustersession server 这里实现session server的实现方式 memcached可以借助于第三方的项目所提供的功能,实现使用memcached保存用户的session信息,项目称为MSM,

HTTP-----HyperText Transfer Protocol超文本传输协议

http/0.9:仅纯文本(超链接),ASCII HTML:HyperText Mark Language URI:Uniform Resource Idetnifier,统一资源标识符 统一:路径格式上的统一 URL:Uniform Resource Locator   统一资源定位符 protocol://Host:Port/path/to/file HTTP方法:获取web资源/对象的方法 http/0.9: GET http/1.0: PUT, POST, DELETE, HEAD ht

使用Spring Session做分布式会话管理

在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将session管理从容器中独立出来.而这实现方案有很多种,下面简单介绍下: 第一种是使用容器扩展来实现,大家比较容易接受的是通过容器插件来实现,比如基于Tomcat的tomcat-redis-session-manager,基于Jetty的jetty-session-redis等等.好处是对项目来说

session标签(会话实例)

逐条删除会话内容 <chtml> <session act=del> <we name=obj1></we> <we name=obj2></we> </session> </chtml> <span>@{session:obj1}</span> 对象1.对象2按关键字从会话中删除,先运行上一篇的例子,再运行这个例子试试 (例子文件:_samples/session_del.html)