一、BNF

巴科斯-瑙尔范式BNF(BNF: Backus-Naur Form)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。

BNF中常用的元字符及其表示的意义如下:

  • ::= :是“被定义为”的意思;示例:字符串 ::= 用引号包围的字符序列,表示 字符串 就是 用引号包围的字符序列
  • “…”:终结符,即引号中的字符序列本身,并非指代其它字。而终结符双引号 " 用 double_quote 用来表示;示例:函数调用 ::= 名字 “()” 表示 函数的调用 是 由 名字 加上左右括号字符 () 组成;
  • double_quote :代表终结符 双引号 "; 示例:字符串 ::= double_quote … double_quote,表示 字符串 是由被字符 " 包围的字符序列组成;
  • 在双引号外的字代表着语法部分;示例:基本类型 ::= 字符串 | 数字 | 布尔,表示 字符串 或 数字 或 布尔 都是 基本类型,但 字符串、数字、布尔 具体是什么,由其它 规则定义;
  • <…>:必选项;示例:名字 ::= [姓] <名> 表示 名字 中的 名 是必须要有的,但 姓 是可有可无的,即:姓 名 是 名字,名 也是 名字;
  • […]:可选,可有可无;示例:名字 ::= [姓] <名> 表示 名字 中的 名 是必须要有的,但 姓 是可有可无的,即:姓 名 是 名字,名 也是 名字;
  • {…}:重复,0 或 任意次重复;示例:AB ::= “a” {“b”},表示 AB 是由 一个 a 后面跟上任意数量(包括0个)个 b 组成,如 a、a b、a bb、a bbb
  • (…):分组,用来控制表达式的优先级;示例:AX ::= “a” (“m”|“n”),表示 AX 是由 一个 a 后面跟上 m 或 n 组成;
  • |:替换,即 或 的意思;示例:布尔 ::= “true” | “false”,表示 true 或 false 都是 布尔;
  • …:表示各种列举或省略的代码片断;示例:a…z 表示 从 a 到 z 的字符,“…” 表示 由 双引号 " 包围起来的任意字符;
  • 斜体字: 参数,在其它地方有解释;

二、ABNF

RFC2234 定义了增加型巴科斯范式(ABNF)。近年来在Internet的定义中 ABNF 被广泛使用。ABNF 做了更多的改进。增强型巴科斯-瑙尔范式(ABNF)基于了巴科斯-瑙尔范式(BNF),但由它自己的语法和推导规则构成。这种元语言的发起原则是描述作为通信协议(双向规范)的语言的形式系统。它建档于 RFC 4234 中通常充当 IETF 通信协议的定义语言。

2.1 推导规则

ABNF 规定是一组推导规则,写为:

规则 = 定义 ; 注释 CR LF

