
超文本传输协议
HTTP协议简介
HTTP(HyperText Transfer Protocol,超文本传输协议)定义了客户端(如浏览器)和服务器之间如何请求和传输资源的规则,主要用于从服务器(万维网)将超文本(如HTML文件、图片、视频等)传输到本地浏览器。默认的端口为80/443。
HTTP/0.9(1991年)
- 特点
- 仅支持GET请求,没有其他请求
- 无HTTP头部只有
GET /www.baidu.com
- 仅支持HTML传输,无法传输图片、视频或其他文件类型。
- 无状态性:每个请求是独立的,没有会话保持功能。
- 单向通信:客户端发出请求后,服务器返回HTML内容,传输完成后立即断开连接。
- 工作流程
- 客户端发送请求→服务器返回响应→断开连接
- 使用场景
- 简单的网页浏览,通常是一些静态文本页面
HTTP/1.0(1996年)
- 特点
- 支持多种请求方法:在
GET
方法基础上,新增了POST
(提交数据)和HEAD
(仅请求响应头部信息) - 引入HTTP头部(Headers):可以传递关于数据类型、长度、编码等
- 支持多种内容类型:可以传输非HTML内容,如图片、音频、视频等。
- 引入状态码:响应中增加了状态码,用于标识请求的处理结果。
- 支持缓存控制:增加了与缓存相关的头部(如
Expires
、Last-Modified
),以减少重复请求和提高效率。
- 支持多种请求方法:在
- 流程
- 建立连接→发送请求→服务器处理请求并响应→关闭连接。
- 使用场景
- 适用于一些简单的网页浏览和交互场景,但对于包含大量资源的网页,加载速度较慢。
HTTP/1.1 (1997年)
- 特点
- 持久连接:默认启用了持久连接(Keep-Alive),在同一个TCP连接中可以传输多个请求和响应,减少了连接建立和关闭的开销,提高效率。
- 管道化传输:支持HTTP管道化(Pipelining),允许客户端在收到响应前发送多个请求,但是响应顺序必须与请求顺序一致
- 丰富的缓存机制:增强了缓存控制功能,引入
Cache-Control
头部,支持更灵活的缓存策略。 - 分块传输编码:使用分块传输编码(Chunked Transfer Encoding)允许服务器在生成内容时逐步发送数据,适用于动态生成内容的场景。
- 更多的请求方法:增加了
PUT
(更新资源)、DELETE
(删除资源)、OPTIONS
(查看支持的请求方法)等方法,支持更多操作类型。 - 虚拟主机支持:- 引入
Host
头部,使同一台服务器可以托管多个域名(虚拟主机)。 - 安全性增强:更容易与HTTPS配合使用,促进了加密通信的发展。
- 流程
- 建立连接 → 发送请求 → 服务器处理请求并响应 → 可复用连接(支持多次请求)。
- 使用场景
- 支持复杂的动态网页和多媒体内容,适用于需要加载大量资源的现代网页和API通信场景。
HTTP/2 (2015年)
- 特点
- 二进制分帧: 采用二进制格式传输数据,而不是HTTP/1.x的纯文本格式,解析效率更高。
- 多路复用:同一TCP连接中可同时处理多个请求和响应,避免队头阻塞问题。
- 头部压缩:使用HPACK算法压缩HTTP头部信息,减少重复头部传输的带宽占用。
- 服务器推送:允许服务器主动向客户端推送资源(如CSS、JS),减少等待时间。
- 优先级与流量控制:支持为不同请求分配优先级,优化传输顺序。
- 增强安全性:主流浏览器仅支持加密的HTTP/2通信(通过HTTPS)。
- 流程
- 建立连接(通常通过TLS协商升级)→ 二进制数据分帧传输 → 多路复用并发处理 → 响应客户端请求。
- 使用场景
- 适用于资源密集型网页加载(如加载大量图片、CSS、JS)、高效的API通信(如RESTful API或GraphQL)、实时应用(如在线聊天、游戏)。
HTTP/3 (2022年)
- 特点
- 基于QUIC协议:HTTP/3基于QUIC(Quick UDP Internet Connections)协议,而非TCP。QUIC是Google开发的传输层协议,旨在减少延迟并提高网络性能。
- 使用UDP代替TCP:QUIC使用UDP协议来替代传统的TCP,能够更好地处理网络丢包,减少连接延迟。
- 零延迟连接建立:QUIC协议实现了“零延迟连接建立”,即在第一次连接时通过加密握手同时进行连接和身份验证,避免了TCP的三次握手过程。
- 多路复用:类似于HTTP/2,HTTP/3也支持多路复用,但QUIC在不同流之间的丢包处理更为高效,避免了队头阻塞。
- 内建加密:QUIC协议内建加密,所有的HTTP/3连接都必须使用TLS加密,确保数据传输的安全性。
- 连接迁移:QUIC支持连接迁移,使得在客户端更换IP地址(如从Wi-Fi切换到移动数据)时,连接可以继续保持,减少了中断的可能性。
- 流程
- 客户端与服务器通过QUIC协议建立加密连接(零延迟握手)→ 多路复用请求和响应通过UDP传输 → 响应客户端请求。
- 使用场景
- 对延迟敏感的应用,如在线游戏、实时视频通信等,以及在网络环境不稳定的情况下,能够提供更好的性能和可靠性。
请求方式
GET
- 用途:
- 用于从服务器请求资源(如网页、图片、API数据等)。
- 主要用于检索资源而不更改资源的状态。
- 特点:
- 请求的数据通常缓存并附加在URL中(如查询字符串)。
- 无副作用:不会修改服务器上的任何数据,仅用于获取信息。
- 幂等性:多次请求相同资源会返回相同的结果。
- 通常用于获取网页、API数据等。
扩展
- 请求的内容通常就在URL上
- 查看请求包他传递的参数(类似q=?)都在第一行,这一行通常是告诉服务器我使用的协议和参数,他的值进行过了URL编码,通过解码就可以得出请求的资源内容
GET /x/search/?q=%E8%A7%89%E9%86%92%E5%B9%B4%E4%BB%A3&queryFrom=0 HTTP/2 |
POST
- 用途:
- 用于向服务器提交数据,通常用于表单提交、数据创建、文件上传等操作。
- 可以创建新的资源或对现有资源进行更新。
- 特点:
- 请求数据包含在请求体中,而非URL中。因此可以传输大量数据,一般不会被缓存
- 有副作用:可能会修改服务器上的资源(例如提交表单、注册新用户)。
- 非幂等性:多次请求相同数据可能导致不同的结果(如重复创建数据)。
- 常用于数据提交、文件上传等场景。
扩展
- 查看请求包,看第一行告诉服务器的请求方法为POST我为他传递了一个参数a=baidu,一般情况下在请求包最后空一行就是传递的内容
POST / HTTP/1.1 |
DELETE
- 用途:
- 用于请求删除指定的资源。
- 特点:
- 通常不带请求体,直接指定要删除的资源。
- 幂等性:多次请求删除相同资源,结果是一样的(资源已经被删除)。
- 常用于删除用户、文章或其他资源。
HEAD
- 用途:
- 与
GET
类似,但只请求资源的头部信息,不返回资源的具体内容。 - 通常用于检查资源的状态或获取元数据(如文件大小、修改时间等)。
- 与
- 特点:
- 返回响应头信息,且没有响应体。
- 用于获取资源的元数据,检查是否更新或是否存在。
- 无副作用:不会改变服务器资源。
OPTIONS
- 用途:
- 用于查询服务器支持的HTTP方法,通常用于跨域请求时的预检(CORS)或探测服务器支持的功能。
- 特点:
- 返回允许的请求方法列表,帮助客户端决定是否可以继续发起请求。
- 不会修改资源状态,通常不带请求体。
- 常用于跨域请求的预检阶段。
PATCH
- 用途:
- 用于部分更新资源,仅提交需要更新的部分,而不是整个资源。
- 适用于修改资源的一小部分数据。
- 特点:
- 请求体中包含部分更新的数据,而非完整的数据。
- 非幂等性:多次请求可能导致不同的结果,具体取决于更新内容。
- 适用于对资源做部分修改(例如修改用户信息中的一个字段)。
CONNECT
- 用途:
- 用于建立到服务器的隧道连接,通常用于HTTPS请求。
- 使得客户端和服务器之间可以进行加密通信。
- 特点:
- 通过
CONNECT
方法,客户端与服务器建立TCP连接后,通过该连接进行SSL/TLS加密通信。 - 常用于代理服务器场景,建立安全的通信隧道。
- 不用于直接请求资源,主要用于设置安全的网络连接。
- 通过
TRACE
- 用途
TRACE
方法用于诊断目的,主要用来回显客户端发送的HTTP请求内容,帮助开发者或管理员调试客户端和服务器之间的通信问题。- 它可以验证请求在到达服务器之前是否被中间代理或网关修改。
- 特点
- 服务器将客户端发送的原始请求直接返回到客户端,响应体中包含发送的请求内容。
- 用于测试网络中请求的传输路径,帮助开发者检查和调试HTTP请求。
- 无副作用:不会对服务器上的资源产生任何改变。
- 幂等性:多次执行同一请求,结果相同。
URL格式
#端口默认80/443不显示,文件名index不显示,锚点类似于目录的页码告诉浏览器跳转到哪里 |
HTTP 状态码分类
HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599):
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
HTTP状态码列表:
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed(预期失败) | 服务器无法满足请求头中 Expect 字段指定的预期行为。 |
418 | I’m a teapot | 状态码 418 实际上是一个愚人节玩笑。它在 RFC 2324 中定义,该 RFC 是一个关于超文本咖啡壶控制协议(HTCPCP)的笑话文件。在这个笑话中,418 状态码是作为一个玩笑加入到 HTTP 协议中的。 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自XenoEcho's Blog
评论 ()