ACK sip:marconi@tower.radio.org SIP/2.0
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bK321g Max-Forwards: 70
To: G. Marconi
From: Nikola Tesla
通话完毕后,由被叫方 Marconi 首先挂机,发送 BYE 请求命令。注意这回由 Marconi 做为主叫方了,因此 Via 字段和 From、To 与 INVITE 字段有所不同。其实也就是倒置。 BYE sip:n.tesla@lab.high-voltage.org SIP/2.0
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf Max-Forwards: 70
To: Nikola Tesla
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
到此,我们已经将最简单的呼叫过程讲完了。该过程简单在于两个终端之间没有其它设备,完全的点对点连接,它们之间只需要知道对方 IP 地址即可。现实生活中这种呼叫形式是很少见的。后面我们将继续介绍另一种利用代理方式进行呼叫连接。 留个疑问:为什么说这种点对点的方式比较少用?
SIP 学习入门范例 (2)
二、通过代理服务器的 SIP 呼叫
在前面一个例子中,我们事先假设两个终端知道对方 IP 地址。而在现实情况下,这种非常少见。因为 IP 地址不像是电话号码,基本上每个人都是固定的,大多数情况,我们只知道被叫方名字,而并不知道对方在哪,也不知道对方终端的 IP 地址。因此今天,我们继续介绍另一种呼叫方式,即通过代理服务器进行呼叫。通过代理服务器进行呼叫,和我们使用 HTTP 代理上网大同小异。我们这个例子,只有一个代理服务器。
PS. 因为这里有很多内容和第一节相似,我们大量列举内容,只在个别地方说明 M1:首先是主叫方Schroedinger发送Invite请求给代理服务器。 INVITE sip:werner.heisenberg@munich.de SIP/2.0
<=对于基于代理服务器的呼叫连接,代理服务器要处理 2 部分内容。\前的是用户,后面是终端设备地址,需要DNS解析成标准IP地址。
Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a Max-Forwards: 70
To: Heisenberg
Subject: Where are you exactly?
Contact:
o=schroed5244 2890844526 2890844526 IN IP4 100.101.102.103 s=Phone Call t=0 0
c=IN IP4 100.101.102.103 m=audio 49170 RTP/AVP 0 a=rtpmap:0 PCMU/8000
代理服务器在它的定位数据库中查找 SIP 地址(sip:werner.heisenberg@munich.de)。这里有两个步骤:
1、首先UA查询DNS,确定代理服务器位置;然后由代理服务器查询定位被叫地址 2、代理服务器将 Invite 消息转发到被叫地址,在 Invite 消息中增加第二Via字段 M2:代理服务器转发 INVITE 消息
INVITE sip:werner.heisenberg@200.201.202.203 SIP/2.0
Via: SIP/2.0/UDP proxy.munich.de:5060;branch=z9hG4bK83842.1 <=这里增加了个新 Via,由代理服务器产生
Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a Max-Forwards: 69 <=经过一个跳跃,这里减 1 To: Heisenberg
Contact:
o=schroed5244 2890844526 2890844526 IN IP4 100.101.102.103 s=Phone Call
c=IN IP4 100.101.102.103 t=0 0
m=audio 49172 RTP/AVP 0 a=rtpmap:0 PCMU/8000 M3:被叫放回铃 180 Ringing SIP/2.0 180 Ringing
Via: SIP/2.0/UDP proxy.munich.de:5060;branch=z9hG4bK83842.1 ;received=100.101.102.105
Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a To: Heisenberg
Contact:
Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a To: Heisenberg
Contact:
M5:被叫接通电话,发 200 OK SIP/2.0 200 OK
Via: SIP/2.0/UDP proxy.munich.de:5060;branch=z9hG4bK83842.1 ;received=100.101.102.105
Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a To: Heisenberg
Contact:
o=heisenberg 2890844526 2890844526 IN IP4 200.201.202.203 s=Phone Call
c=IN IP4 200.201.202.203 t=0 0
m=audio 49172 RTP/AVP 0 a=rtpmap:0 PCMU/8000 M6:代理转发 200 OK SIP/2.0 200 OK
Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKmp17a To: Heisenberg
Contact:
o=heisenberg 2890844526 2890844526 IN IP4 200.201.202.203 c=IN IP4 200.201.202.203 t=0 0
m=audio 49170 RTP/AVP 0 a=rtpmap:0 PCMU/8000
M7:主叫收到 200 OK,直接发 ACK 到被叫
ACK sip:werner.heisenberg@200.201.202.203 SIP/2.0
Via: SIP/2.0/UDP 100.101.102.103:5060;branch=z9hG4bKka42