探索HTTP协议的世界 | 从基础到高级应用,原理与实践相结合(请求篇)

从基础到高级应用,原理与实践相结合

  • 什么是Http
    • 历代Http协议
    • 主要特点
    • 格式和URL
    • 协议内容
      • 请求行
        • 格式如下
        • 请求方法
        • 简单案例
      • 消息报头
        • 报头域的格式
        • HTTP消息报头类型
          • 普通报头
            • 优化方向报头(缓存)
            • Cache-Control的选项
            • 其他相关的缓存报头
          • 请求报头
            • Accept
            • Accept-Charset
            • Accept-Encoding
            • Accept-Language
            • Authorization
            • Host
            • User-Agent
          • 响应报头
            • Location
            • Server
            • Content-Encoding
            • Content-Language
        • 常见配置
        • 简单案例

什么是Http

HTTP,作为一种关键的应用层协议,以其简洁高效的特性,专为支持分布式超媒体信息系统的运作而设计

自1990年代初概念初现以来,HTTP协议历经了不断的实践检验和技术革新,逐步稳固了其作为互联网通信核心基石的地位。然而,随着技术的飞速发展和网络应用的日益复杂,全球万维网生态中对于更高效、更安全的通信协议的需求也在不断增加,下面便是HTTP协议版本发展的时间线。
在这里插入图片描述
Http协议不断地升级不仅反映出业界对持续优化网络通信效率与用户体验的不懈追求,也预示着未来HTTP将在保持其核心价值的基础上,更好地适应不断变化的互联网环境与新兴应用需求。


历代Http协议

  • HTTP/0.9 (1991年):HTTP的第一个版本,它非常基础,只支持GET请求方法,并且响应为HTML格式的文本,没有请求头和响应头,每个请求处理完后,TCP连接就会关闭。

  • HTTP/1.0 (1996年):HTTP/1.0相对于HTTP/0.9有了显著的改进,引入了Connection: keep-alive,支持持久连接,使得多个请求和响应可以在同一个TCP连接中进行,也支持了管道化技术,允许浏览器同时发送多个请求。

  • HTTP/1.1 (1997年):HTTP/1.1在HTTP/1.0的基础上进一步标准化了协议。引入了更多的请求方法(如PUT、DELETE等),增加了Host头,使得同一台服务器上可以运行多个网站,也对连接管理、缓存等方面进行了优化。

  • HTTP/2 (2015年):HTTP/2是基于SPDY协议发展而来的,是HTTP协议自1999年HTTP 1.1发布后的首个重大更新。HTTP/2采用了二进制分帧层,实现了多路复用、头部压缩、服务端推送等特性,大大提高了网络性能和效率。

HTTP/3 (2022年):HTTP/3是基于QUIC协议构建的,旨在解决HTTP/2在传输层依赖TCP所带来的问题。QUIC协议提供了与TCP相似的连接语义、可靠性和拥塞控制,但具有更低的连接延迟和更高的重传效率。HTTP/3通过结合QUIC协议的特性,进一步提升了网络传输的速度和安全性。

注意,目前HTTP/1.1仍然是当前互联网通信中广泛使用的协议版本


主要特点

HTTP(超文本传输协议)是一种应用层协议,采用请求与响应模式,具有无状态特性。通常基于TCP连接实现,特别是在HTTP 1.1版本中引入了持续连接机制,有效提升了网络交互效率。大部分Web应用的开发都依赖于HTTP协议,它奠定了Web应用的基石。

HTTP 协议的主要特点可概括如下:
在这里插入图片描述

  • 客户/服务器模式:支持经典的客户端发起请求、服务器响应的服务模式。

  • 简单快捷:客户仅需发送请求方法和路径至服务器,常用方法如GET、HEAD、POST,简洁的设计使服务器程序规模小,通信高效。

  • 灵活性强:HTTP能够传输任意类型的数据,通过Content-Type标识数据类型,适应性强。

  • 无连接性:每次连接仅处理单个请求,处理完成后即断开,有助于节省传输时间。

  • 无状态性:协议对事务处理无记忆能力,需重传前序信息时可能导致数据量增大,但服务器在无需先前信息时响应迅速。


格式和URL

