Appearance
HTTP(Hypertext Transfer Protocol)
HTTP(Hypertext Transfer Protocol)超文本传输协议,是一种用于传输超媒体文档(如 HTML)的应用层协议,是 Web 浏览器和服务器之间的通信协议。HTTP 规定了浏览器或其他客户端与 Web 服务器之间的请求和响应的标准格式。HTTP 协议是互联网上应用最为广泛的一种网络协议。
组成
- 请求方法:HTTP 定义了一组请求方法,常用的有 GET、POST、PUT、DELETE、HEAD、OPTIONS 等,不同的方法表示不同的操作类型。
- URL(Uniform Resource Locator,统一资源定位符):URL 用于标识要访问的资源的位置。它由协议、主机名、端口号、路径和查询参数等组成。
- 协议版本号:HTTP 协议的版本号,常用的有 HTTP/1.0、HTTP/1.1、HTTP/2 等。
- 请求头:请求头包含了请求的各种附加信息,比如 Accept、Accept-Language、User-Agent 等。
- 空行:请求头和请求体之间需要使用一个空行隔开。
- 请求体:请求体包含了请求的主体内容,比如 POST 请求中的表单数据等。对于 GET 请求来说,请求体通常为空。
POST /submit.php HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
Cookie: user_id=12345; session_id=abcdef123456
name=John&age=30&email=john@example.com
版本
- HTTP/0.9:1991 年发布,只支持 GET 方法,不支持请求头和响应头,只能传输 HTML 格式的文本。
- HTTP/1.0:1996 年发布,支持多种请求方法,支持请求头和响应头,但没有持久连接,每个请求都需要建立一个新的 TCP 连接。
- HTTP/1.1:1999 年发布,支持持久连接,允许多个请求和响应在一个 TCP 连接上复用,减少了建立和关闭连接的开销,支持管道化,可以同时发送多个请求,响应的顺序和请求的顺序一致,支持 Host 头,一个服务器可以提供多个 Web 站点的服务。
- HTTP/2:2015 年发布,采用二进制协议,支持多路复用,允许在同一个连接上并行交错地发送多个请求和响应,采用头部压缩技术,减小了消息头的大小,支持服务器推送,可以将客户端需要的资源提前推送到客户端缓存,提高性能。
- HTTP/3:2020 年发布,基于 QUIC 协议,使用 UDP 代替 TCP 作为传输层协议,提供更快的连接建立和更可靠的数据传输。
http1 和 http2 区别
- 二进制协议:HTTP/1.1 使用文本格式的报文,而 HTTP/2 使用二进制格式的帧,这使得它更高效、更快速。
- 多路复用:HTTP/2 可以在一个连接上同时处理多个请求和响应,而 HTTP/1.1 需要每个请求都使用一个新的连接。
- 服务器推送:HTTP/2 可以让服务器在客户端请求之前就将相关资源推送给客户端,提高了页面加载速度。
- 头部压缩:HTTP/2 使用 HPACK 算法对头部信息进行压缩,从而减少了数据传输的大小。
- 流控制:HTTP/2 可以对每个数据流进行流控制,从而更好地控制网络流量。
http 与 https
http 是一种明文传输协议,数据传输的过程中不对数据进行加密,因此容易被中间人攻击窃听、篡改或伪造数据。
https 在建立连接时需要进行 SSL/TLS 握手过程,通过客户端和服务器之间的公钥和私钥的配对,为数据传输建立起一条安全的通道。该通道上的数据经过加密处理,中途即使被拦截也很难破解解密,可以保证数据传输的机密性、完整性和真实性。
尽管如此,https 并不是完全可靠,在传输一些重要数据时,可能还需要数据加密(前端加密,后端解密)。
状态码
HTTP 状态码根据第一位数字的不同,可以分为以下 5 类:
- 1xx(信息性状态码):表示请求已经被接收,继续处理。
- 100 Continue:表示客户端可以继续发送请求。
- 101 Switching Protocols:表示服务器已经理解了客户端的请求,并将通过 Upgrade 消息头通知客户端采用不同的协议来完成该请求。
- 2xx(成功状态码):表示请求已经成功被服务器接收、理解、并接受处理。
- 200 OK:表示服务器已经成功处理了客户端请求。
- 201 Created:表示服务器已经成功创建了资源,通常在 POST 请求中使用。
- 204 No Content:表示服务器已经成功处理了客户端请求,但没有返回任何内容。
- 3xx(重定向状态码):表示需要客户端进一步操作才能完成请求。
- 301 Moved Permanently:表示被请求的资源已经永久移动到新位置,并通过 Location 响应头指定了新的 URL 地址。
- 302 Found:表示被请求的资源临时移动到了新位置,并通过 Location 响应头指定了新的 URL 地址。
- 304 Not Modified:表示客户端发送的 GET 或 HEAD 请求中的资源没有被修改,并且由于存在缓存,服务器不需要再次传输该资源。
- 4xx(客户端错误状态码):表示客户端发送的请求有误或无法被服务器处理。
- 400 Bad Request:表示客户端发送的请求有语法错误或无法被服务器理解。
- 401 Unauthorized:表示客户端需要进行身份验证才能访问被请求的资源。
- 403 Forbidden:表示服务器已经理解了客户端请求,但是拒绝提供服务。
- 404 Not Found:表示被请求的资源不存在于服务器上。
- 5xx(服务器错误状态码):表示服务器在处理请求时发生了错误。
- 500 Internal Server Error:表示服务器在处理请求时发生了内部错误。
- 502 Bad Gateway:表示服务器作为网关或代理时无法从上游服务器接收到有效的响应。
- 503 Service Unavailable:表示服务器暂时无法处理客户端的请求,通常是由于过载或维护而引起的。