SIP协议参数详解

1.1  SIP消息分类
SIP协议是以层协议的形式组成的,就是说它的行为是以一套相对独立的处理阶段来描述的,每个阶段之间的关系不是很密切。
SIP协议将Server和User Agent之间的通讯的消息分为两类:请求消息和响应消息。
请求消息:客户端为了激活特定操作而发给服务器的SIP消息,包括INVITE、ACK、BYE、CANCEL、OPTION和UPDATE消息。
SIP请求的6种方法:
         1、 邀请(INVITE)——邀请用户加入呼叫
  2、 确认(ACK)——确认客户机已经接收到对INVITE的最终响应
  3、 可选项(OPTIONS)——请求关于服务器能力的信息
  4、 再见(BYE)——终止呼叫上的两个用户之间的呼叫
  5、 取消(CANCEL)
  6、 注册(REGISTER)——提供地址解析的映射,让服务器知道其它用户的位置

响应消息:服务器向客户反馈对应请求的处理结果的SIP消息,包括1xx、2xx、3xx、4xx、5xx、6xx响应
1.2  SIP消息结构
请求消息和响应消息都包括SIP消息头字段和SIP消息体字段;
SIP消息头主要用来指明本消息是有由谁发起和由谁接受,经过多少跳转等基本信息;
SIP消息体主要用来描述本次会话具体实现方式;
1.3  消息格式
1.3.1  请求消息格式
SIP请求消息的格式,由SIP消息头和一组参数行组成,如图3-1所示。通过换行符区分命令行和每一条参数行。

图1-1 SIP请求消息结构
注意:参数行的顺序不是固定的。对应的参数解释见6.3  。
消息体定义:
Call-ID:头字段是用来将消息分组的唯一性标识
  From:头字段是指示请求发起方的逻辑标识,它可能是用户的注册地址。From头字段包含一个URI和一个可选的显示名称
  CSeq:头字段用于标识事务并对事务进行排序。它由一个请求方法和一个序列号组成,请求方法必须与对应的请求消息类型一致
  Max-Fowords:头字段限定一个请求消息在到达目的地之前允许经过的最大跳数。它包含一个整数值,每经过一跳,这个值就被减一。如果在请求消息到达目的地之前该值变为零,那么请求将被拒绝并返回一个483(跳数过多)错误响应消息。
  Via:头字段定义SIP事务的下层(传输层)传输协议,并标识响应消息将要被发送的位置。只有当到达下一跳所用的传输协议被选定后,才能在请求消息中加入Via头字段值。
  expires:参数指出了该值中包含的URI地址的有效期。这个参数的值是以秒为单位计算的。如果没有提供该参数,那么URI地址的有效期由Expires头字段值来确定。

SIP请求消息实例:
INVITE sip:0109@127.0.0.1:5060;User=phone SIP/2.0
Call-ID:01E04633512400000@127.0.0.1
Via:SIP/2.0/UDP 127.0.0.1:5061
From:<sip:010203@127.0.0.1:5061;User=phone>;tag=29005358336B534F610A000
To:<sip:0109@127.0.0.1:5060;User=phone>
Contact: sip:010203@127.0.0.1:5061
CSeq:1 INVITE
Max-Forwards:70
Content-Type: application/SDP
Content-Length:168

v=0
o=UserA 2890844526 2890844526 IN IP4 here.com
s=Session SDP
c=IN IP4 192.0.0.1
t=0 0
m=audio 49172 RTP/AVP 0 8
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=sendonly

INVITE消息是其中一种SIP请求消息。
第一行由消息头和对端SIP实体的URI(通用资源标识)以及SIP版本号码组成。
SIP URI是电话URI,附在IP地址上,表示对端和端点收发SIP消息的端口的域。
“From”、“To”和“Contact”这三个SIP消息头属于电话URI。
当背靠背用户代理发出呼叫时,“From”消息头中的URI填写在“Via”消息头里。
请求消息类型填写在CSeq消息头里,并且当该SIP端点发送一个请求,号码就相应递增。
SIP协议版本为SIP/2.0。其中SDP被加入到INVITE消息内容里,在消息头里的Content-Length说明了SDP内容的长度。

