您好,欢迎访问三七文档
INVITE主叫方Tesla首先发起INVITE消息到被叫方Marconi。INVITE消息包含会话类型和一些呼叫所必须的参数。会话类型可能是单纯的语音,也可能是网络会议所用的多媒体视频,还可能是游戏会话。下面是消息体范例,我们来详细分析各个字段的意义。INVITEsip:marconi@radio.orgSIP/2.0=请求方法、请求地址(Request-URI)、SIP版本号(目前都是SIP/2.0)=请求地址一般就是被叫方地址,跟MSN中好友eMail地址类似Via:SIP/2.0/UDPlab.high-voltage.org:5060;branch=z9hG4bKfw19b=SIP版本号(2.0)、传输类型(UDP)、呼叫地址、=branch是一随机码,它被看作传输标识=Via字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成=传输类型可以为UDP、TCP、TLS、SCTPMax-Forwards:70=最大跳跃数,就是经过SIP服务器的跳跃次数,主要是防止循环跳跃=每尽管一台代理服务器,该整数减一To:G.MarconiFrom:NikolaTesla;tag=76341=表示请求消息的发送方和目标方=如果里面有用户名标签,地址要求用尖括号包起来=对于INVITE消息,可以在From字段中包含tag,它也是个随机码Call-ID:123456789@lab.high-voltage.org=呼叫ID是由本地设备生成的,全局唯一值。每次呼叫该值唯一不变=对于用户代理发送INVITE消息,本地将生成Fromtag和Call-ID全局唯一码,被叫方代理则生成Totag全局唯一码。这三个随机码做为整个对话中对话标识(dialogindentifier)在通话双方使用。CSeq:1INVITE=CSeq,又叫命令队列(CommandSeqence),每发送一个新的请求,该数自动加1*以上几个字段是所有SIP消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须Subject:AboutThatPowerOutage...Contact:=Contact是INVITE消息所必须的,它用来路由到被叫设备地址,也称为用户代理(UA)Content-Type:application/sdpContent-Length:158=最后两位附属字段说明消息体类型以及字段长度v=0=SDP版本号,目前都是0o=Tesla28908445262890844526INIP4lab.high-voltage.org=主叫源地址,类型等s=PhoneCall=主题c=INIP4100.101.102.103=连接t=00=时间戳m=audio49170RTP/AVP0=媒体a=rtpmap:0PCMU/8000=媒体属性=从上面SDP消息体我们可以得出下面信息=连接IP地址:100.101.102.103=媒体格式:audio=端口号:49170=媒体传输类型:RTP=媒体编码:PCMuLaw=采样率:8000Hz180Ringing当被叫方接收到INVITE请求消息后,将回复180Ringing。顾名思义,就是发回铃音,提示主叫方电话已连接上了,正等待被叫应答。被叫方接收到INVITE消息后也会发生响铃或者其它有呼入提示,这由被叫方设定(我们可以把它想象成我们自己设定手机铃声)。对于180响应又被称为“消息及时响应”,它是一种用来测试被叫状态的一种响应。因此它所包含的信息不多,具体180响应消息如下:SIP/2.0180RingingVia:SIP/2.0/UDPlab.high-voltage.org:5060;branch=z9hG4bKfw19b;received=100.101.102.103=这里增加一个received参数,标识接收方IP地址To:G.Marconi;tag=a53e42=上已提到,Totag做为被叫方标识From:NikolaTesla;tag=76341=要求很发送方Fromtag一致Call-ID:123456789@lab.high-voltage.orgCSeq:1INVITEContact:Content-Length:0=对于180Ringing响应,基本上就是将INVITE的Via、To、From、Call-ID和CSeq内容复制过来,对于首行标出SIP版本号,响应代码(180)和动作原因(reasonphrase)=注意这里From和To地址,因为它们用来指定呼叫方向,因此这里的200OK响应并没有将地址对调,仍然保持原样。一点不同的是To头字段添加了由被叫方Marconi生成的tag标识200Ok被叫响铃后,如果被叫用户Marconi接起电话,则发出200OK响应。这个响应除了做为接通指示之外,还有一个功能是用来指定被叫允许的连接媒体格式,让主叫方确认是否可以接收该媒体。消息体如下SIP/2.0200OKVia:SIP/2.0/UDPlab.high-voltage.org:5060;branch=z9hG4bKfw19b;received=100.101.102.103To:G.Marconi;tag=a53e42From:NikolaTesla;tag=76341Call-ID:123456789@lab.high-voltage.orgCSeq:1INVITEContact:Content-Type:application/sdpContent-Length:155=头字段部分基本同上v=0o=Marconi28908445282890844528INIP4tower.radio.orgs=PhoneCallc=INIP4200.201.202.203t=00m=audio60000RTP/AVP0a=rtpmap:0PCMU/8000=从上面SDP消息体我们可以得出下面信息=终端IP地址:200.201.202.203=媒体格式:audio=端口号:60000=媒体传输类型:RTP=媒体编码:PCMuLaw=采样率:8000HzACK通话前最后一步是主叫方确认200OK响应。该项确认证明连接被允许,即将使用另一种协议开始媒体连接。这另一种协议是上面在SDP消息段中所协商好的RTP格式。该ACK响应内容如下:ACKsip:marconi@tower.radio.orgSIP/2.0Via:SIP/2.0/UDPlab.high-voltage.org:5060;branch=z9hG4bK321gMax-Forwards:70To:G.Marconi;tag=a53e42From:NikolaTesla;tag=76341Call-ID:123456789@lab.high-voltage.orgCSeq:1ACKContent-Length:0BYE通话完毕后,由被叫方Marconi首先挂机,发送BYE请求命令。注意这回由Marconi做为主叫方了,因此Via字段和From、To与INVITE字段有所不同。其实也就是倒置。BYEsip:n.tesla@lab.high-voltage.orgSIP/2.0Via:SIP/2.0/UDPtower.radio.org:5060;branch=z9hG4bK392kfMax-Forwards:70To:NikolaTesla;tag=76341From:G.Marconi;tag=a53e42Call-ID:123456789@lab.high-voltage.orgCSeq:1BYEContent-Length:0200OKBYE之后,要求被叫方发200Ok确认,也就是让主叫知道被叫已经知道你挂断了。(注意这里所说的主被叫角色已经倒过来了)打个比方,通话之后,有一方要求挂机,另一方需要知道它已经挂机了。SIP/2.0200OKVia:SIP/2.0/UDPtower.radio.org:5060;branch=z9hG4bK392kf;received=200.201.202.203To:NikolaTesla;tag=76341From:G.Marconi;tag=a53e42Call-ID:123456789@lab.high-voltage.orgCSeq:1BYEContent-Length:0到此,就是最简单的呼叫过程。该过程简单在于两个终端之间没有其它设备,完全的点对点连接,它们之间只需要知道对方IP地址即可。现实生活中这种呼叫形式是很少见的。
本文标题:SIP流程
链接地址:https://www.777doc.com/doc-2858713 .html