HTTP协议基础

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章

感谢泷羽sec 团队的教学
视频地址:黑客网络基础之超文本协议与内外网划分_哔哩哔哩_bilibili

一、HTTP协议

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式、超媒体信息系统的网络协议。它定义了客户端(如浏览器)与服务器之间请求和响应的格式和传输方式。

1. HTTP协议的工作原理

HTTP协议工作在客户端-服务器模型上。客户端(通常是用户的浏览器)向服务器发送一个HTTP请求,服务器处理这个请求,并将HTTP响应返回给客户端。

2. 请求和响应的结构

请求(Request)

  • 请求行:包含方法(如GET、POST)、请求的资源路径(URI)和HTTP版本。
  • 请求头部:包含请求的附加信息,如Host(请求的服务器地址)、User-Agent(发出请求的浏览器和版本)、Accept(客户端能够处理的媒体类型)等。
  • 空行:请求头部和请求体之间的分隔符。
  • 请求体:某些请求(如POST)会包含请求体,用于发送数据给服务器。

响应(Response)

  • 状态行:包含HTTP版本、状态码和状态消息。
  • 响应头部:包含响应的附加信息,如Content-Type(响应体的媒体类型)、Content-Length(响应体的长度)等。
  • 空行:响应头部和响应体之间的分隔符。
  • 响应体:服务器返回给客户端的数据,如HTML文档、图片、视频等。

3. HTTP方法详解

当然,以下是HTTP请求方法的详细解释:

(1)GET

  • 用途:请求指定的页面信息,并返回实体主体。
  • 特点
    • 幂等性:多次执行相同的GET请求,服务器状态不会改变。
    • 安全性:GET请求不会导致服务器上的数据状态改变。
    • 可缓存:GET请求的结果可以被缓存。
    • 无请求体:GET请求通常不包含请求体。
    • URL参数:可以通过URL传递参数。

(2)POST

  • 用途:向服务器提交数据进行处理请求,例如提交表单或上传文件。
  • 特点
    • 不幂等:多次执行相同的POST请求可能会产生不同的结果,例如多次提交表单可能会导致多次创建相同的数据。
    • 不安全性:POST请求可能会导致服务器状态的改变。
    • 非缓存性:POST请求的结果通常不会被缓存。
    • 包含请求体:POST请求包含请求体,用于发送数据给服务器。
    • 数据量大:POST可以发送大量的数据,而GET请求的数据量受限于URL长度。

(3)PUT

  • 用途:请求服务器存储一个资源,通常用于新建资源或更新现有资源。
  • 特点
    • 幂等性:多次执行相同的PUT请求,服务器状态不会改变。
    • 不安全性:PUT请求可能会导致服务器状态的改变。
    • 非缓存性:PUT请求的结果通常不会被缓存。
    • 包含请求体:PUT请求包含请求体,用于发送要存储的数据。
    • 全量更新:PUT通常用于全量更新资源,如果资源不存在则创建。

(4)DELETE

  • 用途:请求服务器删除指定的资源。
  • 特点
    • 幂等性:多次执行相同的DELETE请求,服务器状态不会改变。
    • 不安全性:DELETE请求可能会导致服务器状态的改变。
    • 非缓存性:DELETE请求的结果通常不会被缓存。
    • 可能包含请求体:DELETE请求可以包含请求体,但通常不这么做。

(5) HEAD

  • 用途:请求获取与GET请求相同的响应,但没有响应体,用于检查资源是否存在或获取资源的元数据。
  • 特点
    • 幂等性:HEAD请求不会改变服务器状态。
    • 安全性:HEAD请求不会导致服务器上的数据状态改变。
    • 无响应体:HEAD请求的响应不包含响应体。
    • 可缓存:HEAD请求的结果可以被缓存。

(6)OPTIONS

  • 用途:请求服务器告知客户端关于请求URI的哪些HTTP请求方法可被接受。
  • 特点
    • 幂等性:OPTIONS请求不会改变服务器状态。
    • 安全性:OPTIONS请求不会导致服务器上的数据状态改变。
    • 允许跨域请求:OPTIONS请求常用于跨域资源共享(CORS)预检。
    • 包含Allow头部:服务器在响应中包含Allow头部,指示支持的方法。

