首页 > 其他分享 >从ABNF读懂HTTP协议格式

从ABNF读懂HTTP协议格式

时间:2022-11-27 19:55:27浏览次数:36  
标签:HTTP ABNF field 报文 读懂 line 请求

定义

HTTP(Hyper Text Transfer Protocol)超文本传输协议
HTML( Hyper Text Markup Language)超文本标记语言
URI(Uniform Resource Identifier)用于标识某一互联网资源名称的字符串(uri 包括了 url,url 用于全网做唯一标识,http://localhost:8080/html/login.html 可以称为 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协议格式的内容 , 更多有关 前端网络协议 的内容可以参考我其它的博文,持续更新中~

标签:HTTP,ABNF,field,报文,读懂,line,请求
From: https://www.cnblogs.com/vigourice/p/16929671.html

相关文章

  • HTTP总结
    http的完整交互过程:当客服端第一向服务器发送请求的时候服务器处理请求给客服端响应,服务器会在响应的请求头里面加入一些东西,就上我在HTTP里面说的哪些在这里我就不重复了......
  • Windows 7环境下HttpListener拒绝访问异常解决方法
      问题:Win7下在尝试搭建简单http服务器的时候,执行httpListener.Start();报错HttpListener拒绝访问异常 代码如下:HttpListenerhttpListener=newHttpListene......
  • HTTP
    这是我画的图来理解客服端与服务端。当客服端发送一个get请求到服务端的时候服务端会处理请求,然后响应给客服端。在给的响应里面服务器会在请求头里面加入cache-control,E......
  • 跨平台网页开发框架ASP.NET Core 7性能大提升,正式支持HTTP/3
     微软跨平台网页开发框架ASP.NETCore即将迎来第7个主要版本,由于.NET7对性能的诸多改善,ASP.NETCore7也同时受益,官方解释,由于.NET7在性能部分的提升,许多方面直接或间接......
  • Dbian10编译nginx实验部署HTTP3(Quiche)
    https://zach.vip/web/dbian10%E7%BC%96%E8%AF%91nginx%E5%AE%9E%E9%AA%8C%E9%83%A8%E7%BD%B2http3/......
  • HTTP缓存
    浏览器、缓存服务器、源服务器   浏览器:资源请求直接发起方。   源服务器:资源实际提供方。   缓存服务器:在浏览器、源服务器之间架设的中间服务器,由它代替浏览......
  • 【认证机制】2-Apache配置HTTP Basic Auth
    1.基本流程1.1使用htpasswd命令创建用户文件进入apache安装目录,使用htpasswd.exe创建用户Admin(密码:password),保存在 apache_auth.htpasswd中(生成文件可以是任意......
  • 【认证机制】1-Http Basic Auth
    一、简介HTTPBasicAuth是HTTP协议提供的一种简单的挑战应答机制,服务器可以通过该机制从客户机请求认证信息(用户标识和密码)。客户端在授权标头中将身份验证信息凭证(采用......
  • Linux下好用的下载软件(bt,磁力,http,https, stream...)
    https://www.codenong.com/1664311678768348926/下面来看一下Linux有哪些常用又好用的下载工具。XDMXDM(XtremeDownloadManager)是一个免费且功能强大的下载工具,支持简......
  • 第五十八章 CSP的常见问题 - HTTP请求失败
    第五十八章CSP的常见问题-HTTP请求失败HTTP请求失败。无法处理超事件。这是什么意思?当浏览器试图与CSPbroker小程序通信但无法通信时,会发生超级事件错误。这可能与代......