美文网首页
ABNF语法

ABNF语法

作者: 温岭夹糕 | 来源:发表于2020-01-03 19:13 被阅读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

    相关文章

      网友评论

          本文标题:ABNF语法

          本文链接:https://www.haomeiwen.com/subject/lapioctx.html