1. 什么是HTTP协议
HTTP超文本传输协(Hyper Text transfer protocol),是一种用于用于分布式、协作式和超媒体信息系统的应用层协议。它于1990年提出,经过十几年的使用与发展,得到不断地完善和扩展。HTTP 是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。客户端与服务器通信时传输的内容称为报文,HTTP协议就是规定了报文的格式。客户端发送给服务器的称为请求报文,服务器发送给客户端的称为响应报文。
1.1 发展历程
- HTTP/0.9
- 蒂姆伯纳斯李是一位英国计算机科学家,也是万维网的发明者。他在 1989 年创建了单行 HTTP 协议。它只是返回一个网页。这个协议在 1991 年被命名为 HTTP/0.9。
- HTTP/1.0
- 1996年,HTTP/1.0发布,支持三种请求方式:GET,POST和HEAD。
- HTTP/1.0相对于HTTP/0.9的改进:
- 每个请求都附加了HTTP版本信息。
- 在响应开头附加状态码。
- 请求和响应都包含HTTP报文头。
- 能够传输HTML文件以外的文档。
- 不是官方标准。
- HTTP/1.1
- HTTP第一个标准化版本HTTP/1.1于1997年初发布,支持7种请求方式:GET,POST,HEAD,PUT,DELETE,TRACE和OPTIONS。
- HTTP/1.1是HTTP/1.0的增强:
- 一个IP地址可以有多个虚拟主机,通过Host头域可以访问一个IP地址下的不同网站。
- 持久连接和流水线连接允许web浏览器通过单个长连接发送多个请求。
- 缓存支持节省了宽带并使响应速度更快。如果请求的资源已经缓存了,那么就会直接从本地加载该资源,不需要再从服务器获取 。
- 出现了HTTPS,是使用SSL/TLS进行安全加密通信的HTTP的安全版本。
- HTTP/2
- 由IETF在2015年发布。HTTP/2旨在提高Web性能,减少延迟,增加安全性,使Web应用更加快速、高效和可靠。
- 多路复用:允许同时发送多个请求和响应。这样可以减少延迟,提高效率和网络吞吐量。
- 二进制传输:使用二进制协议,可以更快地解析,更有效地传输数据,减少了传输过程中的开销和延迟。
- 使用HPACK算法对HTTP头部进行压缩,减少了头部传输的数据量,从而减少了网络延迟。
- 服务器推送:支持服务器推送,允许服务器在客户端请求之前推送资源以提高性能。
- 安全性:默认使用TLS加密传输数据,提高了安全性。
- 兼容HTTP/1.1:可以与HTTP/1.1共存,服务器可以同时支持HTTP/1.1和HTTP/2。如果客户端不支持HTTP/2,服务器可以使用HTTP/1.1。
- HTTP/3
- 于 2021 年 5 月 27 日发布 , HTTP/3 是一种新的、快速、可靠且安全的协议,适用于所有形式的设备。 HTTP/3 没有使用 TCP,而是使用谷歌在 2012 年开发的新协议 QUIC。
- HTTP/3 是继 HTTP/1.1 和 HTTP/2之后的第三次重大修订。
- HTTP/3 带来了革命性的变化,以提高 Web 性能和安全性。设置 HTTP/3 网站需要服务器和浏览器支持。
- 目前,谷歌云、Cloudflare和Fastly支持 HTTP/3。Chrome、Firefox、Edge、Opera 和一些移动浏览器支持 HTTP/3。
1.2 HTTP协议的会话方式
1.3 在浏览器中通过开发者工具抓取请求响应报文
2. 请求报文和响应报文
2.1 请求报文
- 请求报文格式
- 请求行
- 请求方式
- 资源路径
- 协议版本
- 请求头
- 请求空行
- 请求体:浏览器提交给服务器的数据。
- 请求行
2.1.1 GET方法
- 请求参数在url中携带,所以没有请求体,也没有请求空行。
- 请求参数拼接在url后,使用?与url连接,参数之间通过&连接。
- 由于参数在url中携带,所以有大小限制(地址栏数据一般限制为4kb),并且只能携带纯文本。
- 没有请求体,所以封装和解析速度快,效率高。浏览器的默认提交都是GET请求,比如:地址栏按回车,超链接,表单的默认提交方式。
2.1.2 POST方法
- POST方法有请求体。
- 请求数据在请求体中携带,没有大小和内容限制。
- 只能使用POST请求上传文件。
- 相对GET方法比较安全,因为提交的数据不在url中明文显示。
- 效率比GET方法低。
请求体:
2.2 响应报文
- 响应报文格式
- 响应行
- 协议版本
- 状态码
- 状态码描述
- 响应头
- 响应空行
- 响应体
- 响应行
2.2.1 响应状态码
状态码 | 状态码英文描述 | 中文含义 |
---|---|---|
1** | ||
100 | Continue | 继续。客户端应继续其请求。 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议。 |
2** | ||
200 | OK | 请求成功。一般用于GET与POST请求。 |
201 | Created | 已创建。成功请求并创建了新的资源。 |
202 | Accepted | 已接受。已经接受请求,但未处理完成。 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本。 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档。 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域。 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求。 |
3** | ||
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请求重定向。 |
4** | ||
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的请求头信息。 |
5** | ||
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协议的版本,无法完成处理。 |