HTTP协议主要是通过URL(统一资源定位符)进行定位并请求网络资源,它是URI(统一资源标识符)的一种特定形式,它包含了足够的信息来定位并访问网络资源
在这里插入图片描述

这种格式为互联网上的资源提供了清晰、明确的访问路径,使得用户或应用程序能够准确地找到并获取所需的信息或服务,它是Web开发中不可或缺的一部分,也是现代网络交互的基础。

标准格式通常遵循结构:http://host[:port][path]

  • http 指的是所使用的协议类型,即超文本传输协议;
  • host 表示资源所在的主机名或IP地址;
  • port 是可选部分,用于指定主机上特定的服务端口号,默认为80;
  • path 是绝对路径,用于指示服务器上资源的具体位置。

协议内容

HTTP协议的请求结构主要由三大部分构成,它们分别是请求行消息报头请求正文
在这里插入图片描述

请求行

请求行作为HTTP请求的核心组成部分,其格式规范而严谨,主要包含了请求方法、请求的资源URI(URL)以及HTTP协议的版本信息,它指明了客户端希望服务器执行的具体操作和目标资源。

格式如下

结构清晰、易于解析的请求行格式,确保了HTTP请求的高效传输和处理。

MethodType  [空格]  Request-URI  [空格]  HTTP-Version  CRLF
  1. 方法类型(MethodType):该方法类型代表客户端希望服务器执行的操作类型,如GET、POST等。
  2. [空格]:紧接着是一个空格,用于分隔方法类型和后续的Request-URI(请求URI),它表示客户端想要访问的具体资源位置,它是服务器定位和处理请求的关键信息。
  3. [空格]:紧接着再是一个空格,分隔请求URI和HTTP协议的版本信息,版本信息确保了双方通信时使用的协议版本一致。
  4. HTTP-Version:表示请求的HTTP 协议版本。
  5. CRLF:之后以回车换行符(CRLF)结束,标志着请求行的结束和后续消息报头的开始。
请求方法

在这里插入图片描述

简单案例

POST /login HTTP/1.1 表明这是一个POST请求,目标是服务器的/login路径,使用的HTTP协议版本是1.1。

消息报头

消息报头提供了一系列有关请求和客户端的元数据,如请求的附加信息、客户端的环境设置等,有助于服务器更好地理解和处理请求。

报头域的格式

报头域的名字、冒号、空格和值所组成,消息报头域的名字是大小写无关的。

name +“:”+ [空格] + value 组成

注意,HTTP消息报头域的名字在解析时是大小写无关的,这增强了HTTP协议的灵活性和兼容性

HTTP消息报头类型

HTTP消息报头涵盖了多种类型的报头,包括普通报头、请求报头、响应报头以及实体报头,它们共同构成了HTTP消息的元数据部分。
在这里插入图片描述
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成,请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。

普通报头

在HTTP协议中,普通报头包含了一些特定的报头域,这些报头域是通用的,适用于所有的请求和响应消息,它们并不涉及实际被传输的数据实体内容,而是专注于消息的传输本身。

优化方向报头(缓存)
响应头描述示例代码
Cache-Control用于控制缓存行为。设置为no-cache时,指示浏览器每次请求页面时都必须向服务器验证缓存的内容是否仍然有效。response.setHeader("Cache-Control", "no-cache");

缓存报头域在HTTP通信中扮演着重要的角色,提供了关于消息本身的元数据,而不是关于被传输数据的具体信息。通过合理使用这些普通报头,我们可以更有效地控制和管理HTTP消息的传输过程,从而优化网络通信的性能和效率。

Cache-Control的选项
缓存指令描述
no-cache用于指示请求或响应消息不能缓存。即使存在缓存,也必须向原始服务器进行验证。
no-store绝对禁止缓存。任何缓存系统都必须丢弃该响应或请求的副本。
max-age指定响应在缓存中的最大生存时间(以秒为单位)。超过这个时间后,缓存的响应将不再被视为有效。
max-stale允许缓存的响应在过期后的一段时间内仍然被使用。这个值表示过期后的额外秒数。
min-fresh指定响应在缓存中必须保持新鲜的最小时间(以秒为单位)。这意味着,从请求时刻起,缓存的响应不能比这个时间更旧。
only-if-cached仅当缓存中存在响应时才使用缓存的响应,否则直接向原始服务器发送请求。
其他相关的缓存报头
响应头描述示例代码
Pragma在HTTP/1.0中,Pragma头用于向后兼容,实现与Cache-Control相似的功能。尽管Cache-Control是更现代的标准,但在某些旧版浏览器或代理中,可能仍需要设置Pragma// response.setHeader("Pragma", "no-cache");
Date表示消息产生的日期和时间。它有助于缓存机制确定响应的新鲜度。无需显式设置,通常由服务器自动添加。
Connection允许发送指定连接的选项。例如,设置为close时,通知服务器在响应完成后关闭连接。这有助于管理持久连接和减少资源消耗。response.setHeader("Connection", "close");
请求报头

请求报头作为客户端与服务器之间沟通的桥梁,不仅承担着传递附加请求信息的重任,还承载着展示客户端自身特征的关键使命。
在这里插入图片描述

Accept

Accept请求报头域扮演着至关重要的角色,它精确地指明了客户端愿意接收的信息类型

举例来说,当"Accept" 报头域设置为 “Accept:image/gif” 时,这即意味着客户端希望接收GIF格式的图像资源,并期望服务器返回相应类型的数据。若报头域设置为 “Accept:text/html”,则表明客户端偏好接收 HTML 格式的文本内容,通过Accept报头,客户端能够明确表达其数据需求,从而确保服务器能够精准地响应其请求,提供最为合适的信息资源。

Accept-Charset

Accept-Charset请求报头域专门用于指明客户端所支持的字符集

举例来说,当设置为 “Accept-Charset:iso-8859-1,gb2312” 时,意味着客户端能够处理这两种字符集的数据。如果在请求消息中未明确设置该报头域,那么默认情况下,客户端将接受任何字符集的数据。

Accept-Encoding

Accept-Encoding请求报头域指定客户端可接受的内容编码方式

举例来说,当该报头域设置为 " Accept-Encoding:gzip, deflate" 时,客户端表示它支持并期望接收通过 gzip 或 deflate 算法压缩的内容。若请求消息中未设置此报头域,服务器将默认客户端能够处理各种内容编码,从而确保数据的广泛兼容性和传输效率。

Accept-Language

Accept-Language请求报头域专门用于指定客户端所偏好的自然语言

例如,当设置为 Accept-Language: zh-cn"时,客户端明确表示希望接收中文(简体)的内容。若请求消息中未包含此报头域,服务器将默认客户端能够接受各种语言的内容,从而确保服务的广泛覆盖和灵活性。

Authorization

Authorization请求报头域的核心功能是验证客户端对特定资源的访问权限

当浏览器尝试访问某个页面时,如果遭遇服务器返回的401未授权响应码,它可以通过发送一个附加Authorization报头域的请求,来向服务器证明自己的访问资格,进而完成身份验证流程。这一机制确保了资源访问的安全性,有效防止了未经授权的访问行为,从而维护了网络环境的稳定与可靠。

Host

在发送HTTP请求时,Host请求报头域扮演着至关重要的角色,它负责明确指出被请求资源所在的Internet主机及相应的端口号

通常是从HTTP URL中自动提取的,确保了请求能够准确无误地定向到目标服务器和端口,进而实现资源的精准获取。通过正确设置Host报头域,我们不仅能够提升请求的处理效率,还能够有效避免潜在的访问冲突和安全风险。

http://www.xxx.com/index.html

浏览器发送的请求消息中,就会包含 Host 请求报头域,如Host:www.xxx.com,此处使用缺省端口号 80,若指定端口号,则变成Host:www.xxx.com:指定端口号。

User-Agent

当我们上网的时候,通常会看到显示我们操作系统和浏览器信息的欢迎信息。这些信息实际上是服务器通过读取User-Agent请求报头域获取的。这个报头域允许客户端告诉服务器其操作系统、浏览器等属性,例如下面所示:

GET http://www.xxx.com/form.html  HTTP/1.1 (CRLF)
... ...
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 (CRLF)
Host:www.xxx.com (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)
响应报头

响应报头使服务器能够传递额外的响应信息,这些信息无法直接放在状态行中。这些报头不仅包含关于服务器的详细信息,还提供了对请求URI所标识资源的进一步访问指导。