(7)PATCH

  • 用途:对资源进行部分修改,与PUT不同,PATCH可以对资源进行部分更新。
  • 特点
    • 不幂等:多次执行相同的PATCH请求可能会产生不同的结果。
    • 不安全性:PATCH请求可能会导致服务器状态的改变。
    • 非缓存性:PATCH请求的结果通常不会被缓存。
    • 包含请求体:PATCH请求包含请求体,用于发送要更新的数据。

(8) CONNECT

  • 用途:用于将请求连接转换为透明的TCP/IP隧道,通常用于SSL加密服务器的连接(使用SSL和TLS)。
  • 特点
    • 不安全性:CONNECT请求可能会导致服务器状态的改变。
    • 不幂等:多次执行相同的CONNECT请求可能会产生不同的结果。

(9)TRACE

  • 用途:请求服务器回显其收到的请求,用于诊断问题,如请求是否被代理服务器修改。
  • 特点
    • 不安全性:TRACE请求可能会导致服务器状态的改变。
    • 不幂等:多次执行相同的TRACE请求可能会产生不同的结果。

4. 状态码详解

HTTP状态码是服务器对客户端HTTP请求的响应。它们分为五类,每类都有特定的含义和用途。以下是每个类别中一些常见状态码的详细解释:

1xx:信息性状态码

这些状态码表示临时的响应,用于通知客户端请求已被接收,正在处理中。

  • 100 Continue:表明客户端可以继续发送请求体(在这个状态码之前,客户端应该暂停发送请求体)。
  • 101 Switching Protocols:服务器根据客户端的请求,已经切换到了新的协议。

2xx:成功状态码

这些状态码表示客户端的请求被成功处理

  • 200 OK:最常见的成功状态码,表示请求已成功,响应体包含请求的结果。
  • 201 Created:请求成功,并且服务器创建了新的资源。通常用于POST请求,响应中通常包含新创建资源的URL。
  • 202 Accepted:服务器已接收请求,但尚未处理。
  • 204 No Content:服务器成功处理了请求,但没有返回任何内容。

3xx:重定向状态码

这些状态码表示客户端需要采取进一步的行动来完成请求

  • 301 Moved Permanently:请求的资源已被永久移动到新位置,响应中应包含新的URL。
  • 302 Found临时重定向,资源临时被移动到新的URL。
  • 303 See Other建议客户端使用GET方法获取资源,通常在POST/PUT请求后使用
  • 304 Not Modified:资源未修改,客户端可以使用缓存的版本。
  • 307 Temporary Redirect:与302类似,但请求方法不会从POST变成GET。

4xx:客户端错误状态码

这些状态码表示客户端似乎有错误,阻止了服务器的处理

  • 400 Bad Request:服务器无法理解请求,可能是请求格式错误
  • 401 Unauthorized:请求需要用户的身份认证,通常需要用户名和密码。
  • 403 Forbidden:服务器理解请求,但是拒绝执行,可能是因为没有权限
  • 404 Not Found:请求的资源在服务器上找不到。
  • 405 Method Not Allowed:请求方法(如GET、POST等)对于请求的资源不允许。请求方式不允许)
  • 408 Request Timeout请求超时,客户端没有在服务器预期的时间内完成请求。

5xx:服务器错误状态码

这些状态码表示服务器在处理请求的过程中发生了错误

  • 500 Internal Server Error:服务器遇到了一个未曾预料的状况,导致无法完成对请求的处理。
  • 501 Not Implemented:服务器不支持请求的功能,无法完成请求。
  • 502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效响应。
  • 503 Service Unavailable:服务器当前无法处理请求,可能是由于超载或停机维护。
  • 504 Gateway Timeout:网关或代理服务器在等待上游服务器响应时超时。

了解这些状态码有助于开发者更好地理解HTTP通信过程中可能出现的问题,并据此进行调试和错误处理。

5. HTTP头部

