sip协议
SIP是一种应用层协议,全称叫会话初始协议,是英文Session initialization Protocol缩写
SIP URL
sip协议是在ip网络中,基于ip来实现通讯,sip只建立会话面,而不建立用户面,这个需要和其他的应用层协议协同工作,使用sip协议进行通讯需要在ip网络中创建Sip账号(URL)来唯一标识
sip:user@domain:port;params?headers
参数 | 含义 |
---|---|
sip: | 表示这个URL的SIP协议,还有sips加密协议 |
user | sip对象的用户标识符,可以是用户名,电话号,邮箱地址 |
@ | 分割用户标识符和域名 |
domain | sip对象所属的域名或ip地址,一般是sip服务器的地址 |
port(可选) | 服务器的端口,默认的sip使用5060(无加密) 或5061(加密) |
params(可选) | 指定附加参数,指定sip传输使用的协议transport=(UDP,TCP,TLS) ,指定请求方法method =(INVITE,REFISTER) :,指定SIP用户的类型user =(phone) |
headers(可选) | headers 用于指定SIP头部参数,以问号(? )开始,多个参数用&分隔 常见的头部参数有: ttl :Time-to-live,表示消息的生存时间。 maddr :Multicast地址。 method :指定请求的SIP方法(如INVITE、REGISTER等)。 lr :表示该请求是一个路由请求。 |
SIP系统由4种元素组成:用户代理、代理服务器、重定向服务器以及注册服务器
请求消息
SIP请求消息包含以下几个主要部分:
- 请求行(Request Line)
- 请求头(Request Headers)
- 空行(Blank Line)
- 消息体(Message Body)(可选)
1. 请求行(Request Line)
请求行是SIP消息的第一行,包含以下三个元素:
- 方法(Method):SIP请求的类型,表示要执行的操作,如INVITE、REGISTER、BYE等。
- 请求URI(Request-URI):表示请求的目标URI,通常是用户代理(UA)或者SIP服务器的地址。
- SIP版本(SIP Version):标明使用的SIP协议版本,通常为
SIP/2.0
。
例如:
INVITE sip:alice@atlanta.com SIP/2.0
这行表示发起一个INVITE
请求,目标是alice@atlanta.com
,并且使用的是SIP 2.0协议。
2. 请求头(Request Headers)
INVITE sip:alice@atlanta.com SIP/2.0
To: <sip:alice@atlanta.com>
From: <sip:bob@biloxi.com>;tag=client2
Call-ID: 1234567890
CSeq: 1 INVITE
Max-Forwards: 70
Contact: <sip:bob@biloxi.com>
Content-Type: application/sdp
Content-Length: 139
请求头部包含了与该请求相关的各种信息,包括发送者、接收者、请求的参数、认证信息等。SIP请求头的格式为键值对,每个键值对以冒号分隔,多个请求头之间以换行符分隔。常见的SIP请求头包括:
- Via:用于记录SIP请求经过的代理服务器路径以及响应返回路径。它帮助确保消息能够正确路由,并避免消息循环。
-
Max-Forwards:用于限制SIP请求能够通过的最大代理数量,防止消息在网络中无限转发。
-
To:目标地址,表示请求的接收者。通常为
To
头和From
头一起配对,表示消息的发送和接收双方。 - From:请求发起方的地址,通常包含发起方的标签(tag),用来标识该请求发起者。
- Call-ID:标识请求的会话ID,所有属于同一个会话的消息必须具有相同的Call-ID。
- CSeq(Sequence):请求的序列号。它由请求的类型(如INVITE、BYE)和递增的计数值组成。
- Contact:包含请求发起方的联系方式,通常用于响应消息发送回发起方。
- Content-Type:表示消息体的类型(如SDP、XML等)。如果请求消息包含消息体,通常需要指定此字段。
- Content-Length:消息体的长度。若请求消息没有消息体,此字段为0。
- Authorization:当请求需要身份验证时,会包含Authorization头,指明用于身份验证的凭证。
- User-Agent:包含发送请求的客户端(UA)或代理的详细信息(通常是客户端的软件版本信息)。
3. 空行(Blank Line)
请求头和消息体之间有一个空行。该空行是为了分隔头部和消息体。通常是一个简单的换行符(\r\n
)。
4. 消息体(Message Body)
消息体是SIP请求的可选部分,它包含了与请求相关的实际内容。例如,在INVITE
请求中,消息体通常包含会话描述协议(SDP),以告知对方如何设置多媒体会话。对于REGISTER
请求,消息体可能包含注册信息。
会话描述协议(SDP,Session Description Protocol)
它用于描述多媒体会话的详细信息,如使用的媒体类型、编解码器、传输方式、端口等。
v=0
o=alice 2890844526 2890844526 IN IP4 192.0.2.3
s=Session SDP
c=IN IP4 192.0.2.4
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
常见的请求方法及其消息体内容:
-
INVITE:
-
用于发起会话。消息体通常包含
SDP
(Session Description Protocol),描述会话的媒体信息(如音频、视频、编码格式等)。
示例:INVITE sip:alice@atlanta.com SIP/2.0
(消息体包含SDP)
-
BYE:
-
用于结束会话。通常没有消息体,但可能携带与会话相关的标识符(如
Call-ID
)。 -
REGISTER:
-
用于注册SIP客户端到SIP服务器。消息体通常包含注册信息(如注册的URI、认证信息等)。
-
ACK:
-
用于确认接收到
INVITE
请求的响应。消息体通常为空,或包含确认信息。 -
OPTIONS:
-
用于查询远程设备的功能(例如,是否支持某种编解码器)。消息体通常为空。
-
SUBSCRIBE:
-
用于订阅某种状态信息。消息体包含订阅请求的详细信息。
SIP 请求消息示例
INVITE请求示例:
INVITE sip:alice@atlanta.com SIP/2.0
To: <sip:alice@atlanta.com>
From: <sip:bob@biloxi.com>;tag=client2
Call-ID: 1234567890
CSeq: 1 INVITE
Max-Forwards: 70
Contact: <sip:bob@biloxi.com>
Content-Type: application/sdp
Content-Length: 139
此示例中的INVITE
请求是由bob@biloxi.com
发起的,目标是alice@atlanta.com
,并且会话使用SDP进行描述。消息体中的SDP包含了媒体会话的详细信息,如音频流的IP地址和端口号、编码格式等。
常见SIP请求方法简介
- INVITE:用于发起、更新或邀请对方参与会话。
- BYE:用于结束会话。
- REGISTER:用于注册SIP客户端到SIP服务器。
- ACK:用于确认接收到
INVITE
的响应。 - OPTIONS:查询远程设备的能力。
- SUBSCRIBE:用于订阅远程状态信息。
- NOTIFY:用于通知订阅者有关状态的变化。
- CANCEL:用于取消已经发出的请求。
- PRACK:用于确认对非2xx响应的可靠传输。