Location

Location响应报头域在网络通信中发挥着关键作用,其主要用途在于指导信息的接收者转向一个新的位置,在域名发生变更时,通过Location响应报头域可以有效地将用户或系统重定向至新的域名地址,确保信息的连续性和准确性。

Server

Server响应报头域承载着服务器处理请求时所依赖的软件信息,它与User-Agent请求报头域形成了互补关系。前者提供了服务器端的软件详情,而后者则揭示了发起请求的用户端环境信息,两者共同构成了网络通信中重要的信息交互环节。

Content-Encoding

Content-Encoding 实体报头域作为媒体类型的修饰符,其值用以标明附加至实体正文内容的编码方式。

在获取 Content-Type 报头域中提及的媒体类型时,需运用相应的解码机制以正确解读。Content-Encoding 的主要应用在于记录文档的压缩方法。

例如,当其值为“Content-Encoding:gzip”时,即表示文档采用了 gzip 压缩格式,提高了网络资源的利用效率。

Content-Language

Content-Language 实体报头域用于标明资源所采用的自然语言。

若该域未被设置,则默认实体内容面向所有语言的读者。这一设计有助于确保信息在不同语言背景下都能得到准确传达,从而提升了用户体验和信息的可达性。

常见配置
  • Host: example.com:说明了请求的目标主机。
  • User-Agent:提供了发起请求的客户端信息,有助于服务器进行兼容性处理或日志记录。
  • Accept:告诉服务器客户端能够处理哪些类型的响应内容。
  • Accept-EncodingAccept-Language 分别指示了客户端支持的编码格式和语言偏好。
  • Content-Type:说明了请求正文的媒体类型,这里是application/x-www-form-urlencoded,表示表单数据以URL编码的形式发送。
  • Content-Length:指明了请求正文的长度。
  • Connection: keep-alive:表示客户端希望使用持久连接。
简单案例
POST /login HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
Connection: keep-alive

注意:特此声明:本文章首发文章在掘金:https://juejin.cn/post/7356867483829583881,未经允许,请勿进行侵权私自转载。

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

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

相关文章

Unity TMP Inputfield 输入框 框选 富文本 获取真实定位

