定义

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协议格式的内容 , 更多有关 前端网络协议 的内容可以参考我其它的博文,持续更新中~

从ABNF读懂HTTP协议格式的更多相关文章

  1. 从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

    本文原作者阮一峰,作者博客:ruanyifeng.com. 1.引言 HTTP 协议是最重要的互联网基础协议之一,它从最初的仅为浏览网页的目的进化到现在,已经是短连接通信的事实工业标准,最新版本 HT ...

  2. [转帖]从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

    从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路   http://www.52im.net/thread-1709-1-2.html     本文原作者阮一峰,作者博客:r ...

  3. 一泡尿的时间,快速读懂QUIC协议

    1.TCP协议到底怎么了? 现时的互联网应用中,Web平台(准确地说是基于HTTP及其延伸协议的客户端/服务器应用)的数据传输都基于 TCP 协议. 但TCP 协议在创建连接之前需要进行三次握手(如下 ...

  4. 网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议

    1.TCP协议到底怎么了? 现时的互联网应用中,Web平台(准确地说是基于HTTP及其延伸协议的客户端/服务器应用)的数据传输都基于 TCP 协议. 但TCP 协议在创建连接之前需要进行三次握手(如下 ...

  5. 一文读懂MQTT协议

    1  概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级 ...

  6. 详解 WebRTC 传输安全机制:一文读懂 DTLS 协议

    作者|进学 审校|泰一 DTLS (Datagram Transport Layer Security) 基于 UDP 场景下数据包可能丢失或重新排序的现实情况下,为 UDP 定制和改进的 TLS 协 ...

  7. 一文读懂高性能网络编程中的I/O模型

    1.前言 随着互联网的发展,面对海量用户高并发业务,传统的阻塞式的服务端架构模式已经无能为力.本文(和下篇<高性能网络编程(六):一文读懂高性能网络编程中的线程模型>)旨在为大家提供有用的 ...

  8. 快速读懂 HTTP/3 协议

    在 深入浅出:HTTP/2 一文中详细介绍了 HTTP/2 新的特性,比如头部压缩.二进制分帧.虚拟的"流"与多路复用,性能方面比 HTTP/1 有了很大的提升.与所有性能优化过程 ...

  9. 一文读懂HTTP/2及HTTP/3特性

    摘要: 学习 HTTP/2 与 HTTP/3. 前言 HTTP/2 相比于 HTTP/1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何 ...

  10. 一文读懂Redis持久化

    Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集合.以及散列等,并且还支持多种排序功能. 什么叫持久 ...

随机推荐

  1. windows10下编译32位和64位webrtc(m77)静态库

    1. windows10下编译32位和64位webrtc(m77)静态库 省略挂代理下载depot_tools以及webrtc代码的过程... 可参考webrtc编译 务必在 cmd 终端环境下进入到 ...

  2. WSGI实现支持多URL的WEB服务器

  3. values_list() 元组形式显示查询结果

    values_list() 元组形式显示查询结果 name,age为数据库的两个列 Student.objects.values_list('name','age') values_list() 元组 ...

  4. django model字段类型

    1.models.AutoField 自增列=int(11) 如果没有的话,默认会生成一个名称为id的列,如果要显示的定义一个自增列,必须把该列设置为主键(primary_key=True)2.mod ...

  5. flutter系列之:使用AnimationController来控制动画效果

    目录 简介 构建一个要动画的widget 让图像动起来 总结 简介 之前我们提到了flutter提供了比较简单好用的AnimatedContainer和SlideTransition来进行一些简单的动 ...

  6. 【CF】873B Balanced Substring(前缀和+map)

    Balanced Substring 刚讲过差分与前缀和专题,一直以为这两个名词很高大上,其实也就那回事.哈哈. 题源:https://codeforces.com/contest/873/probl ...

  7. 预测 motif 的计算原理

    本文章来源于简书,作者小潤澤,已获原作者授权:部分内容有调整. 前言 蛋白质中功能的基本单元是 domain,是一种特殊的三维结构,不同结构的 domain 与其他分子特异性结合从而发挥功能.与此类似 ...

  8. flutter dio自定义http client

    final dio = Dio(); Dio getMyDio() { initAdapter(); dio.options.headers = {'apiKey': 'xxxxx'}; dio.op ...

  9. 使用Docker将Vite Vue项目部署到Nginx二级目录

    Vue项目配置 使用Vite创建一个Vue项目,点我查看如何创建 配置打包路径 在Nginx中如果是二级目录,例如/web时,需要设置线上的打包路径 在项目跟路径下创建两个文件:.env.produc ...

  10. vivo 游戏黑产反作弊实践

    作者:vivo 互联网安全团队 - Cai Yifan 在数字化.移动化的浪潮下,游戏产业迅速发展,尤其疫情过后许多游戏公司业务迎来新的增长点. 游戏行业从端游开始一直是黑灰产活跃的重要场景.近年来, ...