一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
一、ABNF(扩充巴科斯-瑙尔范式)
- 我们需要一种非常严谨的语法表达方式来指导HTTP协议的格式,可以引入巴科斯-瑙尔范式,它是一种定义语法的元语言,定义协议语法时常用ABNF这样一种范式,那么他的主要内容包括两部分:操作符和核心规则
(一)第一部分:操作符
- 空白字符:用来分隔定义中的各个元素,并不是表达所要描述的协议中实际有空白字符。比如下图定义的请求行,method和request-target中有个SP,SP还有两个空格,这两个空格就是空白字符,仅用来做分隔,而实际的method(方法)和request-target(路径)之间用一个空格是通过SP表达的
- 选择
/:表示多个规则都是可供选择的一个规则。比如下图中的起始行,它既可以是一个请求行,也可以是一个响应行,那么就把请求行和响应行之间用斜杠来连接起来
- 值范围
%c##-##:常用的规则就是值范围。比如下图中,定义0-7,用斜杠表示可选的关系是可以的,但是更方便的方式可以用比如说%x,就是16进制中的30-37,两种表达方式是完全等价的
- 序列组合
():用小括号将规则组合起来,视为单个元素 - 不定量重复
m*n:同一类字符,对重复多少次做一次定义。比如我们经常看到的说可以有0个或多个HTTP头部,首先用*元素可以表示0个或多个,然后HTTP头部,每次都需要以CRLF来结尾,这时候我们用小括号把它扩成一个序列 然后加一个*就表示有零个或者多个头部,每个头部最后都必须以换行CRLF来结尾。 1*就表示一个或者多个元素,2*4就表示两个或四个元素。
- 可选序列
[]:比如说我们的请求和HTTP的响应,它们的message-body都是可有可无的,并不是一定存在的,所以在描述message-body的时候,加上了一对中括号。
(二)第二部分:核心规则
ABNF的核心规则见下表: