协议-http协议-基础概念02-请求应答过程-请求响应报文结构-头部字段-请求方法-响应方式

参考来源:

极客时间-透视HTTP协议(作者:罗剑锋);
web抓包实战课-陶辉;

01-HTTP协议请求-应答过程

最简单的浏览器 HTTP 请求过程

  1. 浏览器从地址栏的输入中获得服务器的 IP 地址和端口号;
  2. 浏览器用 TCP 的三次握手与服务器建立连接;
  3. 浏览器向服务器发送拼好的报文;
  4. 服务器收到报文后处理请求,同样拼好报文再发给浏览器;
  5. 浏览器解析报文,渲染输出页面。
    在这里插入图片描述在这里插入图片描述

02-HTTP协议的请求报文和响应报文的结构

HTTP 协议的请求报文和响应报文的结构基本相同,由三大部分组成:

  1. 起始行(start line):描述请求或响应的基本信息;
  2. 头部字段集合(header):使用 key-value 形式更详细地说明报文;
  3. 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。

这其中前两部分起始行和头部字段经常又合称为“请求头”或“响应头”,消息正文又称为“实体”,但
与“header”对应,很多时候就直接称为“body”。

HTTP 协议规定报文必须有 header,但可以没有 body,而
且在 header 之后必须要有一个“空行”,也就
是“CRLF”,十六进制的“0D0A”。

所以,一个完整的 HTTP 报文就像是下图的这个样子,注意
在 header 和 body 之间有一个“空行”。
在这里插入图片描述
请求行由三部分构成:

  1. 请求方法:是一个动词,如 GET/POST,表示对资源的
    操作;
  2. 请求目标:通常是一个 URI,标记了请求方法要操作的资
    源;
  3. 版本号:表示报文使用的 HTTP 协议版本。

这三个部分通常使用空格(space)来分隔,最后要用
CRLF 换行表示结束。

在这里插入图片描述
状态行由三部分构成

  1. 版本号:表示报文使用的 HTTP 协议版本;
  2. 状态码:一个三位数,用代码的形式表示处理的结果,比
    如 200 是成功,500 是服务器错误;
  3. 原因:作为数字状态码补充,是更详细的解释文字,帮助
    人理解原因。
    在这里插入图片描述

03-头部字段

使用头字段需要注意下面几点

  1. 字段名不区分大小写,例如“Host”也可以写
    成“host”,但首字母大写的可读性更好;
  2. 字段名里不允许出现空格,可以使用连字符“-”,但不
    能使用下划线“_”。例如,“test-name”是合法的字
    段名,而“test name”“test_name”是不正确的字段
    名;
  3. 字段名后面必须紧接着“:”,不能有空格,而“:”后的
    字段值前可以有多个空格;
  4. 字段的顺序是没有意义的,可以任意排列不影响语义;
  5. 字段原则上不能重复,除非这个字段本身的语义允许,例
    如 Set-Cookie。

HTTP 协议规定了非常多的头部字段,实现各种各样的功能,但基本上可以分为四大类:

  1. 通用字段:在请求头和响应头里都可以出现;
  2. 请求字段:仅能出现在请求头里,进一步说明请求信息或
    者额外的附加条件;
  3. 响应字段:仅能出现在响应头里,补充说明响应报文的信
    息;
  4. 实体字段:它实际上属于通用字段,但专门描述 body 的
    额外信息。
请求字段-Host字段

首先要说的是Host字段,它属于请求字段,只能出现在请
求头里,它同时也是唯一一个 HTTP/1.1 规范里要求必须出
现的字段,也就是说,如果请求头里没有 Host,那这就是
一个错误的报文。

Host 字段告诉服务器这个请求应该由哪个主机来处理,当
一台计算机上托管了多个虚拟主机的时候,服务器端就需要
用 Host 字段来选择,有点像是一个简单的“路由重定
向”。

请求字段-User-Agent

User-Agent是请求字段,只出现在请求头里。它使用一个
字符串来描述发起 HTTP 请求的客户端,服务器可以依据它
来返回最合适此浏览器显示的页面。

