前段时间参加了字节青训营,白嫖了掘金内部的会员课😍,收获颇多。于是将对面试中常考的HTTP基础知识做了个总结,以便大家面试前重温。
HTTP(超文本传输协议)是互联网上应用最广泛的协议之一,它定义了客户端和服务器之间交换数据的规则。在本文中,我们将详细介绍 HTTP 的基本概念、工作原理以及如何在实际应用中使用它。
HTTP 基础
HTTP 简介
HTTP 是一种无状态的协议,这意味着服务器不会保存客户端的状态信息。每个请求都是独立的,服务器处理完请求后,就会断开连接。HTTP 基于 TCP/IP 协议,通常使用 80 端口。
HTTP 方法
HTTP 定义了多种方法(也称为动词)来指定请求的操作类型。常见的方法有:
- GET:请求获取指定资源。
- POST:向服务器提交数据。
以下的请求属于复杂请求,需要先发送一次预检请求给服务端
- PUT:更新服务器上的资源。
- DELETE:删除服务器上的资源。
- HEAD:与 GET 类似,但只返回响应头,不返回响应体。
- OPTIONS:查询服务器支持的方法。
- PATCH:部分更新服务器上的资源。
状态码
HTTP 响应中包含一个状态码,用于表示请求的结果。状态码分为五类:
- 1xx:信息性状态码,表示请求已接收,继续处理。
- 2xx:成功状态码,表示请求已成功被服务器接收、理解并接受。
- 3xx:重定向状态码,表示需要后续操作才能完成请求。
- 4xx:客户端错误状态码,表示请求有语法错误或无法实现。
- 5xx:服务器错误状态码,表示服务器未能实现合法的请求。
HTTP 请求和响应
请求和响应结构
HTTP 请求和响应都包含以下部分:
- 请求行/状态行:包含方法、URL、HTTP 版本等信息。
- 请求头/响应头:包含关于请求或响应的元数据,如内容类型、缓存控制等。
- 空行:分隔头部和消息体。
- 消息体:请求或响应的数据。
请求示例
下面是一个简单的 HTTP GET 请求示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
响应示例
下面是一个简单的 HTTP 响应示例:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1250
Server: Apache
Last-Modified: Wed, 08 Jan 2020 15:55:55 GMT
ETag: "1234567890abcdef"
Accept-Ranges: bytes
HTTP 缓存
HTTP 缓存可以减少网络延迟和带宽消耗。HTTP 缓存分为两种:
- 强缓存:在缓存数据未过期时,直接使用缓存数据。
- 协商缓存:在缓存数据过期后,与服务器协商是否可以使用缓存数据。
其实并不是http协议划分的缓存类型,而是在实际使用中根据客户端是否需与服务端协商而人为划分的缓存类型
缓存控制头部
- Cache-Control:用于设置缓存策略。
- Expires:指定缓存过期时间。
- ETag:资源的唯一标识符。会搭配 if-None-Match 一起使用。
- Last-Modified:资源的最后修改时间。需与if-Modified-Since比较。
Cookie
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它记录了用户的一些信息,如用户的登录状态、购物车内容等。Cookie 主要用于识别用户,实现持久会话。
Cookie的设置
服务器通过 Set-Cookie
响应头设置 Cookie。一个典型的 Set-Cookie
响应头如下:
Set-Cookie: name=value; Expires=Wed, 09 Jun 2021 10:18:14 GMT; Path=/; Domain=example.com; Secure; HttpOnly
- Name=Value:Cookie 的名称和值。
- Expires:Cookie 的过期时间。
- Path:限制 Cookie 的发送范围的目录。
- Domain:限制 Cookie 的发送范围的域名。
- Secure:指示 Cookie 只能在 HTTPS 连接中传输。
- HttpOnly:指示 Cookie 不能通过 JavaScript 访问,增强安全性。
当浏览器再次向服务器发送请求时,它会自动在请求头中包含所有匹配的 Cookie,例如:
Cookie: name=value
服务器根据这些 Cookie 信息来识别用户,提供个性化的服务。
HTTP/2
HTTP/2 是 HTTP 协议的第二个主要版本,它在 HTTP/1.1 的基础上进行了多项优化,提高了网络性能和效率。
二进制协议
HTTP/2 使用二进制格式而不是 HTTP/1.x 的文本格式,这使得协议的解析变得更加高效和精确。
多路复用
在 HTTP/1.x 中,每个请求都需要建立一个独立的 TCP 连接,这导致了大量的连接开销。HTTP/2 引入了多路复用,允许在同一个连接中同时发送多个请求和响应,大大提高了传输效率。
流控制
HTTP/2 实现了流控制机制,允许发送方和接收方控制数据流的传输速率,防止网络拥塞。
帧
HTTP/2 通信的最小单位是帧。每个帧都包含帧头,标识当前帧所处的数据流。帧是二进制编码的,这使得协议的解析更加高效。
消息是与逻辑或响应消息对应的完整的一系列帧。 数据流是建立在连接内的双向字节流,可以承载多条消息。
服务器推送
HTTP/2 允许服务器主动向客户端推送资源,而不是等待客户端明确请求。这可以进一步提高页面加载速度。
HTTP/2 连接的持久性
HTTP/2 连接是持久的,一旦建立,就可以用于多个请求和响应,减少了建立和关闭连接的开销。
HTTPS
HTTPS(HTTP Secure)是 HTTP 的安全版本,它在传输数据时使用 SSL/TLS 加密。HTTPS 使用 443 端口。
HTTPS 工作原理
- 客户端发送 HTTPS 请求。
- 服务器返回公钥和证书。
- 客户端验证证书,使用公钥加密数据。
- 服务器使用私钥解密数据。
详细 HTTPS
讲解可以看看这篇文章
详细解析 HTTP 与 HTTPS 的区别面试季中面试官非常喜欢问的一个点,那么 HTTP 与 HTTPS 有什么区别? - 掘金 (juejin.cn)
总结
本篇文章介绍了 HTTP 协议的基本概念、工作原理和实际应用。希望读者能够掌握 HTTP 的基础知识,并在实际项目中灵活运用。如果这篇文章对你有帮助,可以点个赞哦😊!