HTTP头部字段用于传递额外的信息,包括:

  • 通用头部:如Cache-ControlConnectionDate等。
  • 请求头部:如AcceptAuthorizationCookie等。
  • 响应头部:如ETagServerSet-Cookie等。
  • 实体头部:如AllowContent-EncodingContent-Length等。

6. 持久连接和管道化

  • 持久连接:HTTP/1.1默认开启持久连接(Connection: keep-alive),允许在一个TCP连接上发送多个HTTP请求和响应,减少了TCP连接的开销。
  • 管道化:HTTP/1.1支持管道化技术,允许客户端在等待第一个请求的响应时,继续发送新的请求。这可以减少网络延迟。

7.例子

https://baidu.com/web/579.html?replytocom=22#respond

协议://域名:端口/虚拟目录/文件名?参数#锚点

解释:

在网页的URL中,#号后面的部分被称为“锚点”或“片段标识符”。它用于指示浏览器在加载页面后跳转到页面的特定部分。

二、HTTP历史版本

HTTP协议自诞生以来,经历了多个版本的演变,每个版本都在性能、安全性和功能上有所改进。以下是HTTP历史版本的详解:

(1)HTTP/0.9(1991年)

  • 单行协议:最初版本的HTTP协议,没有正式的版本号,后来被称为HTTP/0.9。它非常简单,请求由单行指令构成,以GET方法开头,后跟目标资源的路径。
  • 只支持GET方法:请求由单行指令构成,以唯一可用方法GET开头,其后跟目标资源的路径。
  • 无请求头和状态码:HTTP/0.9没有定义请求头和状态码,也没有明确的版本号,只是后来为了与其他版本区分才被定义成0.9。
  • 纯文本内容:这个版本只支持纯文本内容的传输,并且支持用HTML语言格式化,但无法插入图片或其他类型的内容。
  • 不支持持久连接:每个请求都需要经历TCP三次握手建立连接,请求处理完成后,连接就会释放,即不支持持久连接。

(2)HTTP/1.0(1996年)

  • 更加完整:HTTP/1.0是第一个正式的HTTP协议版本,它包含了我们现在所熟知的很多概念:请求方法、请求头、状态码等。
  • 请求方法:除了GET命令,还引入了POST命令和HEAD命令,丰富了浏览器与服务器的互动手段。
  • 请求/响应结构:每次通信都必须包括头信息(HTTP header),用来描述一些元数据。
  • 其他功能:包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

(3)HTTP/1.1(1997年)

  • 持久连接:默认启用持久连接(Keep-Alive),允许多个请求使用同一个TCP连接,减少了连接建立和关闭的开销。
  • 管道化:支持请求管道化(Pipelining),即在收到响应前可以发送多个请求,但由于实现复杂和问题多,实际使用较少。
  • 分块传输编码:引入分块传输编码(Chunked Transfer Encoding),使得服务器可以分块发送响应,提高了传输效率。
  • 增强缓存控制:新增了许多缓存控制头部,如Cache-Control,增强了缓存机制。
  • 虚拟主机支持:引入Host头部,允许在同一IP地址上托管多个域名(虚拟主机)。

(4)HTTP/2(2015年)

  • 二进制协议:HTTP/2采用二进制协议替代原本的文本,不再可读。
  • 多路复用:并行的请求可以在同一TCP链接中处理,移除了HTTP/1.x中顺序和阻塞的约束。
  • 头部压缩:使用压缩算法压缩请求头header,减少数据传输量。
  • 服务器推送:允许服务器主动向客户端推送数据,无需客户端明确请求。

(5)HTTP/3

HTTP/3作为HTTP协议的最新主要版本,引入了多项新特性,主要基于QUIC(Quick UDP Internet Connections)协议来实现。QUIC(Quick UDP Internet Connections)是一种由Google开发的基于UDP的传输层协议,旨在解决TCP协议在现代网络应用中的一些限制。QUIC的设计目标是提高网络通信的速度和效率,特别是在高延迟和不稳定的网络环境下

