RFC3261(7 消息定义)

    SIP是一个基于文本的协议,使用UTF-8字符集(RFC2279[7])。

一个SIP消息既可以是一个从客户端到服务器端的请求,也可以是一个从服务器端到客户端的一个应答。

    请求(7.1)和应答(7.2)消息都基于RFC2822格式,只是在字符集上和语法细节上有所不同。(比如SIP允许头域不是标准的RFC2822头域)。这两种消息类型都由一个起始行,一个或者多个头域,一个标明头域结束的回车换行,一个可选的消息体组成。

 

一般消息=  起始行

*头域

CRLF

[消息体]

起始行= 请求行/状态行

 

    起始行、每一个头域字段行,空行都必须由回车换行组成(CRLF)。即使没有消息体,也必须有一个空行标明头域的结束。

    除了在字符集上的区别以外,很多SIP的消息和头域的格式都和HTTP/1.1一样。我们在这里就不重复它的语法和语义了,我们用[HX.Y]来标志HTTP/1.1规范(RFC2616[8])的X.Y节的描述。

    然后,SIP并非一个HTTP的扩展。

7.1 请求

    SIP请求是根据起始行中的请求行来区分的。一个请求行包含Method,Request-URI,和协议版本,彼此之间用SP(单个空格)分隔。

    请求行由CRLF(回车换行组合)结束。除了用作行结束标志以外,不允许CR或者LF出现在其他地方。在任何元素中,不允许出LWS(任意数量的空格)。

 

Request-Line = Method SP Request-URI SP SIP-VERSION CRLF

Method: 本规范规定了6中方法:REGISTER用于登记联系信息,INVITE,ACK,CANCEL用于建立会话,BYE用于结束会话,OPTIONS用于查询服务器所提供的能力。在按照RFC标准文档化的SIP扩展中可能包含其他的方法。

Request-URI: Request-URI是一个SIP或者SIPS URI,他们在19.1节由描述。也可以是一个通用的URI(RFC 2396[5])。它标明了请求所发往的用户或者服务的地址。Request-URI禁止包含空白字符或者控制字符,并且禁止用”<>”括上。

    SIP 元素可以支持除了SIP或者SIPS之外的其他方式的Request-URIs。比如”tel” URI方式(RFC 2806[9])。SIP元素可以用他们自己的机制来转换non-SIP URIs到SIP URI,SIPS URI或者其他什么格式的URI。

SIP-Version:请求和应答消息都包含当前使用的SIP版本,这个遵循[H3.1](类似HTTP用SIP替代,用SIP/2.0替代HTTP/1.1)中关于版本的规定,版本依赖,升级版本号。      一个应用发出的SIP消息一定要包含SIP-Version “SIP/2.0”。这个SIP版本串是大小写不敏感的,但是在实现中必须发送大写。

不像HTTP/1.1,SIP把版本号当作一个文本串处理。实际上,没有什么区别。

7.2应答

    SIP应答和SIP请求的区别在于以一个状态行作为它的起始行。状态行由协议版本、状态吗和状态描述组成,每一个元素之间用一个SP(空格)分隔。

    除了最后用作结束标志以外,CR/LF不允许出现在其他地方。

status-line = SIP-VERSION SP STATUS-CODE SP Reasong-Phrase CRLF

状态码 是一个3位数字的结果码,用来标志处理请求的结果。Reason-Phrase是一个简短的Status-Code描述。Status-Code是为了能自动处理使用的,但是Reason-Phrase是用来给用户看得。一个客户端并不要求一定要显示或者解释这个Reason-Phrase。

    本文档建议设置这个reason-phrase,实现时可以选择其他文本,比如用请求包头中指定的合适语言来显示。

    status-code的第一个数字表示了应答的类型。接下来两个数字并不作分类使用。因此,任何100到199的状态码可以统称位”1xx应答”,类似的,在200到299的可以统称位”2xx应答”,依此类推。SIP/2.0允许6类应答:

