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.xdnf.cn/news/11948.html

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

相关文章

【Pikachu】任意文件上传实战

将过去和羁绊全部丢弃,不要吝惜那为了梦想流下的泪水。 1.不安全的文件上传漏洞概述 不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的…

C++【STL容器系列(二)】vector的模拟实现

文章目录 1. vector的结构2. vector的默认成员函数2.1构造函数2.1.1 默认构造2.1.2 迭代器构造2.1.3 用n个val初始化构造 2.2 拷贝构造2.3 析构函数2.4 operator 3. vector iterator函数3.1 begin 和 cbegin函数3.2 end() 和 cend()函数 4. vector的小函数4.1 size函数4.2 capa…

边缘检测的100种方法

文章目录 什么是边缘检测 ?一、边缘检测算子:Sobel算子、Scharr算子、Laplacian算子、Canny算子二、梯度计算 顶帽 黑帽 拉普拉斯金字塔三、相位一致性(Phase Congruency,PC)3.1、底层代码(2D)3.2、ski…

【Linux探索学习】第十二弹——初识进程:进程的定义、描述和一些简单的相关操作

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在前面经过那么多篇的铺垫后,今天我们正式进入Linux学习的第一个重难点——进程,理解进程对于我们学习操作系统的其…

Java项目实战II基于微信小程序的订餐系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 随着移动互联网技术的飞速发展&#xff0…

触想染织厂MES产线终端工位机,打造数字化高效车间

一、行业发展背景 在纺织细分领域中,印染行业一直是整个产业链的效率短板,因其涉及染色、定型及后整理加工等多个复杂工艺、上百个参数变量,质量波动较大,依赖个人经验和手工操作,常常陷入高成本、低效率发展困境。 △…

CSS查缺补漏 two

11.6~11.11查缺补漏 一、熟记1.结构伪类选择器2.伪元素选择器3.盒子模型4.居中对齐(重中之重!!!)5.清除默认样式6.元素溢出(滚动条)7.行内元素 – 内外边距问题8.圆角9 .盒子阴影(拓…

Taro React-Native IOS 打包发布

http网络请求不到 配置 fix react-native facebook::flipper::SocketCertificateProvider‘ (aka ‘int‘) is not a function or func_rn运行debug提示flipper-CSDN博客 Xcode 15(iOS17)编译适配报错_no template named function in namespace std-CS…

本地搭建你的私有网盘:在Ubuntu上使用Portainer CE安装NextCloud

文章目录 前言1. 在PortainerCE中创建NextCloud容器2. 公网远程访问本地NextCloud容器2.1 内网穿透工具安装3.2 创建远程连接公网地址 3. 固定NextCloud私有云盘公网地址 前言 本篇文章介绍如何在本地使用Portainer CE可视化图形界面创建NextCloud私有网盘容器,并结…

超好用shell脚本NuShell mac安装

利用管道控制任意系统 Nu 可以在 Linux、macOS 和 Windows 上运行。一次学习,处处可用。 一切皆数据 Nu 管道使用结构化数据,你可以用同样的方式安全地选择,过滤和排序。停止解析字符串,开始解决问题。 强大的插件系统 具备强…

游戏引擎中LOD渲染技术

一.LOD(Level Of Detail) 为了降低GPU渲染压力,根据摄像机距离模型距离将面数较高的模型替换为面数较低的模型. LOD LOD0(distance<10) LOD1(distance<20) LOD2(distance<30) 故通常引擎中MetaMesh是由一个或多个LOD模型构成. MetaMesh mesh mesh.lod1 mesh.lod…

web前端动画按钮(附源代码)

效果图 源代码 HTML部分 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> …

昇思大模型平台打卡体验活动:项目5基于MindSpore实现Transformer机器翻译

首先仍然是先登录大模型体验平台 https://xihe.mindspore.cn/my/clouddev 启动&#xff01;&#xff01; 进入环境之后&#xff0c;即可开始运行notebook&#xff0c; Transformer 模型与实现 Transformer 是一种由 Vaswani 等人在 2017 年提出的神经网络结构&#xff08;论文…

‌关于人工智能(AI)的发展现状和未来趋势的详细分析!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日将继续分享关于‌人工智能&#xff08;AI&#x…

提高排名的有效策略与实践指南

内容概要 在现代数字化时代&#xff0c;提高排名不仅是企业营销的关键&#xff0c;更是提升品牌知名度和客户粘性的有效途径。为了更好地理解这一主题&#xff0c;我们从多个方面进行详细分析。首先&#xff0c;明确"排名"的基本概念是非常重要的&#xff0c;它通常…

【Linux】动静态库

目录 1、制作静态库 2、站在使用者角度使用库 3、制作动态库 4、动态库是怎么被加载的 1、制作静态库 之前对动静态库的认识&#xff1a; libXXX.a-----静态库 静态链接&#xff1a;将库当中的代码拷贝到最终的可执行程序里&#xff0c;也就是&#xff0c;自己的源代码会变成…

AI绘画到底怎么画,才能出好图!一文详解

前言 在当今数字化的时代&#xff0c;AI 绘画以其强大的创造力和便捷性&#xff0c;成为了众多艺术爱好者和创作者的新宠。无论是专业画家想要拓展创作思路&#xff0c;还是业余爱好者渴望展现自己的创意&#xff0c;AI 绘画都提供了无限的可能。那么&#xff0c;究竟如何才能…

【React】深入理解 JSX语法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解 JSX语法1. JSX 简介2. JSX 的基本语法2.1 基本结构2.2 与普通 JavaScr…

Kafka-Eagle 监控 搭建

Kafka-Eagle 框架可以监控 Kafka 集群的整体运行情况&#xff0c;在生产环境中经常使用。 在生产过程中&#xff0c;想创建topic、查看所有topic、想查看某个topic 想查看分区等&#xff0c;都需要写命令&#xff0c;能不能有一个图形化的界面&#xff0c;让我们操作呢&#x…

5位机械工程师如何共享一台工作站的算力?

在现代化的工程领域中&#xff0c;算力已成为推动创新与技术进步的关键因素之一。对于机械工程师而言&#xff0c;强大的计算资源意味着能够更快地进行复杂设计、模拟分析以及优化工作&#xff0c;从而明显提升工作效率与项目质量。然而&#xff0c;资源总是有限的&#xff0c;…