以下是HTTP/3的一些关键新特性:

  • 基于QUIC协议:HTTP/3使用基于UDP的QUIC协议,替代了传统的TCP协议,以减少延迟和提高性能。

  • 快速连接建立:通过0-RTT(零往返时间)握手,HTTP/3能够实现更快的连接建立,减少了等待时间。

  • 多路复用:继承自HTTP/2,HTTP/3支持在同一连接上并行传输多个请求和响应,有效避免了队头阻塞问题。

  • 连接迁移:即使在网络环境变化时,如Wi-Fi和移动数据之间的切换,HTTP/3也能保持连接的连续性。

  • 内置加密:QUIC集成了TLS 1.3,为所有传输的数据提供端到端加密,增强了安全性。

  • 拥塞控制和流量控制:HTTP/3实现了更先进的拥塞控制和流量控制机制,以适应网络条件的变化。

  • 解决队头阻塞:通过多个独立的逻辑数据流,HTTP/3解决了TCP中队头阻塞的问题。

  • 移动网络优化:HTTP/3特别适用于移动网络,能够更好地处理高延迟和不稳定的连接。

  • 向后兼容性:HTTP/3保持了与HTTP/2相同的应用层语义,使得过渡更加平滑。

  • 适用于现代应用:HTTP/3特别适合对延迟和吞吐量要求高的应用,如实时通信、在线游戏和视频流。

 

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

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

相关文章

LLMs 如何处理相互矛盾的指令?指令遵循优先级实验

编者按:想象一下,你正在开发一个 AI 助手,突然发现 system message 和用户提示词存在冲突,这时 AI 会听谁的?这种情况不仅困扰着开发者,还可能导致 AI 系统的不稳定和不可预测,影响用户体验和系…

qt QProcess详解

1、概述 QProcess是Qt框架提供的一个类,它用于在应用程序中执行外部进程。QProcess提供了一系列函数来启动、控制和与外部进程进行交互,使得开发者能够在自己的应用程序中集成和调用其他程序或服务。这个类在需要执行系统命令、启动其他应用程序或进行文…

Appium配置2024.11.12

百度得知:谷歌从安卓9之后不再提供真机layout inspector查看,仅用于支持ide编写的app调试用 所以最新版android studio的android sdk目录下已经没有了布局查看工具... windows x64操作系统 小米k30 pro手机 安卓手机 Android 12 第一步&#xff1a…

《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明

参考 《element plus 使用 icon 图标(两种方式)》使用 icon 升级 Vue2 升级 Vue3 项目时,遇到命名时的实心与空心点差异! ElementUI: 实心是 el-icon-more空心是 el-icon-more-outline ElementPlus: 实心是 el-icon-more-fill…

WebSocket和HTTP协议的性能比较与选择

WebSocket和HTTP协议的性能比较与选择 引言: 在web应用开发中,无论是实时聊天应用、多人在线游戏还是实时数据传输,网络连接的稳定性和传输效率都是关键要素之一。目前,WebSocket和HTTP是两种常用的网络传输协议,它们…

【数据结构与算法】第11课—数据结构之选择排序和交换排序

文章目录 1. 选择排序1.1 直接选择排序1.2 堆排序 2. 交换排序2.1 冒泡排序2.2 快速排序(找基准值法1----Hoare版本)2.2.1 特殊场景12.2.2 特殊场景22.2.3 代码2.2.4 快速排序的时间复杂度 2.3 快速排序(找基准值法2---挖坑法)2.3.1 特殊情况1处理2.3.2 特殊情况2处理 2.4 快速…

MySQL技巧之跨服务器数据查询:进阶篇-从A数据库复制到B数据库的表中

MySQL技巧之跨服务器数据查询:进阶篇-从A数据库复制到B数据库的表中 基础篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQ…

UVC 输出视频格式修改和windows下数据分析

文章目录 前言一、UVC MJPEG视频帧描述符1.MJPG视频帧格式示例 二、UVC YUV2、NV12、M420、I420无压缩视频帧描述符GUID1.如YUV2数据参数初始为: 三、UVC Windows下UVC摄像头数据分析总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要&#…

大数据开发面试宝典