1xx:临时应答-请求已被接收,正在处理这个请求。

2xx:成功处理-请求已被成功接收、解析、受理。

3xx:重定向-为了处理该请求,需要进一步的操作

4xx:客户端错误--请求包含错误的语法或者不能被服务器处理。

5xx:服务器错误-服务器不能正确的处理这个显然合法的请求。

6xx:全局错误-请求不能被任何服务器处理。

21节定义了详细的状态码说明。

7.3 头域

    SIP头域和HTTP头域在语法和语义上都比较类似。尤其是,SIP头域遵循[H4.2]关于消息头的语法的定义,并且遵循多行的扩展头域的规则。然而后者在HTTP规范中支持隐式的空白和折叠。本规范遵循RFC2234[10],并且把明确的空白和封装作为内在的语法规则。

    [H4.2]也规定了具有相同域名的多个域可以合并到一个头域中,他们的值以逗号分隔列表显示,。这个也适用于SIP,但是因为语法不通,细节上略有不同。实际上,任何SIP的包头语法都是基于如下范式的:

header = “ header-name” HCOLON header-value *(COMMA header-value)

对于拥有同样域名的头域,可以合并为一个头域,其值采用逗号分隔列表显示。Contact头域除了当域值是”*”之外,都允许采用逗号分割的列表方式。

7.3.1 头域格式。

    头域遵循在RFC2822的2.2节定义的通用头域格式。每一个头域都由一个域名加上冒号和域值组成。

field-name:field-value

    消息头的正式语法将在25节中详细介绍。

    在消息头中,允许在冒号的左右有任意个数的空白;但是,在实现时,建议避免域名和冒号中间有空格,并且建议在冒号和值之间使用单个空格(SP)。

Subject:         lunch

Subject    :     lunch

Subject         :lunch

Subject: lunch

    上面的都是合法的,也是相等的,但是推荐使用最后一种方式。

头域可以扩展为多行的,只要在每一个附加行前边用至少一个SP或者水平TAB(HT)打头就可以了。这种多行的头域在行结尾并且在下一行之前的空白SP(或者HT)将被认为是一个单个的SP字符。所以,下边的例子是相等的:

Subject: I know you’re there, pick up the phone and talk to me!

Subject: I know you’re there,

pick up the phone,

and talk to me!

    头域中的不同字段名的头字段的相关顺序并没有什么意义。但是,我们还是强烈建议与路由相关的域(VIA,ROUTE,Record-Route,Proxy-Require,Max-Forwards,Proxy-Authorization等等)放在消息头的最前边,这样可以提高处理的速度。相同字段名的头字段之间的顺序非常重要。只有当单个头域的域值是可以用逗号分割的列表的时候,才可以表达成为同一个字段名的多个头字段(也就是说,遵循7.3定义的语法)。这意味着必须可以将同一个域名的多个头域在不改变消息语义的前提下,改换表达成为一对”域名: 域值”;这个转换是通过顺序增加每一个域的域值,域值之间用逗号分割。这个规则有几个例外,就是WWW-Authenticate,Authorization,Proxy-Authenticate,和Proxy-Authorization头域,这些头域的的语法并不遵循7.3中定义的通用格式,所以,他们并不能合并成为单个头域行。

   在实现上,必须既能够处理多个头域行的情况,也必须能够处理用逗号分割的合并的单个头域行的情况。

   下边的几组头域是相等的:

Route: <sip:alice@atlanta.com>

Subject: Lunch

Route: <sip:bob@biloxi.com>

Route: <sip:carol@chicago.com>

 

Route: <sip:alice@atlanta.com>, <sip:bob@biloxi.com>

Route: <sip:carol@chicago.com>

Subject: Lunch

 

Subject: Lunch

Route: <sip:alice@atlanta.com>, <sip:bob@biloxi.com>

<sip:carol@chicago.com>

 

下边各组是合法的,但是并不相等。

Route: <sip:alice@atlanta.com>

Route: <sip:bob@biloxi.com>

