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-Control
、Connection
、Date
等。 - 请求头部:如
Accept
、Authorization
、Cookie
等。 - 响应头部:如
ETag
、Server
、Set-Cookie
等。 - 实体头部:如
Allow
、Content-Encoding
、Content-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特别适合对延迟和吞吐量要求高的应用,如实时通信、在线游戏和视频流。