SIP 是采用UTF-8进行编码的文本协议,SIP消息包含request和response,也就是UAC发向UAS的request以及由UAS发向UAC的response。request和response是采用RFC 2822中规定的基本格式。
request和response都由start-line ,一个或多个header fields,指示header fields 结束的empty line以及可选的message-body。
start-line,message-header line以及empty line 都必须
以回车换行序列 (CRLF) 结束,而message-header line和message-body line之间以空行间隔,如上图橙框。值得注意的是,即使message-body 不存在,空行也必须存在。
SIP request有作为start-line的Request-Line,Request-Line包含SIP method name,a Request-URI以及用单个空格分隔的SIP协议版本。
Request-Line会
以CRLF结束,正如上图模式。request method可以是REGISTER ,INVITE, ACK,CANCEL,UPDATE等等。
Request-URI 可以是 SIP URI 或者tel URI,
它指示该请求所针对的用户或服务。
Request-URI 不得包含空格或控制字符,也不能包含在“<>”中。
几个request的结构示例如上图。
SIP response 的start-line则是Status-Line。Status-Line 由SIP协议版本,Status-Code以及Reason-Phrase组成,即
Status-Line = SIP-Version SP Status-Code SP Reason-Phrase CRLF。
Status-Code
是一个 3 位整数结果代码,指示尝试理解和满足请求的结果。
Reason-Phrase是
在给出Status-Code的简短文本描述。
Status-Code的第一位数字定义了响应的类别。
最后两位数字没有任何分类作用。
因此,
Status-Code在 100 到 199 之间的任何响应都称为“1xx 响应”,
Status-Code在 200 到 299 之间的任何响应都称为“2xx 响应”,依此类推。
?SIP/2.0 允许第一位数字有六个值:
??1xx:临时——收到请求,继续处理该请求;
??2xx:成功——该行动被成功接收、理解和接受;
??3xx:重定向——需要采取进一步的操作才能完成请求;
??4xx:客户端错误——请求包含错误语法或无法在此服务器上实现;
??5xx:服务器错误——服务器未能满足明显有效的请求;
??6xx:全局失败——任何服务器都无法满足请求。
上图是相关status-code的总结。
几个responses的结构示例如上图。
SIP header field是SIP消息的重要组成部分,必须包含6个header field :
To、From、CSeq、Call-ID、Max-Forwards 和 Via;
这六个header field 是 SIP 消息的基本组成部分,它们提供大多数关键消息路由服务,包括消息寻址、响应路由、限制消息传播、消息排序以及transaction的唯一标识。