Route: <sip:carol@chicago.com>

 

Route: <sip:bob@biloxi.com>

Route: <sip:alice@atlanta.com>

Route: <sip:carol@chicago.com>

 

Route: <sip:alice@atlanta.com>,<sip:carol@chicago.com>,<sip:bob@biloxi.com>

 

    每一个头域值的格式依赖于它的头域名。它可以是任意顺序的UTF8编码的字节字符,也可以是一个空格、符号、分隔符、引号括起来的字串的组合。很多头域都会附带一个通用的域值格式。这个域值格式是由封号分开的参数名和参数值的组合:

field-name: field-value *(;parameter-name=parameter-value)

    尽管域值里边可以有任意数量的parameter-name/parameter-value对,但是不能允许有相同的parameter-name存在(唯一性)。

    除了特别定义的头域之外,在比较域名的时候是大小写不敏感的。头域中的域名、域值、parameter name/parameter-value也是大小写不敏感的。符号始终是大小写不敏感的。除非有特别的指定,引号中的字符串是大小写敏感的。例如:

Contact: <sip:alice@atlanta.com>;expires=3600

CONTACT: <sip:alice@atlanta.com>; ExPiReS=3600

相同。

Content-Disposition: session;handling=optional

content-disposition: Session;HANDLING=OPTIONAL

相同。

下边的两个头域不相同:

Warning: 370 devnull “Choose a bigger pipe”

Warning: 370 devnull “CHOOSE A BIGGER PIPE”

7.3.2 头域分类。

   有一些头域是仅仅在请求(或者应答)中有效的。这些头域叫做请求头域或者应答头域。如果消息中的头域与这个消息的类型不匹配(比如在应答消息中出现的请求头域),这个头域必须被忽略。20节定义了每一个头域的分类。

7.3.3 缩写格式

    SIP提供了一个用缩写格式来表达通用头域名字的机制。这个有助于避免消息过大而导致通讯层无法传输(比如在UDP传输的时候超过了最大传输单元(MTU))。这个缩写格式在20节定义。缩写格式的消息头域名字可以在不改变消息语义的情况下替代较长的消息头域名字。在单个消息中,头域名字既可以用长的格式,也可以用缩写格式。在实现中,必须同时支持对长名字和缩写名字的处理。

7.4消息体

    请求信息,包括本规范以后扩展的新请求,都可以包含一个消息体。对消息正文的解释依赖于请求的方法(请求类型)。

    对于应答消息来说,请求方法和应答状态码决定了消息体的格式。所有的应答消息都可以有一个消息体。

7.4.1 消息体类型

    消息中的网络媒体类别必须在Content-Type头域中指明。如果消息体通过某种形式的编码,比如压缩等等,必须在Content-Encoding 头域中指明,否则Content-Encoding域必须忽略。若可以,消息体的字符集作为Content-type头域的值的一部分表达。

    在RFC2046[11]中定义的多部分”multipart” MIME类型可以在消息体中应用。在由多部分组成的消息体发送的时候,如果接收方的Accept域中不支持包含多部分的消息体,那么发送方必须发送一个非多部分的消息体。

   SIP消息可以包含二进制的消息体或者部分消息体。如果发送方没有显式的指定字符集参数,媒体的文本子类型会是缺省的字符集”UTF-8”。

7.4.2 消息体长度

    在Content-Length头域中存放了消息体的字节长度。第20.14节讲述了本域的详细解释。

    HTTP/1.1的“chunked”传输编码方式并不适用于SIP。(备注:chuncked编码传输方式是通过把消息体分为一系列的块来传输的,每一块有它自己的大小标记) 

7.5 分帧的SIP消息

    不同于HTTP的是,SIP实现可以使用UDP或者其他非可靠传输协议。每一帧包括一个请求或者应答。第18节讲述了非可靠传输的限制。

    在处理以面向流的通讯为基础的SIP消息的时候,必须忽略在开始行之前的CRLF[H4.1]。

    Content-Length头域用来确定每一个SIP消息在通讯流中的结束位置。在基于面向流通讯基础上的SIP消息一定要使用这个头域。