INVITE请求消息详解:
INVITE sip:marconi@radio.org 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 <sip:Marconi@radio.org>
  From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
  <=表示请求消息的发送方和目标方
  <=如果里面有用户名标签,地址要求用尖括号包起来
  <=对于INVITE消息,可以在From字段中包含tag,它也是个随机码
  Call-ID:123456789@lab.high-voltage.org
  <=呼叫ID是由本地设备生成的,全局唯一值。每次呼叫该值唯一不变
  <=对于用户代理发送INVITE消息,本地将生成From tag和Call-ID全局唯一码,被叫方代理则生成To tag全局唯一码。这三个随机码做为整个对话中对话标识(dialog indentifier)在通话双方使用。
  CSeq: 1 INVITE
  <=CSeq,又叫命令队列(Command Seqence),每发送一个新的请求,该数自动加1
  * 以上几个字段是所有SIP消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须
  Subject: About That Power Outage...
  Contact: <sip:n.tesla@lab.high-voltage.org>
  <=Contact是INVITE消息所必须的,它用来路由到被叫设备地址,也称为用户代理(UA)
  Content-Type: application/sdp
  Content-Length: 158
  <=最后两位附属字段说明消息体类型以及字段长度
  v=0   <=SDP版本号,目前都是0
  o=Tesla 28908445262890844526 INIP4 lab.high-voltage.org   <=主叫源地址,类型等
  s=Phone Call
1.3.2  响应消息格式
SIP响应消息的格式,由SIP响应消息头和一组参数行组成,如图3-2所示。通过换行符区分命令行和每一行参数。

SIP响应消息结构
注意:参数行的顺序不是固定的。对应的参数解释见6.3  。
SIP响应消息实例:
SIP/2.0 200 OK
Content-Type:application/SDP
Via:SIP/2.0/UDP 127.0.0.1:5061
Call-ID:01EF351F8140000000000@127.0.0.1
CSeq:1 INVITE
From:<sip:010203@127.0.0.1:5061;User=phone>;tag=29005358336B534F610A000
To:<sip:0109@127.0.0.1:5060;User=phone>;tag=5358336B534F2900CD1B0000
Contact:<sip:0109@127.0.0.1:55061>
Content-Length:156

v=0
o=HuaweiSoftX3000 1073741824 1073741824 IN IP4 127.0.0.1
s=Sip Call
c=IN IP4 110.111.112.113
t=0 0
m=audio 5060 RTP/AVP 0
a=rtpmap:0 PCMU/8000

200 OK消息是SIP响应消息的一种。
第一行由SIP版本号和200响应消息组成。
SIP URI是电话URI,附在IP地址上,表示对端和端点收发SIP消息的端口的域。
“From”、“To”和“Contact”这三个SIP消息头属于电话URI。
当背靠背用户代理发出呼叫时,“From”消息头中的URI填写在“Via”消息头里。
请求消息类型填写在CSeq消息头里,并且当该SIP端点发送一个请求,号码就相应递增。
SIP协议版本为SIP/2.0。把SDP加入到INVITE消息内容里,在消息头里说明内容的长度。

