ABNF语法

2020-01-03  本文已影响0人  温岭夹糕

浏览器进行一次简单的请求过程介绍

摘自极客时间陶辉老师课件

1.先服务器通过调用系统调用监听固定端口

2.浏览器输入URL,到达DNS,通过DNS将域名解析为目标主机IP

3.用户主机与目标主机建立TCP连接(Http建立在TCP基础之上),若为HTTPS协议则还需要进行一次SSL协议的交互

4.构造HTTP请求,并填充响应的HTTP头部,之后发送HTTP请求

5.服务端发送响应的请求结果

那什么是HTTP协议?

协议,故名思意是双向的,两方都要遵循

HTTP在C/S模型中位于应用层

HTTP协议又名超文本传输协议,所谓的超文本指除了文本文件外,还包括视频,音频和图像等资源(能用二进制表示),并且我们可以通过规定的规则链接并访问到该文件。

所谓“超文本”,就是“超越了普通文本的文本”,它是文字、图片、音频和视频等的混合体,最关键的是含有“超链接”,能够从一个“超文本”跳跃到另一个“超文本”,形成复杂的非线性、网状的结构关系。

所谓“文本”(Text),就表示 HTTP 传输的不是 TCP/UDP 这些底层协议里被切分的杂乱无章的二进制包(datagram),而是完整的、有意义的数据,可以被浏览器、服务器这样的上层应用程序处理。

HTTP是无状态的,一段代码可能依赖另一段代码来执行,但一次HTTP请求的结果并不依赖上一次HTTP请求

是需要客户端请求,服务端响应的协议,即以请求/应答的方式运行

HTTP协议还具有可扩展性,即使协议版本过低,仍可以进行通信

第四步的填充HTTP协议头,那么协议格式长什么样?

HTTP协议报文与TCP报文不同的地方是它是一个“纯文本”的协议,所以头数据都是 ASCII 码的文本,可以很容易地用肉眼阅读,不用借助程序解析也能够看懂。

通常由三部分组成

1.起始行star-tline,start-line又可以根据是请求操作还是响应操作划分为请求行(request-line)或响应行(staus-line)

2.多个协议头部header-field

3.消息主体message-body

如何解读协议的格式?

就需要引入ABNF即扩展的巴科斯范式

巴科斯范式分为操作符核心规则

操作符(常用)

1.空白字符

规则1 规则2

用来分隔定义中的各个元素,并不是实际有空白字符

空格通过SP来表达

GET(请求方法)   /(路径)     HTTP/1.1(协议版本)   可看成

method  SP request-target SP HTTP-version CRLF

2.选择/:

可以通过反斜杠(/)分隔的多选的规则

规则1 / 规则2

如起始行只能为请求头或响应头可表示为

start-line = request-line/status-line

3.值范围 %c##-##:

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

比如 语句0-7中选其一,我们可以用反斜杠(多选一)语句表示为

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

我们可以借助值范围进行更方便的规则定义

OCTAL = %x30-37

补充:b = 二进制, d = 十进制, x = 十六进制

4.序列分组

单括号() 将多个规则组合起来视为单个元素

(%x30-37  %x30-37 )/ "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"

5.不定量重复 m*n

在正则中*表示零个或多个,在abnf中也是如此通过m和n指定

m为至少,n为至多

如可以有0个或多个http头部表述为

*(header-field CRLF)

1*(header-field CRLF)  一个以上

2*4(header-field CRLF)  2-4个

6.可选序列 []

经常使用man或--help在linux中查找帮助的应该不陌生,表示这个选项为可选

如消息体为可选可表述为

[message-body]

7.递增选择

=/  可以使用在规则名和定义之间,来向一个规则增加补充选择

ruleset = alt1 / alt2 / alt3 / alt4 / alt5

等价于

ruleset = alt1 / alt2

ruleset =/ alt3    后续对定义的补充

ruleset =/ alt4 / alt5


操作符优先级

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

1.字符串,名字形成(formation)

2.值范围

3.重复

4.分组,可选

5.串联

6.选择

与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。

作者:科研者  链接:https://www.jianshu.com/p/15efcb0c06c8 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

核心规则

核心规则

其中CR是MAC系统的操作换行,LF是LINUX的换行,win为CRLF

已经学习了ABNF,不妨来用该范式来描述HTTP协议的规则?

源自https://www.cnblogs.com/rdchenxi/p/10953151.html

对应着核心规则进行解读

HTTP消息为 一个起始行 零个或多个消息头 消息主体可选

HTTP-message = (start-line) *(header-filed CRLF) CRLF [message-body]

其中 起始行为请求行或响应行

start-line = request-line/status-line

请求行格式为:请求方式  请求路径  协议版本

request-line = method SP request-target SP HTTP-version CRLF

响应行为: 协议版本  状态码  详细描述

status-line = HTTP-version SP status-code SP reason-phrase CRLF

请求头结构:头部名字 “  :”  类型 值

header-field = field-name ":" OWS field-value OWS

OWS等为自定义的可进一步解读

.......大概知道意思懒得解读了,反正遇到不认识的大写查核心规则就行了

其他的英语语义可以解释

利用xshell 观察http请求

telnet 域名 端口 (尽量是选择http协议的)

结果可以看这个博客:https://www.cnblogs.com/rdchenxi/p/10953151.html

结果

pre为消息体,在消息头部的选项有对消息体进行描述

为content-lentth:108字节长度为108字节

响应类型为css文件 content-type = text / css

利用wireshark进行抓包

打开抓包工具

我们关注有波段起浮的网卡(不知道是不是这样子描述)

如果你电脑是wifi连接一般是WLAN起伏,我这里是网线连接所有是以太网波段起伏,对这个网卡进行抓包,点击捕获,选择以太网,下方设置选项

浏览器为80端口

点击开始,之后打开xshell利用telnet发送http协议,之后再回来看

我们寻找info选项为刚才我们输入的路径

目标结果

点击,选择展开

我们可以看到每一段都对应着数字矩阵的一部分,/r/n即CRLF被解码为0d 0a

补充:已经了解了请求和响应的报文形式,再来了解下URI的组成

URI由 scheme、host:port、path 和 query 四个部分组成,但有的部分可以视情况省略

以一下URI为例

https://github.com/chronolaw/http_study?a=2

scheme称为协议名如HTTP,FTPS

如:https

://用以分隔

host:port即主机名加端口号也被称为authority,表示资源所在的主机名

主机名可以是IP或域名的形式,端口不填默认80(浏览器为80端口)

如github.com

path:表示要访问资源存放的路径

如:/chronolaw/http_study

query:要访问时携带的额外参数

如a=2

上一篇 下一篇

猜你喜欢

热点阅读