但由于历史的原因,User-Agent 非常混乱,每个浏览器都
自称是“Mozilla”“Chrome”“Safari”,企图使用这个
字段来互相“伪装”,导致 User-Agent 变得越来越长,最
终变得毫无意义。

通用字段-Date字段-Server字段

Date字段是一个通用字段,但通常出现在响应头里,表示
HTTP 报文创建的时间,客户端可以使用这个时间再搭配其
他字段决定缓存策略。

Server字段是响应字段,只能出现在响应头里。它告诉客户
端当前正在提供 Web 服务的软件名称和版本号,例如在我
们的实验环境里它就是“Server: openresty/1.15.8.1”,
即使用的是 OpenResty 1.15.8.1。

Server 字段也不是必须要出现的,因为这会把服务器的一
部分信息暴露给外界,如果这个版本恰好存在 bug,那么黑
客就有可能利用 bug 攻陷服务器。所以,有的网站响应头
里要么没有这个字段,要么就给出一个完全无关的描述信
息。

实体字段-Content-Length

实体字段里要说的一个是Content-Length,它表示报文里
body 的长度,也就是请求头或响应头空行后面数据的长
度。服务器看到这个字段,就知道了后续有多少数据,可以
直接接收。如果没有这个字段,那么 body 就是不定长的,
需要使用 chunked 方式分段传输。

04-请求头里的请求方法

目前 HTTP/1.1 规定了八种方法,单词都必须是大写的形式
在这里插入图片描述

  1. GET:获取资源,可以理解为读取或者下载数据;
  2. HEAD:获取资源的元信息;
  3. POST:向资源提交数据,相当于写入或上传数据;
  4. PUT:类似 POST;
  5. DELETE:删除资源;
  6. CONNECT:建立特殊的连接隧道;
  7. OPTIONS:列出可对资源实行的方法;
  8. TRACE:追踪请求 - 响应的传输路径。

请求头中的请求方法-01-GET/HEAD

GET方法应该是 HTTP 协议里最知名的请求方法了,也应该
是用的最多的,自 0.9 版出现并一直被保留至今,是名副其
实的“元老”。

它的含义是请求从服务器获取资源,这个资源既可以是静态
的文本、页面、图片、视频,也可以是由 PHP、Java 动态
生成的页面或者其他格式的数据。

GET 方法虽然基本动作比较简单,但搭配 URI 和其他头字
段就能实现对资源更精细的操作。

例如,在 URI 后使用“#”,就可以在获取页面后直接定位
到某个标签所在的位置;使用 If-Modified-Since 字段就变
成了“有条件的请求”,仅当资源被修改时才会执行获取动
作;使用 Range 字段就是“范围请求”,只获取资源的一
部分数据。

HEAD方法与 GET 方法类似,也是请求从服务器获取资
源,服务器的处理机制也是一样的,但服务器不会返回请求
的实体数据,只会传回响应头,也就是资源的“元信息”。
HEAD 方法可以看做是 GET 方法的一个“简化版”或
者“轻量版”。因为它的响应头与 GET 完全相同,所以可
以用在很多并不真正需要资源的场合,避免传输 body 数据
的浪费。

请求头中的请求方法-02-POST/PUT

POST 也是一个经常用到的请求方法,使用频率应该是仅次
于 GET,应用的场景也非常多,只要向服务器发送数据,用
的大多数都是 POST。

PUT 的作用与 POST 类似,也可以向服务器提交数据,但
与 POST 存在微妙的不同,通常 POST 表示的是“新
建”“create”的含义,而 PUT 则是“修
改”“update”的含义。

在实际应用中,PUT 用到的比较少。而且,因为它与 POST
的语义、功能太过近似,有的服务器甚至就直接禁止使用
PUT 方法,只用 POST 方法上传数据。

请求头中的其他方法

讲完了 GET/HEAD/POST/PUT,还剩下四个标准请求方
法,它们属于比较“冷僻”的方法,应用的不是很多。