第二章 SIP协议主要响应码
2.1          响应码分类
SIP响应消息用于对请求消息进行响应,指示呼叫的成功或失败状态。不同类的响应消息由状态码来区分,状态码包含三位整数,状态码的第一位用于定义响应类型,另外两位用于进一步对响应进行更加详细的说明。响应消息的分类如下所示。
1)1XX:临时响应,表示请求消息正在被处理。
2)2XX:成功响应,表示请求已被成功接收,完全理解并被接受。
3)3XX:重定向响应,表示需采取进一步以完成该请求。
4)4XX:客户机错误,表示请求消息中包含语法错误信息或服务器无法完成客户机请求。
5)5XX:服务器错误,表示服务器无法完成合法请求。
6)6XX:全局故障,表示任何服务器无法完成该请求。
上述消息中,临时响应用于指示呼叫正在进行,其余最终响应用于结束请求消息。
2.2          1xx类消息(临时响应)
1xx消息表示服务器或代理正在进行处理,还未得到确定的响应。客户应该继续等待服务器的响应。当服务器预测在200毫秒之内不能得到最终响应时,它应该发送一个1xx响应。服务器可以发送多个1xx响应。下面是常见的1xx类消息列表。
表1-1 常见的1xx类消息列表
100        试呼(Trying)正在进行与呼叫有关的操作(例如:访问数据库),但被叫用户还没有定位。
180        被叫振铃(Ringing)被叫用户代理已经得到被叫的位置,正在提醒被叫用户。该响应也可以再发起一个本地回铃
181        呼叫前转(Call Is Being Forwarded)代理服务器可以用该状态码表示当前呼叫正被转移到其它目的地。(呼叫正在转发)
182        呼叫排队(Queued)被叫暂时不可访问,当前呼叫被排队而不是被拒绝。当服务器有效时,可以继续响应该呼叫。 该响应的"reason phrase"可以进一步给出排队呼叫的信息,例如:“队列中有5个呼叫,期望等待时间为15分钟”。服务器可以发出多个182 响应来更新当前排队呼叫的信息。
183        会话进度(session progress)应答用于提示建立对话的进度信息。Reason-Phrase(表达原因的句子)、头域或者消息体可以用于提示呼叫进度的更新消息的信息。
2.3          2xx类消息(成功响应)
2xx消息表示请求已经被接收、处理并被成功接受;
200 :OK---请求成功。
2.4  3xx类消息(重定向响应)
3xx消息表示响应给出有关用户新位置或其它可选服务的信息。下面表4-3是常见的3xx类消息列表。
表1-2 常见的3xx类消息列表
300        多个选择(Multiple Choice)请求中的地址被解析为多个位置,用户可以将请求重定向到一个合适的地址。该响应应该包含可供用户或用户代理选择的位置和资源列表,并且在Contact头域中,列出可供选择的地址。(网络协议不兼容:会话描述中的一个或多个网络协议不可用。)
301        永久离开(Moved Permanently)在请求中Request-URI所指的地址找不到用户,客户应该尝试Contact头域给出的新地址。主叫收到该响应后应该更新所有的本地目录,地址簿,用户位置缓存并将以后的请求重定向到新的地址。(网络地址格式不兼容:会话描述中的一个或多个地址格式不可用。)
302        暂时离开(Moved Temporarily)客户应该用Contact头域给出的新地址尝试呼叫。响应中Expire头域指出该次重定向的有效期,如果没有给出有效期,那么重定向只对当前呼叫有效。(传送协议不兼容:会话描述中的一个或多个传送协议不可用。)
303        带宽单位不兼容:会话描述中的一个或多个带宽度量单位不被理解。
304        媒体类型不可用:对话描述中的一个或多个媒体类型不可用。
305        使用代理(Use Proxy)客户所请求的资源必须通过Contact头域中给出的代理来访问。Contact头域给出代理的URI。该响应只能由用户代理服务器发出。(媒体格式不兼容:对话描述中的一个或多个媒体格式不可用。)
306        媒体特征不被理解:对话描述中的一个或多个媒体特征不被支持。
307        对话描述参数不被理解:除上述几种参数之外的参数不被理解。
330        组播不可用:用户站点不支持组播。
331        单播不可用:用户站点不支持单播通信(通常是由于防火墙的存在)
370        带宽不足:对话描述中定义的或者媒体定义的带宽超出可用带宽。
380        使用其它服务(Alternate Service)呼叫不成功,但是可选其它的服务(如:电子邮件,语音信箱)。该响应的消息体给出可选服务的描述。
399        混合告警:该告警表示用户存在的任意一种错误,收到该告警的系统不可以采取任何自动的动作
2.5  4xx类消息(客户机错误)
4xx消息表示请求消息中包含语法错误或者SIP服务器不能完成对该请求消息的处理。下面表4-4是常见的4xx类消息列表。
表1-3 常见的4xx类消息列表
400        无效请求(Bad Request)请求语法有误,不能被服务器理解。
401        未授权(Unauthorized)请求需要用户认证。
402        要求付费(Payment Required)该响应为将来使用保留。
403        禁止(Forbidden)服务器理解请求,但拒绝完成。客户不应该再次发请求。
404        未找到用户(Not Found)请求中Request-RUL给出的地址上没有要呼叫的用户。当Request-RUL给出的地址与服务器管理的域不匹配时,服务器也发送该响应。
405        方法不允许(Method Not Allowed)请求行中指定的方法不被允许。该响应必须包含Allow头域,列出服务器支持的方法。
406        不可接受(Not Acceptable)根据请求中的Accpe头域,由请求给出的资源产生的响应实体里面的内容字符不可接受。
407        需要代理认证(Proxy Authentication Required)该响应与401(未授权)类似,但它指示用户必须首先向代理认证自己。
408        请求超时(Request Timeout)服务器不能在请求的Expire头域指定的时间内产生响应。客户可以过一段时间重发请求。
409        冲突(Conflict)客户的请求与资源的当前状态冲突,不能完成请求。当REGISTER请求的action参数与现存的注册冲突时返回该响应。
410        无可用资源(Gone)服务器上没有所请求的资源,也不知道进一步联系的地址。这种情况被认为是永久的。如果服务器不能确定该情况是否是永久的,它应该发送404(被叫未找到)响应。
411        需要消息体长度(Length Required)服务器拒绝接受没有包含Content-Length头域的请求。客户何以在加入一个表示消息体长度的Cotent-Length头域后重发请求。
413        请求实体过长(Request Entity Too Large)服务器拒绝处理过长的消息实体。如果这种情况是暂时的,服务器应该在响应中包含Retry-After头域指示客户何时重发请求。
414        Request-URI过长(Request-URI Too Long)服务器不能解析过长的Request-URI。
415        媒体类型不支持(Unsupported Media Type)服务器不支持请求消息体的格式。服务器应该在响应中用Accept,Accept-Encoding 和Accept-Language头域列出它支持的格式。
416        不支持的URI方案(unsupported url scheme)服务器由于不支持Request-URI中的URI方案而终止处理这个请求。
420        错误的扩展(Bad Extension)服务器不理解请求中Require头域指定的协议扩展。
421        需要扩展支持(extension required)UAS需要特定的扩展来处理这个请求,但是这个扩展并没有在请求的Supported头域中列出。具有这个应答码的应答必须包含一个Require头域列出所需要的扩展。
UAS不应当使用这个应答除非它真的不能给客户端提供有效的服务。相反,如果在Support头域中没有列出需要的扩展,服务器应当根据基准的SIP兼容的方法和客户端支持的扩展来进行处理。
423        间隔太短(interval too brief)服务器因为在请求中设置的资源刷新时间(或者有效时间)过短而拒绝请求。这个应答可以用于注册服务器来拒绝那些Contact头域有效期过短的注册请求。
480        暂时不可访问(Temporarily Unavailable)被叫的终端系统已经成功连接,但用户暂时不可访问(例如:用户未登录,或登录为免打扰)。服务器可以在Retry-After头域中另外指定一个访问时间。
481        呼叫支路/事务不存在(Call leg/Transaction Does Not Exist)在两种情况下服务器返回该响应:服务器收到一个BYE请求但找不到匹配的呼叫支路;或是收到一个CANCEL请求但找不到匹配的事务;或是收到与原来TAG标志不一样的INVITE请求。(对于无匹配的ACK请求,服务器直接将它丢弃,不响应)。
482        检测到循环呼叫(Loop Detected)请求消息的Via头域中包含接收服务器自身的地址。
483        跳数过多(Too Many Hop)请求的Via头域包含的条目数(跳数)超过Max-Forwards头域指定的值。
484        地址不全(Address Incomplete)请求的To或Request-RUL所指的地址不全。
485        地址不明确(Ambiguous)请求中提供的被叫地址不明确。该响应可以在Contact头域中列出不明确的地址。
486        被叫忙(Busy Here)被叫的终端系统已经成功连接,但用户暂时不愿意或不能够接收更多的呼叫。服务器可以在响应的Retry-After头域中另外指定一个访问时间。客户也可能通过其它方式访问,如:语音邮箱,因此该响应并不终止一个查询。如果我们知道没有其他终端系统能够接听这个呼叫,那么应当返回一个状态码600(Busy Everywhere)。
487        请求被拒绝(Request Cancelled)原来的请求消息被一个CANCEL请求所取消。
488        此处请求不接受(not acceptable here)这个应答和606(Not Acceptable)有相同的含义,但是只是应用于Request-URI所指出的特定资源不能接受,在其他地方请求可能可以接受。 包含了媒体兼容性描述的消息体可以出现在应答中,并且根据INVITE请求中的Accept头域进行规格化(如果没有Accept头域,那么就是application/sdp)。这个应答就像给OPTIONS请求的200(OK)应答的消息体一样。
491        未决请求(request pending)在同一个对话中,UAS接收到的请求有一个依赖的请求正在处理。
493        无法解密(undecipherable)不可辨识,UAS接收到了一个请求,包含了一个加密的MIME,并且不知道或者没有提供合适的解密密钥。这个应答可以包含单个包体,这个包体包含了合适的公钥,这个公钥用于给这个UAS通讯中加密包体使用的。
2.6  5xx类消息(服务器错误)
5xx消息表示SIP服务器故障不能完成对正确消息的处理。下面表4-5是常见的5xx类消息列表。
表1-4 常见的5xx类消息列表
500        服务器内部错误(Server Internal Error)服务器出现异常情况,不能处理请求。
501        功能未实现(Not Implemented 不可执行)服务器不支持完成请求所必需的功能。
502        网关错误(Bad Gateway)作为网关或代理的服务器在处理请求时从其它服务器接收到一个无效响应。
503        服务不可用(Sevice Unavailable)由于临时超载或正在维护,服务器当前不能处理请求。
504        网关超时(Gateway Timeout / service Time-out 服务器超时)作为网关的服务器在处理呼叫的过程中没有及时收到其它服务器(例如:定位服务器)的响应。
505        版本不支持(Version Not Supported)服务器不能或拒绝支持请求消息所用的版本。
513        消息过大(message too large)
2.7  6xx类消息(全局错误)
6xx消息表示请求不能在任何SIP服务器上实现。下面表4-6是常见的5xx类消息列表。
表1-5 常见的5xx类消息列表
600         全忙(Busy Everywhere)被叫的终端系统已经成功连接,但用户正忙,不愿够接受当前呼叫。服务器可以在响应的Retry-After头域中另外指定一个访问时间。该响应仅用于客户不能通过其它方式(如:语音邮箱)访问的情况。如果用户可通过其它方式访问,则应返回486(Busy Here)响应。
603        拒绝(Decline)被叫的终端系统已经成功连接,但用户明确不愿接受当前呼叫。服务器可以在响应的Retry-After头域中另外指定一个访问时间。
604         被叫不存在(Does Not Exist Anywhere)请求的To头域指定的用户不存在。
606        不可接受(Not Acceptable)用户代理已经成功连接,但某些会话描述如媒体类型、带宽或地址风格不能接受。该响应表示用户希望建立通信,但不能充分支持请求所描述的会话。
原文地址:https://www.cnblogs.com/luoyinjie/p/7219387.html