关于网络:从ABNF读懂HTTP协议格式

2次阅读

共计 2416 个字符,预计需要花费 7 分钟才能阅读完成。

定义

HTTP(Hyper Text Transfer Protocol)超文本传输协定
HTML(Hyper Text Markup Language)超文本标记语言
URI(Uniform Resource Identifier)用于标识某一互联网资源名称的字符串(uri 包含了 url,url 用于全网做惟一标识,http://localhost:8080/html/lo… 能够称为 url/uri,但 html/login.html 只能称为 uri)

HTTP 是互联网中利用最宽泛的应用层协定之一,设计之初是提供一种公布和接管 HTML 页面的办法,由 URI 来标识具体的资源。

报文格式

HTTP 别离规定了申请和响应的报文格式。
申请报文分为:申请行、申请头(首部行)、申请体(实体主体),GET 申请没有实体主体。
响应报文分为:响应行(状态行)、响应头(首部行)、响应体(实体主体)

咱们从浏览器或者抓包工具中看起来会像是这样

// 申请头
GET / HTTP/1.1
Host: icp.chinaz.com

// 响应头
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8

浏览器 / 抓包工具 会将 %20、%0D、%0A 类编码展现为空格、回车、换行,但实际上数据相似于 GET%20/%20HTTP/1.1%0AHost:%20icp.chinaz.com

这种报文格式是咱们所最常见到的标准,但实际上有更谨严的报文格式。

ABNF

ABNF 是最谨严的 HTTP 报文格式形容模式,来自 RFC。RFC(Request For Comments 申请意见稿)是 HTTP 的规范,由万维网协会(W3C)、互联网工程工作组(IETF)协调制订。

ABNF 报文格式将申请和响应定义在一起

HTTP-message = start-line *(header-field CRLF) CRLF [message-body]
start-line = request-line / status-line

ABNF 定义的 HTTP 报文格式为:一个开始行(申请行或者响应行),0 个或者多个首部行和回车换行的整体,一个回车换行,0 个或者 1 个实体

标识 含意
* 0 个或多个。2 示意至多 2 个,3 6 示意 3 到 6 个
/ 任选一个
() 示意为一个整体
[] 可选项,可有可无

对于 request-linestatus-lineheader-fieldmessage-body 也有更具体的定义。

request-line

request-line = method SP request-target SP HTTP-version CRLF
HTTP-version = HTTP-name “/” DIGIT “.” DIGIT
HTTP-name = %x48.54.54.50;HTTP

request-line 组成格局为:申请办法、空格、申请指标、空格、申请的 HTTP 版本、回车换行。转换成具体的数据格式可能是这样:GET /index.html HTTP/1.1

标识 含意
SP space 空格
DIGIT 数字
%x48.54.54.50 示意四个字节,别离为 %x48 %x54 %x54 %x50,为字符 HTTP
;HTTP 分号前面都是正文内容
status-line

status-line = HTTP-version SP status-code SP reason-phrase CRLF
status-code = 3DIGIT
reason-phrase = *(HTAB / SP / VCHAR / obs-text)

status-line 组成格局:HTTP 版本、空格、状态码、空格、响应形容、回车换行,最终数据格式可能为:HTTP/1.1 200 OK

标识 含意
HTAB tab 键
VCHAR 字符串如 OK
header-field

header-field = field-name “:” OWS field-value OWS
field-name = token
field-value = *(field – content / obs-fold)
OWS = *(SP | HTAB)

header-field 由名称和值这样的键值对组成,两头以空格或者 TAB 相隔,最终的数据格式相似于:Connection: keep-alive

message-body

message-body = *OCTET

message-body 不肯定有,比方 GET 申请头就没有,当存在的时候,能够为任意内容,比方申请 html 文件,响应为 html 代码。

标识 含意
OCTET 8 位数据,一个字节,任意内容

追踪 HTTP 报文

说完了 HTTP 报文的格局,那么咱们该怎么获取 HTTP 报文呢?应用 nodejs 起了一个服务,端口号是 8000,有三种不同的获取 HTTP 报文的形式。

浏览器

在浏览器中获取报文十分的不便,找到对应的申请,点击 Response Headers 的【View Source】就能够看到 HTTP 的响应头信息

但响应体没有包含在这里,须要点击 Response 能力看到

抓包工具

通过抓包工具 wireshark 获取到的协定内容更为残缺,多个申请都会呈现在追踪的 HTTP 流数据里。

依据 ABNF 定义,message-body 后没有【回车换行】字符,响应体后紧接着下一个申请的报文。

Xshell

平安终端模仿软件 Xshell,能够间接面向 HTTP 报文与服务器交互,更清晰、直观地看到申请报文、响应报文的内容。

通过 telnent 建设连贯,输出申请头

GET / HTTP/1.1 HOST: localhost: 8000

它还具备以上两种形式所没有的性能,就是测验申请报文格式的正确与否,当申请行与申请头之间没有回车换行时,会报错 400

总结

  • HTTP 超文本传输协定,在应用层,能够用来获取 HTML 页面、图片、字体等资源
  • ABNF 规定了 HTTP 最谨严的报文格式
  • 浏览器、抓包工具、终端模仿工具都能够获取到 HTTP 的申请报文

以上就是 从 ABNF 读懂 HTTP 协定格局 的内容,更多无关 前端 网络协议 的内容能够参考我其它的博文,继续更新中~

正文完
 0