一、带富文本标签的框选是什么 UGUI的InputField提供了selectionAnchorPosition和selectionFocusPosition,开始选择时的光标下标和当前光标下标 对于未添加富文本标签时,直接通过以上两个值,判断一下框选方向(前向后/后向前&…

C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色

实现效果 调用方法 rtxtLog.AppendTextColorful(richTextBox1,DateTime.Now.ToString(), Color.Red); 完整代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sys…

【U8+】用友固定资产卡片拆分提示:未设置对象变量或With block变量。

【问题描述】 用友U8软件中, 操作固定资产模块,针对资产进行卡片拆分的时候, 提示:未设置对象变量或With block变量。 确定后仍然能打开卡片拆分界面,但是界面显示异常看不到拆分明细信息,并且保存后拆分结…

【Qt-Qt Creator使用技巧】

工具-Qt Creator ■ 使用技巧■ 定义触发片段■ Qt Creator 行编辑■ 代码注释■ 代码补全■ 快速给函数添加定义■ 创建书签■ 同步列输入■ 局部替换■ 源代码阅读■ 源码调试■ 使用技巧 ■ 定义触发片段 ■ Qt Creator 行编辑 shift + alt + up / down来获得多个游标。 …

导入芯片原厂SDK Mirror源码到gerrit

下载镜像代码 repo init --mirror --repo-url ssh://xx/repo.git -u ssh://xx/manifests.git -m manifest.xml repo sync 创建AOSP project 对All Project权限修改 创建repo 在刚才下载的codebase根目录执行如下命令: repo forall -c echo $REPO_PROJECT; ssh -p 29…

DOTS Instancing合批:如何针对单个渲染实体修改材质参数

最近在做DOTS的教程,由于DOTS(版本1.0.16)目前不支持角色的骨骼动画,我们是将角色的所有动画数据Baker到一个纹理里面,通过修改材质中的参数AnimBegin,AnimEnd来决定动画播放的起点和终点,材质参数AnimTime记录当前过去的动画时间。但是在做大…

CSS导读 (元素显示模式 下)

(大家好,今天我们将继续来学习CSS的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 3.6 元素显示模式转换 3.7 (一个小技巧)单行文字垂直居中的代码 3.8 单行文字垂直居中的原理 3.9 小案例…

leaflet知识点:地图窗格panes的应用

一,需求背景 地图中存在无人机,停机坪,航线三个图层,需要实现无人机图层显示在最上面,停机坪图层显示在最下面,航线图层显示在中间。 二,遇到问题 由下图可知航线图层所在overlayPane窗格的z-…

工控 modbusTCP 报文

Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 Rx 接收报文:00 C9 00 00 00 07 01 03 04 01 4D 00 01 Tx 发送报文:00 C9 00 00 00 06 01 03 00 00 00 02 00 C9 事务处理标识符 2字节 00 00 协议标识符 2字节 固定 00 00 00 06 长度 2字节 表示之后的字节总数 (…

大数据之ClickHouse

大数据之ClickHouse 简介 ClickHouse是一种列式数据库管理系统,专门用于高性能数据分析和数据仓库应用。它是一个开源的数据库系统,最初由俄罗斯搜索引擎公司Yandex开发,用于满足大规模数据分析和报告的需求。 特点 开源的列式存储数据库…

elementUI 下拉框加提示文案

效果如下&#xff1a; 展示文案在最下面&#xff0c;跟选项有个分割线 <el-select v-model"value" placeholder"请选择" clearable popper-class"addNotice" class"addNoticeS" visible-change"(v) >selectNotice(v,展示…

Testng测试框架(7)--测试运行

忽略测试 TestNG可以让你忽略类、特殊包、包及其子中的所有Test方法。 当在测试方法级别使用Ignore 注解&#xff0c;在功能上与Test(enabledfalse).一样。 以下例子将忽略类中所有tests。 import org.testng.annotations.Ignore; import org.testng.annotations.Test; Ign…

秦朗丢寒假作业系摆拍 博主被处罚

大家好&#xff01; 我是老洪&#xff0c;刚看到秦朗丢寒假作业系摆拍博主被处罚。 据央视财经媒体报道&#xff0c;近期&#xff0c;“秦朗丢寒假作业”事件被证实为自导自编的摆拍视频。 图片来源央视财经公众号截图 该博主与同事薛某&#xff0c;为了吸引更多的粉丝和流量&a…

基于SSM的旅游管理系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对旅游信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&am…

解决cmd输入py文件路径不能执行,使用anaconda prompt 能执行

究其原因&#xff0c;是因为没有配置环境&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 第一步&#xff1a;配置环境变量 操作步骤如下&#xff1a; 1、右击此电脑 ---->属性 2、高级系统设置 3、点击环境变量 4、选择 …

代码随想录--数组--长度最小的子数组

题目 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3] 输出&#…

[BT]BUUCTF刷题第16天(4.12)

第16天 Web [MRCTF2020]Ezpop 打开网站就是一段泄露的源代码&#xff1a; <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack…

文件名乱码危机:数据恢复全攻略

在数字化时代的浪潮中&#xff0c;电脑文件成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;有时我们会突然遭遇一个令人头疼的问题&#xff1a;原本清晰易读的文件名突然变成了乱码。这些乱码文件名不仅让我们无法准确识别文件内容&#xff0c;更可能意味着数据丢…

时间序列分析 # 平稳性检验和ARMA模型的识别与定阶 #R语言

掌握单位根检验的原理并能解读结果&#xff1b;掌握利用序列的自相关图和偏自相关图识别模型并进行初步定阶。 原始数据在文末&#xff01;&#xff01;&#xff01; 练习1、根据某1971年9月-1993年6月澳大利亚季度常住人口变动&#xff08;单位&#xff1a;千人&#xff09;的…

一个开源跨平台嵌入式USB设备协议:TinyUSB

概述 TinyUSB 是一个用于嵌入式系统的开源跨平台 USB 主机/设备堆栈&#xff0c;设计为内存安全&#xff0c;无需动态分配&#xff0c;线程安全&#xff0c;所有中断事件都被推迟&#xff0c;然后在非 ISR 任务函数中处理。查看在线文档以获取更多详细信息。 源码链接&#xff…