说明:

  • 这里的规则是大小写敏感的非终结符,定义是由定义这个规则的符号序列、一个文档注释组成,并结束于回车换行。
  • 规则名字是大小写不敏感的: , , 都提及同一个规则。规则名字由开始于一个字母的字母、数字和连字符组成。不要求用尖括号(“<”, “>”) (如 BNF 那样)包围规则名字。但是它们可以用来界定规则名字,比如在冗文中识别出规则名字的时候。ABNF 使用 7-位 ASCII 编码,在 8-位域中把高位置零。
  • 终结符由一个或多个数值字符指定。数值字符可以指定为跟随着基数(b = 二进制, d = 十进制, x = 十六进制)的一个百分号“%”,随后是这个数值,或数值的串联(用“.” 来指示)。例如回车可以指定为十进制的 %d13 或十六进制的 %x0D。回车换行可以指定为 %d13.10。
  • 文字正文通过使用包围在引号(")中字符串来指定。这些字符串是大小写不敏感的,使用的字符集是 US-ASCII。所以字符串“abc”将匹配“abc”, “Abc”, “aBc”, “abC”, “ABc”, “AbC”, “aBC” 和 “ABC”。对于大小写敏感匹配,必须定义明确的字符: 要匹配 “aBc” 定义将是 %d97 %d66 %d99。

2.2 操作符

空白被用来分隔定义的各个元素: 要使空格被识别为分割符则必须明确的包含它。

2.3 串联

规则1 规则2

规则可以通过列出一序列的规则名字来定义。
示例:
要匹配字符串“aba”可以使用下列规则:

fu = %x61; a
bar = %x62; b
mumble = fu bar fu

2.4 选择

规则1 / 规则2

规则可以通过用反斜杠(“/”)分隔的多选一规则来定义。
示例:
要接受规则 或规则 可构造如下规则:

fubar = fu / bar

2.5 递增规则

规则1 =/ 规则2

可以通过使用在规则名字和定义之间的“=/”来向一个规则增加补充选择。
示例:
规则

ruleset = alt1 / alt2 / alt3 / alt4 / alt5

等价于

ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5

2.6 值范围

%c##-##

数值范围可以通过使用连字符(“-”)来指定。
示例:
规则

OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"

等价于

OCTAL = %x30-37

2.7 序列分组

(规则1 规则2)

元素可以放置在圆括号中来组合定义中的规则。
示例:
要匹配“elem fubar snafu”或“elem tarfu snafu”可以构造下列规则:

group = elem (fubar / tarfu) snafu

要匹配“elem fubar”或“tarfu snafu”可以构造下列规则:

group = elem fubar / tarfu snafu
group = (elem fubar) / (tarfu snafu)

2.8 可变重复

n*m规则

要指示一个元素的重复可以使用形式 <a>*<b>元素。可选的 <a> 给出要包括的元素的最小数目,缺省为 0。可选的<b> 给出要包括的元素的最大数目,缺省为无穷。
对零或多个元素使用 *元素,对一或多个元素使用 1*元素,对二或三个元素使用 2*3元素。

2.9 特定重复

n规则

要指示明确数目的元素可使用形式 <a>元素,它等价于 <a>*<a>元素。
使用 2DIGIT 得到两个数字,使用 3DIGIT 得到三个数字。(DIGIT 在下面的核心规则中定义)。

2.10 可选序列

[规则]

** 示例:**
要指示可选元素下列构造是等价的:

[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)

2.11 注释

; 注释

分号(“;”)开始一个注释并持续到此行的结束。

2.12 优先级规则

上述操作符有从最紧绑定(binding)到最松绑定的给定优先级:

  1. 字符串,名字形成(formation)
  2. 注释
  3. 值范围
  4. 重复
  5. 分组,可选
  6. 串联
  7. 选择
    与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。

2.13 核心规则

核心规则定义于 ABNF 标准中;
111

三、HTTP协议定义

HTTP(Hypertext Transfer Protocol超文本传输协议):a stateless application-level request/response protocol that uses extensible semantics and self-decriptive message payloads for flexible interaction with network-based bypertext information systems.(RFC7230 2014.6)

HTTP是一种无状态的、应用层的、以请求/应答方式运行的协议,它使用扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。

四、HTTP消息格式

HTTP消息格式基于ABNF语义定义,具体格式如下
222

  • 请求行,例如:GET /themes/butterfly/source/css/min/by.index.min.css HTTP/1.1
  • 应答行,例如:HTTP/1.1 200 OK
  • 请求头,例如:Host:greaterway.cn
  • 消息体,例如:json数据

可以在secureCRT上执行telnet来测试HTTP请求。

[root@VM-20-10-centos ~]# telnet greaterway.cn 8090
Trying 114.132.200.181...
Connected to greaterway.cn.
Escape character is '^]'.
GET /themes/butterfly/source/css/min/by.index.min.css HTTP/1.1
Host:greaterway.cn:8090 // 此处回车两次

HTTP/1.1 200 OK
Date: Sat, 03 Sep 2022 09:56:24 GMT
Access-Control-Allow-Headers: Content-Type,ADMIN-Authorization,API-Authorization
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 3600
Set-Cookie: JSESSIONID=node0u8v2zjcmioc1g2ala07842c021862.node0; Path=/
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Last-Modified: Sat, 11 Jun 2022 08:36:23 GMT
Content-Type: text/css
Accept-Ranges: bytes
Content-Length: 134

/*! 首页修饰 */
.by_index .by_header {
height: 100vh;
}
.by_index .by_header:before {
background-color: rgba(0, 0, 0, 0.2);
}
打赏
支付宝 微信
上一篇 下一篇