DELETE方法指示服务器删除资源,因为这个动作危险性太
大,所以通常服务器不会执行真正的删除操作,而是对资源
做一个删除标记。当然,更多的时候服务器就直接不处理
DELETE 请求。
CONNECT是一个比较特殊的方法,要求服务器为客户端和
另一台远程服务器建立一条特殊的连接隧道,这时 Web 服
务器在中间充当了代理的角色。
OPTIONS方法要求服务器列出可对资源实行的操作方法,
在响应头的 Allow 字段里返回。它的功能很有限,用处也不
大,有的服务器(例如 Nginx)干脆就没有实现对它的支
持。

TRACE方法多用于对 HTTP 链路的测试或诊断,可以显示
出请求 - 响应的传输路径。它的本意是好的,但存在漏洞,
会泄漏网站的信息,所以 Web 服务器通常也是禁止使用。

05-服务器的几种响应方式

比如,你发起了一个 GET 请求,想获取“/orders”这个文
件,但这个文件保密级别比较高,不是谁都能看的,服务器
就可以有如下的几种响应方式:

  1. 假装这个文件不存在,直接返回一个 404 Not found 报
    文;
  2. 稍微友好一点,明确告诉你有这个文件,但不允许访问,
    返回一个 403 Forbidden;
  3. 再宽松一些,返回 405 Method Not Allowed,然后用
    Allow 头告诉你可以用 HEAD 方法获取文件的元信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706285.shtml

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

相关文章

基于springboot的4S店车辆管理系统源码和论文

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

win10开机黑屏,只有鼠标,解决方案

问题描述 win10进不去桌面,可以进去锁屏,只有鼠标,也能进去任务管理器(ctrlwindelete), 问题分析 进入任务管理器->文件->运行新任务 然后输入 explorer.exe 发现找不到了 原因:误删explorer.exe …

Linux系统---nginx(1)服务

