Http相关面试题
http常见的状态码有哪些
状态码分类
- 1xx 服务器收到请求
- 2xx 请求成功,如200
- 3xx 重定向,如302
- 4xx 客户端错误,如404
- 5xx 服务端报错,如500
常见状态码
- 200 成功
- 301 永久重定向(配合location,浏览器自动处理)下次不会再访问老地址
- 302 临时重定向(配合location, 浏览器自动处理) 还会访问老地址
- 304 资源未被修改(缓存)
- 404 资源未找到
- 403 没有权限
- 500 服务器错误
- 504 网关超时
http常见的header有哪些
| Header 名称 | 类别 | 作用 | 示例 |
|---|---|---|---|
Content-Type |
请求 & 响应头 | 指定请求/响应的媒体类型(MIME 类型) | application/json |
Authorization |
请求头 | 认证信息(如 Bearer Token、Basic Auth) | Bearer <token> |
Accept |
请求头 | 客户端希望接收的数据类型 | application/json |
Accept-Encoding |
请求头 | 浏览器可接收的压缩算法 | gzip,zip |
User-Agent |
请求头 | 发送请求的客户端信息(浏览器、设备等) | Mozilla/5.0 |
Referer |
请求头 | 指示请求的来源页面 | https://example.com |
Origin |
请求头 | 请求的源(主要用于 CORS) | https://example.com |
Host |
请求头 | 目标服务器的主机名 | api.example.com |
Cookie |
请求头 | 发送到服务器的 Cookie 数据 | sessionId=abc123 |
Set-Cookie |
响应头 | 服务器返回的 Cookie 设置 | sessionId=abc123; HttpOnly |
Cache-Control |
请求 & 响应头 | 控制缓存策略 | no-cache, max-age=3600 |
ETag |
响应头 | 资源版本标识(用于缓存校验) | "abc123" |
If-None-Match |
请求头 | 请求时携带的 ETag,避免重复获取资源 | "abc123" |
Content-Length |
请求 & 响应头 | 请求/响应的内容长度(字节) | 1024 |
Transfer-Encoding |
响应头 | 指定数据传输编码方式(如分块传输) | chunked |
Connection |
请求 & 响应头 | 控制连接是否保持(keep-alive 复用 TCP 连接) | keep-alive |
X-Forwarded-For |
请求头 | 代理服务器转发的原始客户端 IP | 192.168.1.1 |
什么是Restful API
Restful api是一种基于REST架构风格的web api设计规范,它通过http协议,使用资源 + 统一接口进行交互,旨在提供简洁、规范、可扩展的API设计
-
资源
RESTful API 的核心是资源,每个资源用 URI(统一资源标识符) 进行唯一标识。例如:
- https://api.example.com/users 表示 用户资源
- https://api.example.com/users/123 表示 ID 为 123 的用户
- https://api.example.com/posts/456/comments 表示 ID 为 456 的文章的评论
-
HTTP方法(动词)
RESTful API 主要通过 HTTP 方法 对资源执行不同操作
| HTTP 方法 | 作用 | 示例 |
|---|---|---|
GET |
获取资源 |
GET /users/123 获取用户 123 |
POST |
创建资源 |
POST /users 创建新用户 |
PUT |
更新资源(整体) |
PUT /users/123 更新用户 123 |
PATCH |
更新资源(部分) |
PATCH /users/123 仅更新部分信息 |
DELETE |
删除资源 |
DELETE /users/123 删除用户 123 |
描述下http的缓存机制
什么是缓存?
二次打开页面的时候,不需要再重复请求一些静态资源
为什么需要缓存?
减少网络请求数量,页面加载更快,降低服务端压力,
哪些资源可以被缓存?
静态资源 js css img
HTTP缓存主要分为强制缓存和协商缓存,他们的区别在于是否需要向服务器发送请求来确认资源的有效性
强制缓存
- 不会发送请求到服务器,直接从本地缓存中加载资源
- 依赖
Expires或Cache-Control`, 在response headers中返回,max-age 单位是秒 - 若 max-age 和 Expires 都存在,Cache-Control 优先级更高。
Cache-Control: max-age=3600
Expires: Wed, 06 Mar 2025 12:00:00 GMT
cache-control的值:max-age(缓存时间), no-cache(不用本地缓存),no-store(不用服务端缓存), private, public
expires已经被cache-control代替
协商缓存
- 需要向服务端发送请求(服务端缓存策略),如果资源未被修改,返回 304 Not Modified, 减少数据传输,否则返回200和最新的资源
- 依赖Last-Modified / If-Modified-Since 或者 ETag / If-None-Match
服务端响应(Response Headers) - 优先使用Etag,Last-Modified只能精确到秒级
- 如果资源被重复生成,而内容不变,则Etag更精准
Last-Modified: Wed, 06 Mar 2024 12:00:00 GMT
ETag: "5d8c72a5-24dc"
浏览器请求(下次访问时),会把这些资源表示带上(Request Headers)
If-Modified-Since: Wed, 06 Mar 2024 12:00:00 GMT
If-None-Match: "5d8c72a5-24dc"
整体缓存的流程
用户请求资源 → 浏览器检查缓存是否有效
|
|--- 如果有效(强缓存):直接从缓存加载资源,结束
|
|--- 如果无效或缓存过期(协商缓存):
|
|--- 发送请求到服务器,并带上 `If-Modified-Since` 或 `If-None-Match`
|
|--- 服务器返回:
|--- 如果资源未修改:返回 `304 Not Modified`,浏览器继续使用缓存
|--- 如果资源修改了:返回 `200 OK`,并更新资源
|
结束
刷新操作
- 正常操作:地址栏输入url,跳转链接,前进后退, 强制缓存有效,协商缓存有效
- 手动刷新: F5, 点击刷新按钮,点击菜单刷新, 强制缓存失效,协商缓存有效
- 强制刷新:ctrl + F5,强制缓存失效,协商缓存失效
https的加密方式以及过程解析
HTTPS是HTTP的安全版本,通过SSL/TLS协议对HTTP协议进行加密,确保数据传输的过程中的机密性,完整性和身份验证。HTTPS采用了对称加密、非对称加密和哈希算法三种加密方式
http和https的区别
- http是明文传输,敏感信息容易被中间劫持
- https=http+加密, 劫持了也无法解密
- 现代浏览器已开始强制https协议
加密方式
对称加密
用同一个key进行加密和解密,这个key是服务端传递给客户端,它的加密速度比非对称加密要快很多,常用来数据传输过程中的加密,对称加密的安全性依赖于密钥的保密性。
非对称加密
一对key(公钥和私钥),公钥用来加密,私钥用于解密,只有拥有私钥的一方可以解密通过公钥加密的数据,常用来身份验证和密钥交互
哈希算法
哈希算法用于保证数据的完整性,它将输入数据转换成固定长度的哈希值(MD5、SHA-256)。哈希算法是单向的,无法反向计算原始数据,用来保证传输过程中数据没有被篡改
HTTPS加密过程解析
- 客户端发起请求
- 客户端发起握手请求,向服务器发送一个
clientHello消息,其中包含了浏览器支持的加密算法、生成的随机数等信息
- 客户端发起握手请求,向服务器发送一个
- 服务器响应并且发送证书
- 服务器的数字证书(服务器的公钥、证书颁发机构信息、证书的有效期)
- 服务器选择的加密算法
- 服务器生成的随机数
- 证书验证
- 客户端验证证书,会使用自己的证书存储来验证服务器的数字证书是否合法,如果有效继续下面的步骤,如果无效告知用户证书不可信,是否继续访问
- 生成共享公钥
- 客户端使用从服务器证书中提取到的公钥来加密一个预主密钥,将这个预主密钥发送到给服务器,只有服务器可以解密
- 服务器使用自己的私钥解密客户端发送的预主密钥,获取预主密钥
- 对称加密密钥生成
- 服务器和客户端根据预主密钥以及之前交互的随机数,利用对称加密算法(AES)来生成会话密钥,这个会话密钥用于后续的数据加密传输
- 完成握手
- 双方确认握手完成,双方对称加密密钥生成后,会通过哈希算法计算出消息摘要,并且通过加密的方式互相发送确认消息,确保通信双方都拥有相同的会话密钥
- 握手完成后,客户端和服务器开始使用会话密钥对后续的数据进行加密传输。
https证书
- 中间人攻击,可能会替换publicKey
- 使用第三方证书
- 浏览器校验证书
TCP的三次握手四次挥手是如何进行
TCP是一种面向连接的可靠的传输协议,通信双方通过三次握手建立连接,通过四次挥手关闭连接
-
三次握手:用于 建立连接,确保双方都能发送和接收数据。
- 客户端发送 SYN。
- 服务器响应 SYN-ACK。
- 客户端发送 ACK,连接建立。
-
四次挥手:用于 关闭连接,确保双方都完成数据传输并正确关闭连接。
- 客户端发送 FIN。
- 服务器响应 ACK。
- 服务器发送 FIN。
- 客户端响应 ACK,连接关闭。