# 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通信的过程通常是这样的:
- 客户端向服务器发出请求,请求资源
- 服务器返回资源,并通过响应头决定缓存策略
- 客户端根据响应头的策略决定是否缓存资源,并将响应头与资源缓存下来
- 在客户端再次请求且命中资源的时候,此时客户端去检查上次缓存的缓存策略,根据策略的不同、是否过期等判断是直接读取还是与服务器协商缓存
# 什么时候触发强缓存和协商缓存
强缓存
强缓存离不开两个响应头 Expires
与 Cache-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: -