HTTP 协议 | 青训营

132 阅读12分钟

课程介绍

在正式讲解 Http 协议的技术细节前,本节课前置介绍 Http 协议的基本定义和特点,在此基础上,对于 Http 协议的发展历程及报文结构展开进一步分析。

HTTP 协议的基本定义

HTTP(Hyper Text Transfer Protocol)

HTTP是一种客户端-服务器协议,其中客户端向服务器发送请求,服务器则返回请求的资源。HTTP请求由客户端发送到服务器,请求包含请求的方法(例如GET、POST、PUT等)、URL、HTTP版本和可选的请求头。服务器接收请求后,根据请求中的URL和方法,执行相应的操作,并返回响应。HTTP响应包含响应的状态码、HTTP版本和可选的响应头,以及响应正文。

HTTP 协议主要特征

简单可拓展

在HTTP中,请求和响应是简单可拓展的。这意味着HTTP协议可以轻松地扩展以支持新的请求方法、头信息和状态码。例如,HTTP/2引入了新的二进制协议,以提高性能和安全性。

无状态

另一个HTTP的特点是无状态。这意味着服务器不会在请求之间保留任何状态信息。每个请求都是独立的,并且服务器不会记住之前的请求或响应。这使得HTTP非常适合分布式系统,因为它可以在不同的服务器之间轻松地负载平衡。

然而,由于HTTP是无状态的,因此如果需要在多个请求之间保留状态信息,例如在Web应用程序中,需要使用会话管理技术,例如cookie或token,以跟踪用户的状态。

HTTP 协议发展历程

image.png

  1. HTTP/0.9:1991年,由蒂姆·伯纳斯-李(Tim Berners-Lee)创建的第一个HTTP版本,仅支持GET方法,没有请求头和响应头,只能传输HTML文本。这个版本的HTTP协议非常简单,仅支持通过URL获取HTML文本,因此被称为“简单HTTP”。

  2. HTTP/1.0:1996年,引入了请求头和响应头,支持多种请求方法,例如GET、POST、PUT和DELETE等,支持响应状态码,例如200 OK和404 Not Found等。此外,HTTP/1.0还支持通过Content-Type头指定传输的数据类型,例如text/html或image/jpeg等。

  3. HTTP/1.1:1999年,引入了持久连接、管道化请求和分块传输编码等新特性,以提高性能和效率。持久连接可以在一个TCP连接上处理多个HTTP请求和响应,避免了为每个请求建立新连接的开销。管道化请求允许客户端在一个TCP连接上同时发送多个请求,而无需等待每个请求的响应。分块传输编码允许服务器将响应分成多个块发送,以支持流式传输和动态生成响应。

  4. HTTP/2:2015年,引入了二进制协议、多路复用、头部压缩和服务器推送等新特性,以进一步提高性能和安全性。二进制协议将HTTP消息分解为二进制帧,以提高传输效率和可靠性。多路复用允许多个HTTP请求和响应共享一个TCP连接,以减少连接延迟和网络拥塞。头部压缩可以减少HTTP头部的大小,从而减少带宽占用和连接延迟。服务器推送允许服务器在客户端请求之前主动向客户端推送资源,以提高性能和用户体验。

  5. HTTP/3:2020年,引入了基于QUIC协议的新版本,以进一步提高性能和安全性,例如减少连接延迟和降低网络拥塞。QUIC协议是基于UDP协议的新型传输协议,它可以在单个连接上同时处理多个HTTP请求和响应,从而减少连接延迟和网络拥塞。HTTP/3还使用TLS 1.3协议来提供更好的安全性和隐私保护。

HTTP 协议的报文结构

状态码

image.png

