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

定义

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协定格局的内容 , 更多无关 前端网络协议 的内容能够参考我其它的博文,继续更新中~

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理