02Web协议详解-HTTP协议具体格式

153 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

一、ABNF(扩充巴科斯-瑙尔范式)

  • 我们需要一种非常严谨的语法表达方式来指导HTTP协议的格式,可以引入巴科斯-瑙尔范式,它是一种定义语法的元语言,定义协议语法时常用ABNF这样一种范式,那么他的主要内容包括两部分:操作符和核心规则

(一)第一部分:操作符

  • 空白字符:用来分隔定义中的各个元素,并不是表达所要描述的协议中实际有空白字符。比如下图定义的请求行,method和request-target中有个SP,SP还有两个空格,这两个空格就是空白字符,仅用来做分隔,而实际的method(方法)和request-target(路径)之间用一个空格是通过SP表达的

image.png

  • 选择/:表示多个规则都是可供选择的一个规则。比如下图中的起始行,它既可以是一个请求行,也可以是一个响应行,那么就把请求行和响应行之间用斜杠来连接起来

image.png

  • 值范围%c##-##:常用的规则就是值范围。比如下图中,定义0-7,用斜杠表示可选的关系是可以的,但是更方便的方式可以用比如说%x,就是16进制中的30-37,两种表达方式是完全等价的

image.png

  • 序列组合():用小括号将规则组合起来,视为单个元素
  • 不定量重复m*n:同一类字符,对重复多少次做一次定义。比如我们经常看到的说可以有0个或多个HTTP头部,首先用*元素可以表示0个或多个,然后HTTP头部,每次都需要以CRLF来结尾,这时候我们用小括号把它扩成一个序列 然后加一个*就表示有零个或者多个头部,每个头部最后都必须以换行CRLF来结尾。
  • 1*就表示一个或者多个元素,2*4就表示两个或四个元素。

image.png

  • 可选序列[]:比如说我们的请求和HTTP的响应,它们的message-body都是可有可无的,并不是一定存在的,所以在描述message-body的时候,加上了一对中括号。

image.png

(二)第二部分:核心规则

ABNF的核心规则见下表: image.png

二基于ABNF语义定义HTTP的消息格式

image.png

image.png