目录 一.Nginx概述 1.定义 2.Nginx模块作用 (1)main模块 (2)stream服务模块 (3)邮件服务模块 (4)第三方模块 (5)events模块 (6&#xff0…

300分钟吃透分布式缓存-16讲:常用的缓存组件Redis是如何运行的?

Redis 基本原理 Redis 简介 Redis 是一款基于 ANSI C 语言编写的,BSD 许可的,日志型 key-value 存储组件,它的所有数据结构都存在内存中,可以用作缓存、数据库和消息中间件。 Redis 是 Remote dictionary server 即远程字典服务…

SpringCloud有哪些组件

什么是SpringCloud? Spring Cloud是基于Spring Boot的分布式系统开发工具,它提供了一系列开箱即用的、针对分布式系统开发的特性和组件,用于帮助开发人员快速构建和管理云原生应用程序。 Spring Cloud的主要目标是解决分布式系统中的常见问题…

代码随想录算法训练营第二十七天补|39. 组合总和 ● 40.组合总和II ● 131.分割回文串

组合问题:集合内元素的组合,不同集合内元素的组合 分割问题:本质还是组合问题,注意一下如何分割字符串 回溯模板伪代码 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素&#xf…

【Maven】Maven 基础教程(一):基础介绍、开发环境配置

Maven 基础教程(一):基础介绍、开发环境配置 1.Maven 是什么1.1 构建1.2 依赖 2.Maven 开发环境配置2.1 下载安装2.2 指定本地仓库2.3 配置阿里云提供的镜像仓库2.4 配置基础 JDK 版本2.5 配置环境变量 1.Maven 是什么 Maven 是 Apache 软件…

N个数中寻找前K个最大的数

文章目录 一、先把这N个数的前K个建立一个小堆二、再把这K个数与剩下的N-K个数进行比较交换三、最后用向下调整算法就可以得到这N个数中最大的前K个 一、先把这N个数的前K个建立一个小堆 先创建一个文本文件,然后向里面写数据,这里N我设置的是1000 int n…

【web APIs】1、(学习笔记)有案例!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、概念二、使用步骤1.获取DOM对象2.操作元素内容3.属性修改3.1.常用属性修改3.2.控制样式属性3.3.操作类名(className) 操作CSS3.4.操作表单元素属性3.5.自定…

【LeetCode每日一题】938. 二叉搜索树的范围和

2024-2-26 文章目录 [938. 二叉搜索树的范围和](https://leetcode.cn/problems/range-sum-of-bst/)思路:写法一:在中间累加写法二:在最后累加 938. 二叉搜索树的范围和 思路: 1.在二叉搜索树中:左子树的结点都小于根节…

小甲鱼Python06 序列字典集合

一、序列 1.id函数 is运算符 我们首先思考下字符串、元组、列表的共同点: 都有很多共同的运算符。都可以通过索引来获取元素,第一个元素索引都是0,都可以通过切片的方法获取某个范围内元素的集合。 以上三种统称为序列。序列分为可变序列…

抖音视频评论采集软件|抖音数据抓取工具

抖音视频评论采集软件是一款基于C#开发的高效、便捷的工具,旨在为用户提供全面的数据采集和分析服务。该软件不仅支持通过关键词进行搜索抓取,还能够通过分享链接进行单个视频的抓取和下载,让用户轻松获取抖音视频评论数据。 其中&#xff0c…

JSP实现数据传递与保存(一)

一、Web开发步骤 1.1两类模式 后端——————前端 先有前端&#xff0c;前端用的时候直接调用 后端已实现注册接口&#xff0c;接口名为doRegister.jsp 前端此时&#xff1a; 前端的form表单中的action提交地址就只能填doRegister.jsp&#xff0c;即&#xff1a; <f…

10.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏发送数据的操作

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;接管游戏连接服务器的操作 码云地址&#xff08;master 分支&#xff09;&#xff1a;染指/titan 码云版本号&#xff1a;00820853d5492fa7b6e32407d46b5f9c01930ec6 代码下载地址&#xff0c;在 ti…

Doris——荔枝微课统一实时数仓建设实践

目录 一、业务介绍 二、早期架构及痛点 2.1 早期架构 2.2 架构痛点 三、技术选型 四、新的架构及方案 五、搭建经验 5.1 数据建模 5.2 数据开发 5.3 库表设计 5.4 数据管理 5.4.1 监控告警 5.4.2 数据备份与恢复 六、收益总结 七、未来规划 原文大佬这篇Doris腾…

适配器模式(Adapter Pattern) C++

上一节&#xff1a;原型模式&#xff08;Prototype Pattern&#xff09; C 文章目录 0.理论1.组件2.类型3.什么时候使用 1.实践1.基础接口和类2.类适配器实现3.对象适配器实现 0.理论 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允…

日更【系统架构设计师知识总结3】存储系统

【原创精华总结】自己一点点手打、总结的脑图&#xff0c;把散落在课本以及老师讲授的知识点合并汇总&#xff0c;反复提炼语言&#xff0c;形成知识框架。希望能给同样在学习的伙伴一点帮助&#xff01;

《TCP/IP详解 卷一》第9章 广播和本地组播

目录 9.1 引言 9.2 广播 9.2.1 使用广播地址 9.2.2 发送广播数据报 9.3 组播 9.3.1 将组播IP地址转换为组播MAC地址 9.3.2 例子 9.3.3 发送组播数据报 9.3.4 接收组播数据报 9.3.5 主机地址过滤 9.4 IGMP协议和MLD协议 9.4.1 组成员的IGMP和MLD处理 9.4.2 组播路由…

基于微信小程序的垃圾分类系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

vue2 day6 7

1、vuex简介&#xff1a;共享数据 &#xff08;数据在组件中传递 组件通信&#xff09; 2、创建仓库 js中&#xff1a;this.$store 让我们可以在别的组件中访问仓库对象 3、state状态&#xff1a;提供公共数据&#xff08;data只提供当前组件数据&#xff09; 4、mutati…