扩展Backus-Naur范式简介

        扩展Backus-Naur范式是一种计算机科学的元语法,用于定义许多互联网协议,包括SIP。它的原始定义规范是在RFC 822,说明如何解析文本消息。最新定义版本是RFC 5234。ABNF使用一个7位的ASCII字符集,并定义了字符串的匹配规则。

例如:

Message = Request / Response

        上面表达式定义了一条名为Message的规则,它是根据其它两条规则Request和Response推导定义的。其中的斜杠“/”表示一种选择,表示message既可以是Request,也可以是Response。ABNF的基本规则如下:

Name = elements; Comment CRLF

        其中Name表示规则的名字,规则元素跟在等号后面。注释以分号( ; )开始,一直持续到行尾,并以回车换行符(CRLF)结束。元素可以是简单的字符串,例如:

Element1 = “test”

Element2 = “Test”

Element3 = “TEST”

        规则定义中使用字符串实际上是大小写不敏感的。因此,上述的Element1,Element2,和Element3都是等价的。较新的ABNF扩展,允许指定为大小写敏感。例如:

Element4 = %s “test”

Element5 = %s “Test”

Element6 = %s “TEST”

        以上三条定义会严格匹配大小写,而接下来的三条定义:Element7、Element8,和Element9,等效于之前的Element1、Element2和Element3。

Element7 = %i “test”

Element8 = %i “Test”

Element9 = %i “TEST”

        在ABNF中,单个ASCII字符通常以十六进制编码,并加上一个百分号前缀。例如:

value1 = %x61 ;

a value2 = %x65 ; A

 

        规则value1 匹配小写字母a,而value2匹配大写字母A。可以指定一个取值范围,用连字符-连接:

Digit = %x30-39 ; Digits “0” through “9”

 

        ABNF里,把规则放在一起表示串联:

Element5 = value1 value2 ; aA

 

        ABNF中的分组用括号()括起来,并视为单个元素。可选规则用方括号[]括起来。规则可以重复引用,如表1所示。

表2给出ABNF的优先级顺序规则。例如:

“a” / “b” “c” 匹配“a” 或“bc” 但不匹配“ac”

 (“a” / “b”) “c” 匹配“ac” 或“bc” 但不匹配 “a”

*(“a” “b”) “c” 匹配“ababc” 但不匹配 “aaabc”

 

 

        表 3 是一个ABNF实例,它是SIP的host规则的简化版本。这条规则允许host配置为域名或者IPv4地址,或IPv6地址。比如说,ese.wustl.example与规则匹配,但ese..example就不行。对于IPv4地址,以点号“.”分隔的任意四组三位数组合,都与规则IPv4address匹配。

 

表1

ABNF 重复实例

2*3 Rule

Rule可以出现两到三次

*4 Rule

Rule 最多可以出现四次

3 Rule

Rule 必须出现三次

*Rule

Rule 可以出现任意次数,包括零次

表2

ABNF 优先级顺序

Strings, Names formation

Comment

Value range

Repetition

Grouping, optional

Concatenation

Alternative

 

表3

ABNF 实例:定义主机名host

host

= hostname/IPv4address/IPv6ref

hostname

= *( domainlabel “.” ) toplabel [ “.” ]

domainlabel

= alphanum/ alphanum *( alphanum / “-” ) alphanum

toplabel

= ALPHA / ALPHA *( alphanum / “-” ) alphanum

IPv4address

= 1*3DIGIT “.” 1*3DIGIT “.” 1*3DIGIT “.” 1*3DIGIT

IPv6ref

= “[“ IPv6address “]”

IPv6address

= hexpart [ “:” IPv4address ]

hexpart

= hexseq / hexseq “::” [ hexseq ] / “::” [ hexseq ]

hexseq

= hex4 *( “:” hex4)

hex4

= 1*4HEXDIG

alphanum

= ALPHA / DIGIT

ALPHA

= %x41-5A / %x61-7A ; A-Z / a-z

DIGIT

= %x30-39 ; 0-9

HEXDIG

= DIGIT / “A” / “B” / “C” / “D” / “E” / “F”

你可能感兴趣的:(VOIP)