312个问题,问题涵盖广、从自我介绍到大厂实战、19大主题,一网打尽、真正提高面试成功率 一、Linux 1. 说⼀下linux的常⽤命令? 说一些高级命令即可 systemctl 设置系统参数 如:systemctl stop firewalld关闭防火墙 tail / hea…

更改Ubuntu22.04锁屏壁纸

更改Ubuntu22.04锁屏壁纸 sudo apt install gnome-shell-extensions gnome-shell-extension-manager安装Gnome Shell 扩展管理器后,打开“扩展管理器”并使用搜索栏找到“锁屏背景”扩展

GxtWaitCursor:Qt下基于RAII的鼠标等待光标类

有时我们需要以阻塞的方式执行一点耗时的操作&#xff0c;这时需要主窗口光标呈现忙状态&#xff0c;GxtWaitCursor正是为此设计&#xff1b;重载的构造函数&#xff0c;可以让光标呈现忙状态一定时间后自动恢复。 GxtWaitCursor.h #pragma once#include <QObject>// // …

Unity3D实现视频和模型融合效果

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示如下👉二、VideoPlayer播放视频(一)👉2-1、Hieraechy面板右键创建videoPlayer👉2-2、Assets面板右键创建RenderTexture👉2-3、把设置好的RenderTexture拖到videoPlayer里面还有本地视频视频�…

探索Pillow库:Python图像处理的瑞士军刀

文章目录 **探索Pillow库&#xff1a;Python图像处理的瑞士军刀**1. 背景&#xff1a;为何选择Pillow&#xff1f;2. Pillow是什么&#xff1f;3. 如何安装Pillow&#xff1f;4. 五个简单的库函数使用方法4.1 打开图像4.2 显示图像4.3 转换图像格式4.4 调整图像大小4.5 旋转图像…

HelloMeme 上手即用教程

HelloMeme是一个集成空间编织注意力的扩散模型&#xff0c;用于生成高保真图像和视频。它提供了一个代码库&#xff0c;包含实验代码和预训练模型&#xff0c;支持PyTorch和FFmpeg。用户可以通过简单的命令行操作来生成图像和视频。 本文将详细介绍&#xff0c;如何在GPU算力租…

JVM详解:JVM的系统架构

计算机语言大致可以分为两类&#xff0c;一直是编译性语言&#xff0c;典型的如C&#xff0c;他会先有编译器编译成可执行文件&#xff08;操作系统可读&#xff0c;不同的操作系统需要编译成不同的可执行文件&#xff09;&#xff0c;而另一种则是翻译性语言&#xff0c;这种语…

21. Drag-Drop拖放操作(二) - 文件、表格和树的拖放实现

本了继上节内容&#xff0c;讲述几种常用的拖放场景示例&#xff0c;包括文件、表格和树的拖放实现。 文件拖放 实现从系统目录拖放文件到App中。 自定义接收视图 自定义应用内部接收拖放的view视图类FileDragView&#xff0c;注册拖放类型&#xff0c;实现目标拖放协议NS…

力扣515:在每个树行中找最大值

给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,104]-231 < Node.val &l…

vivo 游戏中心包体积优化方案与实践

作者&#xff1a;来自 vivo 互联网大前端团队- Ke Jie 介绍 App 包体积优化的必要性&#xff0c;游戏中心 App 在实际优化过程中的有效措施&#xff0c;包括一些优化建议以及优化思路。 一、包体积优化的必要性 安装包大小与下载转化率的关系大致是成反比的&#xff0c;即安装…

数据库SQL——连接表达式(JOIN)图解

目录 一、基本概念 二、常见类型 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; 左连接&#xff08;LEFT JOIN 或 LEFT OUTER JOIN&#xff09;&#xff1a; 右连接&#xff08;RIGHT JOIN 或 RIGHT OUTER JOIN&#xff09;&#xff1a; 全连接&#xff08;FULL…

Sigrity SPEED2000 Power Ground Noise Simulation模式如何查看PDS系统的自阻抗操作指导

Sigrity SPEED2000 Power Ground Noise Simulation模式如何查看PDS系统的自阻抗操作指导 Sigrity Power SI Power Ground Noise Simulation模式可以用于PDS系统自阻抗分析,以下图为例 2D视图