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特别适合对延迟和吞吐量要求高的应用,如实时通信、在线游戏和视频流。

 

上一篇:golang分布式缓存项目 Day2


下一篇:天地图关键字搜索列表纯js版本