从ABNF读懂HTTP协议格式

news2025/1/23 17:44:37

定义

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

标识含义
SPspace 空格
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

标识含义
HTABtab键
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 代码。

标识含义
OCTET8位数据,一个字节,任意内容

追踪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://www.coloradmin.cn/o/40303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动控制原理1~3章课后练习题

1.适合于应用传递函数描述的系统是线性定常系统 2.某0型单位反馈系统的开环增益为K&#xff0c;则在 r(t)1/2*t^2 输入下&#xff0c;系统的稳态误差为 无穷 3.动态系统 0 初始条件是指 t<0 时系统的 输入、输出以及它们的各阶导数为 0 4.若二阶系统处于无阻尼状态&#…

毕业设计-opencv图像视频质量评价分析

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

二级域名配置以及nginx解析二级域名到html页面

此文章适合发布前端项目使用&#xff0c;如果想要配置二级域名到后端服务&#xff0c;可以查看这篇文章&#xff1a;nginx配置二级域名 - 简书 在阿里云上配置二级域名&#xff0c;就是添加一条记录就可以了&#xff0c;超级简单&#xff0c;不懂的可以看后面的解释说明&#…

05.深入理解JMM和Happens-Before

JMM都问啥&#xff1f; 最近沉迷P5R&#xff0c;所以写作的进度很不理想&#xff0c;但不得不说高卷杏YYDS。话不多说&#xff0c;开始今天的主题&#xff0c;JMM和Happens-Before。 关于它们的问题并不多&#xff0c;基本上只有两个&#xff1a; JMM是什么&#xff1f;详细…

[附源码]计算机毕业设计JAVA社团管理系统

[附源码]计算机毕业设计JAVA社团管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

c语言实现三子棋

目录 一、三子棋玩法 二、需要实现的游戏功能 三、拆分代码 3.1游戏菜单 3.2初始化棋盘 3.2.1函数调用 3.2.2函数体实现 3.3打印棋盘 3.3.1函数调用 3.3.2函数体实现 3.4玩家下棋 3.4.1函数调用 3.4.2函数体实现 3.4.3效果展示 3.5电脑下棋 3.5.1函数调用 3.5…

强大博客搭建全过程(1)-hexo博客搭建保姆级教程

1、 前言 本人本来使用国内的开源项目solo搭建了博客&#xff0c;但感觉1核CPU2G内存的服务器&#xff0c;还是稍微有点重&#xff0c;包括服务器内还搭建了数据库。如果自己开发然后搭建&#xff0c;耗费时间又比较多&#xff0c;于是乎开始寻找轻量型的博客系统。 此时hexo…

苹果系统(macos)code with me 控制端下载不下来,下载缓慢,解决办法

jetbrains的插件,依赖包,或者是工具之类的下载通常都比较慢,尤其是大文件等很久后可能还断开了.又要重头下.比如 code with me,以下简称cwm curl: (56) Recv failure: Connection reset by peer 如果你曾用sh安装时提示这个,多数就是网络连接不行了. 简单说就是用下载工具下…

redis集群搭建教程及遇到的问题处理

这里&#xff0c;在一个Linux虚拟机上搭建6个节点的redis伪集群&#xff0c;思路很简单&#xff0c;一台虚拟机上开启6个redis实例&#xff0c;每个redis实例有自己的端口。这样的话&#xff0c;相当于模拟出了6台机器了&#xff0c;然后在以这6个实例组建redis集群就可以了。 …

jsp旅行社管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 旅行社管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5 开发&#xff0c;数据库为Mysql&#xff0c;使用…

JAVA之Spring MVC 请求与响应 REST风格 SSM整合(注解版)

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 使用简单&#xff0c;开发便捷&#xff08;相比于Servlet&#xff09; 灵活性强 入门案例 导入依赖SpringMVC坐标 <dependency><groupId>org.springframework</groupId><artifactId>spring-web…

[附源码]计算机毕业设计JAVA实践教学管理系统

[附源码]计算机毕业设计JAVA实践教学管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

01 使用docker搭建wordpress博客网站

文章目录1. 前言1.1 容器技术思维导图1.2 wordpress 网络架构图2. 拉取镜像3. 搭建博客网站3.1 启动MariaDB3.2 运行应用服务器 WordPress3.3 使用nginx 做反向代理3.4 检查容器状态4. 登录博客配置5 查看数据库1. 前言 基于之前学习kubernetes 比较乱&#xff0c;打算重新学习…

机器学习笔记 十九:由浅入深的随机森林模型之分类

随机森林学习内容1. 集成学习2.sklearn中的集成算法2.1 sklearn中的集成算法模块ensemble2.2 RandomForestClassifier2.2.1 参数2.2.2 n_estimators2.2.3 random_state2.2.4 bootstrap & oob_score2.3 随机森林的重要接口2.4 Bonus&#xff08;装袋法的必要条件&#xff09…

【指针详解】(上)看一遍就会❗❗❗家人们冲❗

前言 ❤️ 铁汁们大家好&#xff0c;欢迎大家来到出小月的博客里&#xff0c; &#x1f917;&#x1f917;&#x1f917;之前呢&#xff0c;我分享了C语言的小游戏“扫雷”。。。。今天呢&#xff0c;给大家分享指针篇&#xff0c;&#xff0c;希望大家看完我这篇文章都能够“涨…

Java Tomcat内存马——Servlet内存马

目录 前言&#xff1a; &#xff08;一&#xff09;Servlet的创建 1、实现javax.servlet.Servlet接口的方式 2、继承GenericServlet类创建Servlet 3、继承了HttpServlet进行创建 &#xff08;二&#xff09;分析注入方式 代码分析 (三&#xff09;payload 1、StandardC…

阿里云OSS、用户认证与就诊人

oss 模块搭建与实现 这里采用的方式是通过后端传 oss&#xff0c;可以对比下 谷粒商城里面的&#xff0c;从后端拿上传凭证&#xff0c;然后前端直传的方式 <dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId> <…

数字化管理门店| 甜品店管理系统

对不少女生来说&#xff0c;甜品店绝对算是经常去的地方&#xff0c;尤其出新品的时候&#xff0c;就如奶茶店一样在排队&#xff0c;在武汉一家足球场的旁边&#xff0c;有一家“甜如箭丘”品牌门店&#xff0c;整体环境装修的非常附有文艺感&#xff0c;明亮的店堂&#xff0…

第7章 网络优化与正则化

系列文章目录 第1章 绪论 第2章 机器学习概述 第3章 线性模型 第4章 前馈神经网络 第5章 卷积神经网络 第6章 循环神经网络 第7章 网络优化与正则化 第8章 注意力机制与外部记忆 第9章 无监督学习 第10章 模型独立的学习方式 第11章 概率图模型 第12章 深度信念网络 第13章 深…

[Flask]Pycharm+Flask零基础项目搭建入门

Flask在Python web开发中虽然热度低于Django但是也存在不小的市场空间&#xff0c;能作为一个主流web开发框架之一也不是浪得虚名&#xff0c;还是有不少干货在里面的&#xff0c;Flask也具备了不少的自身优势&#xff0c;在后面的认识中我们再逐步深入了解 今天我们就来带大家…