# HTTP 面试题

# HTTP有哪些方法

HTTP1.0: GET POST HEAD

HTTP1.1: OPTIONS PUT DELETE TRACE CONNECT

  • GET 请求资源
  • HEAD 请求资源的头部信息
  • OPTIONS 获取资源所支持的通信选项,常见于CORS
  • POST 发送数据给服务器
  • PUT 发送数据给服务器,一般表示新增
  • DELETE 用于删除指定资源
  • PATCH 用于修改资源
  • CONNECT 预留给使用管道方式的代理服务器
  • TRACE 回显服务器收到的请求,一般用于测试

# GET VS POST

  • 数据传输方式,GET 参数在 URL中,POST 参数在 Body 中
  • 安全性:相同
  • 易用性:GET 携带参数方便进行分享
  • 缓存:GET 请求一般可以缓存
  • 特性:GET 只读幂等,POST 非幂等。当然最终还是要看服务端的实现

# 报文的结构

请求报文4部分组成

  • 请求行
  • 请求头
  • 空行
  • 请求体

响应报文4部分组成

  • 响应行
  • 响应头
  • 空行
  • 响应体

# 报文头字段

通用头字段

  • Cache-Control
  • Connection
  • Upgrade
  • via
  • Wraning
  • Transfor-Encoding
  • Trailer
  • Pragma
  • Date

请求头字段

  • Accept
  • Accept-Encoding
  • Accept-Language
  • Accept-Charset
  • Range
  • Authorization
  • Proxy-Authorization
  • Host
  • From
  • User-Agent
  • Referer
  • Expect

响应头字段

  • Accept-Ranges
  • Age
  • Location
  • Content-MD5
  • Content-Location
  • Content-Ranges
  • Etag
  • Last-Modified
  • Expires

# 状态码

1xx

  • 101 Switch

2xx 成功

  • 200 OK 正确处理
  • 201 Ceated
  • 202 Accepted
  • 206 Partial Content 范围请求

3xx 重定向

  • 301 Moved Permanetly 永久重定向
  • 302 Found 临时重定向
  • 303 See Other 请使用另一个URL获取
  • 304 Not Modified 未修改,可使用缓存资源
  • 307 Temporary Rediect 临时重定向

4xx 客户端错误

  • 400 Bad Request 语法错误
  • 401 Unauthorized 未授权,一般提示需要登录
  • 402 Payment Required 未付费,大多不实现此状态码
  • 403 Forbidden 拒绝访问资源
  • 404 Not Found 资源未能找到
  • 408 Request Timeout 客户端请求超时
  • 409 Conflict 冲突

5xx 服务端错误

  • 500 Internal Server Error 服务端执行出错
  • 501 Not Implemented 服务端未实现
  • 503 Service Unavailable 服务不可用
  • 505 HTTP Version Not Supported 不支持的HTTP版本

# keep-alive

表示长连接,后续HTTP请求重用相同的TCP连接。

Connection: keep-alive

keep-alive的优点

  • 减少了cpu和内存的使用
  • 允许请求管线化(并发多个请求)
  • 降低拥塞控制成本
  • 减少后续请求的延迟(无需再次TCP握手)
  • 报告错误,无需关闭TCP连接

# HTTPS 是如何保证安全的

  • DH 密钥交换 (diffie-hellman)
  • RSA 非对称加密 (原理:大质数的因式分解)(不能避免中间人攻击)
  • CA 证书 (针对中间人攻击)

# HTTP2 的进步

  • 二进制分帧,比文本格式解析更高效
  • 头部压缩,使用首部表进行存储之前的报文头,类似动态规划的备忘录
  • 服务端推送,服务端可以在发送HTML是主动推送其他资源,提高页面加载速度
  • 多路复用,1.x 中浏览器为了控制资源,会对单个域名有6-8个连接数的限制,2.x中,同域名的所有通信都在单个连接上完成。

# HTTP 缓存

一个HTTP通信的过程通常是这样的:

  1. 客户端向服务器发出请求,请求资源
  2. 服务器返回资源,并通过响应头决定缓存策略
  3. 客户端根据响应头的策略决定是否缓存资源,并将响应头与资源缓存下来
  4. 在客户端再次请求且命中资源的时候,此时客户端去检查上次缓存的缓存策略,根据策略的不同、是否过期等判断是直接读取还是与服务器协商缓存

# 什么时候触发强缓存和协商缓存

强缓存

强缓存离不开两个响应头 ExpiresCache-Control

  • Expires:表示资源过期的时间,是一个绝对的时间,由客户端直接进行时间比对,所以受限于本地时间,如果修改了本地时间,可能会造成缓存失效。
  • Cache-Control:优先级高于 Expires,表示一个相对时间,一个时间长度。
Expires: Wed, 11 May 2018 07:20:00
Cache-Control:public, max-age=31536000
  • public 可以被所有用户缓存,包括终端,CDN,各级代理服务器
  • private 只能被终端浏览器缓存
  • no-cache 需要重新验证(协商缓存)
  • no-store 禁止缓存

协商缓存

当第一次请求时,服务器返回的响应头里,没有 Cache-Control 和 Expires 或者这两个字段都过期,或者 Cache-Control 设置为 no-cache 时,那么浏览器第二次就会与服务器进行协商。

如果缓存和服务器资源一致,那么服务端直接返回 304 Not Modified,否则服务器就会将新的资源返回给浏览器,状态码是 200 OK。

协商缓存对应两组字段它们分别是

  • Last-Modified/If-Modified-Since 客户端将上次请求的响应头 Last-Modified 作为 If-Modified-Since 发送给服务器,服务器通过这个字段来判断是否命中缓存。
  • ETag/If-None-Match 的流程跟 Last-Modified 类似,将上次请求响应头的 ETag 作为 If-None-Match 发送给服务,区别在于 ETag 是根据资源内容进行哈希,生成一个信息摘要。通常这个要比 Last-Modified 的精确度更高。

示例: 使用stat命令查看文件属性

stat cet4.json
File: cet4.json
Size: 950629    	Blocks: 1864       IO Block: 4096   regular file
Device: fc01h/64513d	Inode: 671588      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-08-07 21:13:01.576726636 +0800
Modify: 2022-07-30 16:38:19.549403632 +0800
Change: 2022-07-30 16:38:19.549403632 +0800
Birth: -