HTTP协议中的状态码是指在客户端向服务器发送请求后,服务器返回的响应状态码。状态码由三位数字组成,第一个数字表示响应的类型,后面两个数字用于进一步细化响应的类型。常见的状态码有以下几种:

  1. 1xx(信息性状态码):表示服务器已经接收到请求,但需要客户端继续发送请求才能完成处理。

  2. 2xx(成功状态码):表示服务器已经成功处理请求,并返回了所需的响应结果。

    • 200 OK:表示请求成功,并返回了请求的资源。

    • 201 Created:表示请求成功,并创建了新的资源。

    • 204 No Content:表示请求成功,但没有返回任何内容。

  3. 3xx(重定向状态码):表示客户端需要执行某些额外的操作才能完成请求。

    • 301 Moved Permanently:表示请求的资源已经永久移动到了新的URL地址。

    • 302 Found:表示请求的资源已经暂时移动到了新的URL地址。

    • 304 Not Modified:表示客户端缓存的资源是最新的,不需要重新下载。

  4. 4xx(客户端错误状态码):表示客户端发送的请求有错误或不完整,服务器无法处理。

    • 400 Bad Request:表示客户端发送的请求有错误,服务器无法理解。

    • 401 Unauthorized:表示客户端需要进行身份认证才能访问请求的资源。

    • 404 Not Found:表示请求的资源不存在或无法访问。

  5. 5xx(服务器错误状态码):表示服务器在处理请求时发生了错误。

    • 500 Internal Server Error:表示服务器在处理请求时发生了未知的错误。

    • 503 Service Unavailable:表示服务器暂时无法处理请求,通常是因为服务器过载或正在维护。

请求头和响应头

HTTP协议中的请求头和响应头是用于传递附加信息的字段,它们可以在HTTP请求和响应中传递各种元数据。以下是一些常用的请求头和响应头:

1. 请求头

image.png

- User-Agent:客户端的浏览器类型和版本号。

- Accept:客户端可以接受的数据类型,例如text/html或image/jpeg等。

- Authorization:客户端的身份认证信息,例如用户名和密码等。

- Cookie:客户端的会话标识符,用于跟踪用户状态。

- Referer:客户端的来源页面地址,用于跟踪用户的访问来源。

2. 响应头

image.png

- Content-Type:响应的数据类型,例如text/html或image/jpeg等。

- Content-Length:响应的数据长度,用于客户端正确接收响应。

- Location:重定向的URL地址,用于客户端进行页面跳转。

- Set-Cookie:服务器设置的会话标识符,用于跟踪用户状态。

- Cache-Control:缓存控制信息,用于指定响应是否可以被缓存。

- Last-Modified:资源的最后修改时间,用于客户端判断资源是否已经过期。

这些请求头和响应头可以根据需要进行自定义,以传递更多的元数据信息。

缓存

HTTP中的缓存机制可以提高网站的访问速度和用户体验,减少服务器的压力。缓存机制分为强缓存和协商缓存两种方式。

image.png

1. 强缓存

强缓存是指在缓存过期时间之前,浏览器直接从本地缓存中获取资源,而不发送请求到服务器。常见的强缓存方式有两种:

(1)Expires:服务器在响应头中添加Expires字段,指定资源的过期时间,浏览器在请求时会检查本地缓存中的资源是否过期,如果没有过期则直接从本地缓存中获取资源。缺点是服务器和客户端的时间可能不一致,如果时间设置不当会导致缓存失效。

(2)Cache-Control:服务器在响应头中添加Cache-Control字段,指定资源的缓存策略,例如max-age、no-cache、no-store等。其中max-age表示资源的过期时间,no-cache表示强制每次请求都要向服务器验证资源是否过期,no-store表示禁止缓存。

2. 协商缓存

协商缓存是指在缓存过期时间之前,浏览器向服务器发送请求,服务器通过比较资源的版本号或者最后修改时间等信息来判断资源是否有更新,如果没有更新则返回304状态码,浏览器从本地缓存中获取资源。常见的协商缓存方式有两种:

(1)Last-Modified/If-Modified-Since:服务器在响应头中添加Last-Modified字段,表示资源的最后修改时间,浏览器在请求时会将该值添加到If-Modified-Since字段中发送给服务器,服务器通过比较资源的最后修改时间来判断资源是否有更新。

(2)ETag/If-None-Match:服务器在响应头中添加ETag字段,表示资源的版本号,浏览器在请求时会将该值添加到If-None-Match字段中发送给服务器,服务器通过比较资源的版本号来判断资源是否有更新。