转载于:https://www.cnblogs.com/share-everything-i-do/archive/2012/10/31/2748795.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sip RFC3261 中文版 1、SIP协议介绍 10 2、SIP协议功能概况 10 3、术语 12 4、实施概览 12 5、协议的结构 22 6、协议的定义 24 7、SIP消息: 32 7.1 请求 33 7.2应答 34 7.3 头域 35 7.3.1 头域格式。 35 7.3.2 头域分类。 39 7.3.3 缩写格式 39 7.4包体 39 7.4.1 消息正文类型(MessageBodyType) 39 7.4.2 消息体长度 40 7.5 分帧的SIP消息(Framing SIP Messages) 40 8 一般用户代理行为 40 8.1 UAC特性 41 8.1.1 产生一个请求 41 8.1.1.1 Request-URI 42 8.1.1.2 TO 42 8.1.1.3 From 43 8.1.1.4 Call-ID 44 8.1.1.5 Cseq 45 8.1.1.6 Max-Forwards 45 8.1.1.7 Via 45 8.1.1.8 Contact 46 8.1.1.9 Supported 和 Require 47 8.1.1.10 附加信息部分 47 8.1.2 发送一个请求 47 8.1.3 处理应答 48 8.1.3.1: transaction 层的错误 49 8.1.3.2 未知的应答 49 8.1.3.3 Vias 49 8.1.3.4 处理3xx应答 49 8.1.3.5 处理4xx应答 51 8.2 UAS特性 52 8.2.1 方法判定 53 8.2.2 包头判断 53 8.2.2.1 TO 和Request-URI 53 8.2.2.2 合并的请求 54 8.2.2.3 Require 54 8.2.3 内容处理 55 8.2.4 应用扩展 55 8.2.5 处理请求 56 8.2.6 产生应答 56 8.2.6.1 发送一个临时应答 56 8.2.6.2 包头和Tags 57 8.2.7 无状态UAS行为 57 8.3 重定向服务器 58 9 取消一个请求(Cancel) 60 9.1 客户行为(Client Behavior) 60 9.2 服务端行为(Server Behavior) 62 10 注册(Registrations) 63 10.1 概览 63 10.2 构造一个REGISTER请求 64 10.2.1 增加绑定 66 10.2.1.1 设置Contact地址的过期参数 67 10.2.2 删除绑定 68 10.2.3 访问绑定 68 10.2.4 刷新绑定 69 10.2.5 设置内部时钟 69 10.2.6 寻找注册服务器 69 10.2.7 传送一个请求 70 10.2.8 错误响应 70 10.3 处理REGISTER请求 70 11 查询能力 73 11.1 构造OPTIONS请求 74 11.2 处理OPTIONS请求 75 12 对话(Dialog) 77 12.1 创建一个对话 78 12.1.1 UAS行为 78 12.1.2 UAC行为 79 12.2 对话中的请求 80 12.2.1 UAC行为 81 12.1.1.1 产生请求 81 12.2.1.2 处理应答 83 12.2.2 UAS行为 84 12.3 终止对话 85 13 初始化一个会话 85 13.1 概览 85 13.2 UAC处理 86 13.2.1 创建一个初始化的INVITE 86 13.2.2 处理INVITE应答 89 13.2.2.1 1xx应答 89 13.2.2.2 3xx应答 89 13.2.2.3 4xx,5xx,6xx应答 90 13.2.2.4 2xx 应答 90 13.3 UAS处理 91 13.3.1 处理INVITE 91 13.3.1.1 提示进度 92 13.3.1.2 INVITE请求转发 93 13.3.1.3 INVITE请求的拒绝 93 13.3.1.4 接受INVITE请求 93 14 更改已经存在的会话 94 14.1 UAC行为 95 14.2 UAS行为 96 15 结束一个会话 98 15.1 使用BYE请求终止一个会话 99 15.1.1 UAC行为 99 15.1.2 UAS行为 100 16 proxy行为 100 16.1 概述 100 16.2 有状态的proxy 101 16.3 验证请求 103 16.4 路由信息预处理 105 16.5 确定请求的目的 106 16.6 请求转发 108 16.7 应答的处理 117 16.8 处理定时器C 125 16.9 处理通讯层的错误 126 16.10 CANCEL处理 126 16.11 无状态的proxy 127 16.12 Proxy Route处理的总结 129 16.12.1例子 130 16.12.1.1 基本SIP四边形 130 16.12.1.2 穿越一个严格路由proxy 132 17事务 134 17.1 客户端事务 136 17.1.1 INVITE客户事务 137 17.1.1.1 INVITE事务概述 137 17.1.1.2 正式的描述 138 17.1.1.3 构造ACK请求 142 17.1.2 非INVITE客户端事务 143 17.1.2.2 正式的描述 143 17.1.3 客户端事务匹配应答 145 17.1.4 处理通讯错误 145 17.2 服务端事务 147 17.2.1 INVITE服务端事务 147 17.2.2 非INVITE服务端事务 150 17.2.3 为服务端事务匹配请求。 151 17.2.4 处理通讯错误 154 18 通讯(transport) 154 18.1 客户Clients 155 18.1.1 发送请求 155 18.1.2 接收应答 157 18.2 服务端 158 18.2.1 接收请求 158 18.2.2 发送应答 159 18.3 分块 160 18.4 错误处理 161 19 常见消息部件(Common Message Components) 161 19.1 SIP和SIPS统一资源标记 161 19.1.1 SIP和SIPS部件 162 19.1.2 Character Escaping Requirements(字符转码要求) 166 19.1.3 SIP和SIPS URI例子 168 19.1.4 URI比较 168 19.1.5 从URI中产生请求 171 19.1.6 关联SIP URI和tel URL 173 19.2 Option Tags 175 19.3 Tags 175 20 头域 176 20.1 Accept 178 20.2 Accept-Encoding 181 20.3 Accept-Language 182 20.4 Alert-Info 182 20.5 Allow 183 20.6 Authentication-Info 183 20.7 Authorization 183 20.8 Call-ID 184 20.9 Call-Info 184 20.10 Contact 185 20.11 Content-Disposition 186 20.12 Content-Encoding 187 20.13 Content-Language 188 20.14 Content-Length 188 20.15 Content-Type 189 20.16 Cseq 189 20.17 Date 190 20.18 Error-Info 190 20.19 Expires 191 20.20 From 191 20.21 In-Reply-To 192 20.22 Max-Forwards 193 20.23 Min-Expires 193 20.24 MIME-Version 193 20.25 Organization 194 20.26 Priority 194 20.27 Proxy-Authenticate 195 20.28 Proxy-Authorization 195 20.29 Proxy-Require 196 20.30 Record-Route 196 20.31 Reply-To 196 20.32 Require 197 20.33 Retry-After 197 20.34 Route 198 20.35 Server 198 20.36 Subject 198 20.37 Supported 199 20.38 Timestamp 199 20.39 To 199 20.40 Unsupported 200 20.41 User-Agent 200 20.42 Via 200 20.43 警告 202 20.44 WWW-Authenticate 204 21 应答代码 205 21.1 临时应答1xx 205 21.1.1 100 Trying 205 21.1.2 180 Ringing 205 21.1.3 818 Call is Being Forwarded(呼叫被转发) 205 21.1.4 182 Queued 206 21.1.5 183 会话进度 206 21.2 成功信息2xx 206 21.2.1 200 OK 206 21.3 转发请求3XX 206 21.3.1 300 Multiple Choices 206 21.3.2 301 Moved Permanently 207 21.3.3 302 Moved Temporarily 207 21.3.4 305 Use Proxy 208 21.3.5 380 Alternative Service 208 21.4 请求失败4xx 208 21.4.1 400 Bad Request 208 21.4.2 401 Unauthorized 208 21.4.3 402 Payment Required 209 21.4.4 403 Forbidden 209 21.4.5 404 Not Found 209 21.4.6 405 Method Not Allowed 209 21.4.7 406 Not Acceptable 209 21.4.8 407 Proxy Authentication Required 209 21.4.9 408 Request Timeout 210 21.4.10 410 Gone 210 21.4.11 413请求实体过大。 210 21.4.12 414 Request-URI Too Long 210 21.4.13 415 Unsupported Media Type 211 21.4.14 416 Unsupported URI Scheme 211 21.4.15 Bad Extension 211 21.4.16 421Extension Required 211 21.4.17 423 Interval Too Brief 211 21.4.18 480 Temporarily Unavailable 212 21.4.19 481 Call/Transaction Does Not Exist 212 21.4.20 482 Loop Detected 212 21.4.21 483 Too Many Hops 212 21.4.22 484 Address InComplete 213 21.4.23 485 Ambiguous 213 21.4.24 486 Busy Here 213 21.4.25 487 Request Terminated 214 21.4.26 488 Not Acceptable Here 214 21.4.27 491 Request Pending 214 21.4.28 493 Undecipherable 214 21.5 Server Failure 5xx 214 21.5.1 500 Server Internal Error 215 21.5.2 501 Not Implemented 215 21.5.3 502 Bad Gateway 215 21.5.4 503 Service Unavailable 215 21.5.5 504 Server Time-out 216 21.5.6 505 Version Not Supported 216 21.5.7 Message To Large 216 21.6 Global Failures 6xx 216 21.6.1 600 Busy Everywhere 216 21.6.2 603 Decline 217 21.6.3 604 Does Not Exists Anywhere 217 21.6.4 606 Not Acceptable 217 22 使用HTTP认证 218 22.1 框架 218 22.2 用户到用户的认证。 221 22.3 Proxy到用户的认证 222 22.4 Digest 认证方案 225 23 S/MIME 227 23.1 S/MIME 认证 227 23.2 S/MIME 密钥交换 228 23.3 加密MIME 包体 231 23.4 SIP头隐私和用S/MIME的完整性:SIP地道 233 23.4.1 SIP头的完整性和机密属性 234 23.4.1.1 完整性 234 23.4.1.2 机密性 234 23.4.2 隧道的完整性和身份认证 236 23.4.3 隧道加密 239 24 例子 242 24.1 注册 242 24.2 建立会话 244 25 SIP协议的BNF范式 251 25.1 基本规则 252 26 安全考虑:威胁模式和安全应用建议。 273 26.1 攻击和威胁模式 274 26.1.1 注册服务 Hijacking。 274 26.1.2 模仿一个服务器 275 26.1.3 修改消息包体 276 26.1.4 破坏会话 277 26.2 安全机制 278 26.2.1 通讯和网络层的安全 279 26.2.2 SIPS URI方案 281 26.2.3 HTTP Authentication 282 26.2.4 S/MIME 282 26.3 安全机制的实现 283 26.3.1 对SIP实现者的要求 283 26.3.2 安全解决方案 284 26.3.2.1 注册 284 26.3.2.2 在域之间的请求 286 26.3.2.3 点对点请求 288 26.3.2.4 DoS 防护 289 26.4 限制 290 26.4.1 HTTP Digest 290 26.4.2 S/MIME 291 26.4.3 TLS 292 26.4.4 SIPS URI 293 26.5 Privacy(隐私) 295 27 IANA 认证 295 27.1 Option Tags 296 27.2 Warn-Codes 296 27.3 头域名 297 27.4 方法和应答码 297 27.6 新Content-Disposition 参数注册 299 28 同RFC 2543的改变 299 28.1 主要的功能改变 300 28.2 小功能性的变更 304 29 标准索引 304 30 信息索引: 307 定时器值的表格: 308 感谢书 310 版权声明 313

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值