(转自CSDN)
INVITE
主叫方
Tesla
首先发起
INVITE
消息到被叫方
Marconi
。
INVITE
消息包含会话类型和一些呼叫所必须的参数。会话类型可能是单纯的语音,也可能是网络会议所用的多媒体视频,还可能是游戏会话。下面是消息体范例,我们来详细分析各个字段的意义。
INVITE sip:[email protected] SIP/2.0
<
=
请求方法、请求地址、
SIP
版本号(目前都是
SIP/2.0
);请求地址一般就是被叫方地址
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
<
=
SIP
版本号(
2.0
)、传输类型(
UDP
)、呼叫地址、
branch
是随机码,它被看作传输标识
< = Via 字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成
< =传输类型可以为 UDP 、 TCP 、 TLS 、 SCTP
< = Via 字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成
< =传输类型可以为 UDP 、 TCP 、 TLS 、 SCTP
Max-Forwards: 70
< =最大跳跃数,就是经过 SIP 服务器的跳跃次数每经过一台代理服务器就减一
< =最大跳跃数,就是经过 SIP 服务器的跳跃次数每经过一台代理服务器就减一
To: G. Marconi
From: Nikola Tesla;tag=76341
<
=表示请求消息的发送方和目标方。如果里面有用户名标签,地址要求用尖括号包起来
< =对于 INVITE 消息,可以在 From 字段中包含 tag ,它也是个随机码
From: Nikola Tesla
< =对于 INVITE 消息,可以在 From 字段中包含 tag ,它也是个随机码
Call-ID:
[email protected]
<
=呼叫
ID
是由本地设备生成的,全局唯一值。每次呼叫该值唯一不变
< =对于用户代理发送 INVITE 消息,本地将生成 From tag 和 Call-ID 全局唯一码,被叫方代理则生成 To tag 全局唯一码。这三个随机码做为整个对话中 对话标识 ( dialog indentifier )在通话双方使用。
< =对于用户代理发送 INVITE 消息,本地将生成 From tag 和 Call-ID 全局唯一码,被叫方代理则生成 To tag 全局唯一码。这三个随机码做为整个对话中 对话标识 ( dialog indentifier )在通话双方使用。
CSeq: 1 INVITE
< = CSeq ,又叫 命令队列 ( Command Seqence ),每发送一个新的请求,该数自动加 1
* 以上几个字段是所有 SIP 消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须
< = CSeq ,又叫 命令队列 ( Command Seqence ),每发送一个新的请求,该数自动加 1
* 以上几个字段是所有 SIP 消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须
Subject: About That Power Outage...
Contact:
<
=
Contact
是
INVITE
消息所必须的,它用来路由到被叫设备地址,也称为用户代理(
UA
)
Content-Type: application/sdp
Content-Length: 158 < =最后两位附属字段说明消息体类型以及字段长度
Contact:
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 < =媒体属性
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
< =连接 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 标识
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103 < =这里增加一个 received 参数,标识接收方 IP 地址
To: G. Marconi
From: Nikola Tesla
Call-ID: [email protected]
CSeq: 1 INVITE
Contact:
Content-Length: 0
< =注意这里 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
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103
To: G. Marconi
From: Nikola Tesla
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
< =终端 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
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bK321g
Max-Forwards: 70
To: G. Marconi
From: Nikola Tesla
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
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
Max-Forwards: 70
To: Nikola Tesla
From: G. Marconi
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
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
;received=200.201.202.203
To: Nikola Tesla
From: G. Marconi
Call-ID: [email protected]
CSeq: 1 BYE
Content-Length: 0
到此,就是最简单的呼叫过程。该过程简单在于两个终端之间没有其它设备,完全的点对点连接,它们之间只需要知道对方
IP
地址即可。现实生活中这种呼叫形式是很少见的。