如果服务器判断资源有更新,则返回200状态码和最新的资源内容;如果服务器判断资源没有更新,则返回304状态码,浏览器从本地缓存中获取资源。协商缓存相对于强缓存更加灵活,可以更好地控制缓存的粒度和时效性。

image.png

Cookie

HTTP中的Cookie是一种在客户端存储数据的机制,主要用于记录用户的身份认证、用户的偏好设置、购物车等信息。Cookie是由服务器在响应头中通过Set-Cookie字段发送给客户端的,客户端在接收到响应后将Cookie保存在本地,然后在后续的请求中通过Cookie字段将Cookie发送给服务器。

image.png

Cookie通常包含以下几个属性:

  1. Name:Cookie的名称。

  2. Value:Cookie的值。

  3. Expires/Max-Age:Cookie的过期时间,可以通过Expires指定一个具体的过期时间,也可以通过Max-Age指定一个相对的过期时间。

  4. Domain:Cookie的域名,指定了哪些域名可以访问该Cookie。

  5. Path:Cookie的路径,指定了哪些路径可以访问该Cookie。

  6. Secure:Cookie是否只能通过HTTPS协议传输,默认为false。

  7. HttpOnly:Cookie是否只能通过HTTP协议访问,不能通过JavaScript访问,默认为false。

通过设置Cookie的属性,可以控制Cookie的生命周期和安全性。Cookie可以在客户端存储一定量的数据,但是过多的Cookie会影响网站的性能和用户体验,因此需要合理使用Cookie,并定期清理过期的Cookie。

加密

HTTP加密是指通过加密技术对HTTP协议进行加密处理,以保证HTTP通信的安全性。HTTP加密通常采用的是SSL/TLS协议,也就是HTTPS协议。

HTTPS协议使用了一种称为公钥加密的技术,其基本原理是使用一对密钥(公钥和私钥)对数据进行加密和解密。在HTTPS通信中,客户端和服务器之间首先进行一次握手协商,确定加密算法和密钥,然后通过公钥加密技术对HTTP通信的数据进行加密处理,以保证数据的机密性和完整性。

image.png

HTTPS协议的加密过程可以分为以下几个步骤:

  1. 客户端向服务器发起连接请求,并请求建立SSL连接。

  2. 服务器向客户端返回数字证书,证书中包含了服务器的公钥和证书信息。

  3. 客户端验证服务器的证书,如果证书有效,则生成一个随机的对称密钥,并使用服务器的公钥将其加密后发送给服务器。

  4. 服务器使用自己的私钥解密客户端发送的对称密钥,并向客户端发送确认通知。

  5. 客户端和服务器之间使用对称密钥进行加密和解密通信数据。

通过使用HTTPS协议对HTTP通信进行加密处理,可以有效地保护HTTP通信的安全性,防止数据被窃听、篡改和伪造。

HTTP 和 WebSocket

HTTP和WebSocket都是应用层协议,但是它们在通信方式和用途上有很大的区别。

image.png

HTTP协议是一种“请求-响应”协议,客户端向服务器发送请求,服务器返回响应,然后立即关闭连接。HTTP协议通常用于传输静态的文本、图像和音视频等资源。HTTP协议的通信过程是无状态的,每次请求和响应之间是相互独立的,无法实现实时的双向通信。

WebSocket是一种全双工通信协议,可以在客户端和服务器之间建立持久化的连接,实现实时的双向通信。WebSocket协议的通信过程是有状态的,客户端和服务器可以随时发送数据,而不需要重新建立连接。WebSocket协议通常用于实时通信、在线游戏、在线聊天等场景。

在使用WebSocket协议时,客户端和服务器之间首先需要进行一次HTTP握手协议,建立WebSocket连接。HTTP握手协议的过程中,客户端向服务器发送一个HTTP请求,请求升级协议为WebSocket协议,服务器返回一个HTTP响应,表示升级成功。升级成功后,客户端和服务器之间就可以使用WebSocket协议进行实时通信了。

总的来说,HTTP和WebSocket是两种不同的协议,HTTP协议适用于传输静态的文本、图像和音视频等资源,而WebSocket协议适用于实时通信、在线游戏、在线聊天等场景。