7.4 http

1 minute read

7.4.1 header

  • 常用http头
请求协议头 说明 实例
Accept 可接受内容类型 Accept: text/plain
Cache-Control 指定请求/响应所有缓存机制 Cache-Control: no-cache
Cookie cookie Cookie: $Version=1; Skin=new;
Date 发送该消息的时间 Date: Tue, 15 Nov 1994 08:12:31 GMT
If-Modified-Since 判断缓存是否失效, 未修改则返回304 If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
If-None-Match 判断缓存是否失效, 未修改则返回304 If-None-Match: "737060cd8c284d8af7ad3082f209582d"
If-Range 判断实体是否修改过, 未修改则返回缺失部分, 否则整体返回 If-Range: "737060cd8c284d8af7ad3082f209582d"
Range 指定实体的”部分” Range: bytes=500-999
User-Agent 浏览器身份标识 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0
Connection 该浏览器想要优先使用的连接类型 Connection: keep-alive, Connection: Upgrade
响应协议头 说明 实例
Cache-Control 缓存机制是否可缓存该对象 Cache-Control: max-age=3600
E-Tag 资源标识符 ETag: "737060cd8c284d8af7ad3082f209582d"
Expires 缓存过期时间 Expires: Thu, 01 Dec 1994 16:00:00 GMT
Last-Modified 请求对象最后修改时间 Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
Status 响应状态码, 如200、304等 Status: 200 OK

7.4.2 http缓存机制

  • 缓存存储策略, 通过Cache-Control控制http返回内容是否缓存, 包含public即将返回存储到本地、privateno-cachemax-ageno-store
    • public, 所有内容将被缓存
    • private, 所有内容只有客户端缓存, Cache-Control的默认取值
    • no-cache, 客户端缓存内容, 是否使用缓存通过协商缓存来决定, 等价于max-age=0
    • no-store, 所有内容都不会缓存, 即不使用强制缓存, 也不使用协商缓存
    • max-age=xxx, 缓存内容将在xxx秒生效
  • 缓存过期策略, 通过Expires指定缓存有效期, 其中no-cache等于max-age=0
  • 缓存对比策略, 客户端通过last-modified-since指定缓存有效时间, 大于last-modified则认为缓存有效
  • 缓存过程
    • 强制缓存, 向浏览器缓存查找该请求结果, 并根据该结果的缓存规则来决定是否使用该缓存结果的过程, 强制缓存的情况主要有三种
      • 不存在该缓存结果和缓存标识, 强制缓存失效, 直接向服务器发起请求
      • 存在该缓存结果和缓存标识, 该结果已失效, 强制缓存失效, 走协商缓存流程(即请求服务器看缓存是否过期)
      • 存在该缓存结果和缓存标识, 且该结果尚未失效, 强制缓存生效, 直接返回结果, 不请求服务器
    • 协商缓存, 强制缓存失效后, 浏览器携带缓存标识向服务器发起请求, 由服务器根据缓存标识决定是否使用缓存的过程, 主要情况有两种
      • 协商缓存生效, 返回304
      • 协商缓存失效, 返回200和请求结果

7.4.3 http断点续传

  • Range请求头, 如Range:bytes=30-从30字节到文件结束, Content-Range返回头, 指定接受范围和文件大小
  • 增强校验, Last-Modified;E-Tag主要解决1). 文件时间修改, 但内容无修改, 2). 文件修改频繁, 秒级; If-Range判断实体是否变化, 如果无变化返回客户端丢失部分, 否则返回整个实体

7.5 https

SSL协议

  • 四次握手
    1. client -> server, 提供SSL版本, 客户端随机数, 支持的加密算法
    2. client <- server, 提供SSL版本, SSL证书, 服务器随机数
    3. client -> server, 验证证书机构, 可信则拿出证书中的公钥, 对随机数加密
    4. client <- server, 使用私钥解密随机数, 生成会话密钥
  • 由于非对称加密耗性能, 握手使用非对称加密, 数据通信使用”会话密钥”加解密, 即对称加密
  • SSL握手详解 参考HTTPS加密协议详解:TLS/SSL握手过程中的流程图
  1. client -> server, 明文提供SSL版本, 客户端随机数(random_C)(用于后续生成密钥), 加密套件列表(包含认证算法Au(身份验证), 密钥交换算法 KeyExchange(密钥协商), 对称加密算法Enc(信息加密)和信息摘要Mac(完整性校验)), 压缩算法列表等
  2. client <- server, 返回协商的信息结果, 包括选择使用的协议版本, 选择的加密套件 cipher suite, 选择的压缩算法 compression method, 随机数 random_S(用于后续协商加密) + server_certificates, 服务器配置对应的证书链(用于身份验证和密钥交换)
  3. client -> server, 客户端验证证书合法性, 验证通过才进行后续通信, 包括证书是否吊销 revocation, 有效期 expiry date, 域名 domain(校验证书域名和访问域名是否匹配); client_key_exchange, 证书校验合法后, 客户端计算生成随机数Pre-master, 并用证书公钥加密, 发送给服务器; 客户端把随机数random_C和random_S与自己计算产生的Pre-master,计算得到协商密钥, enc_key=Func(random_C,random_S,Pre-master);change_cipher_spec, 客户端通知服务器后续的通信采用协商的通信密钥和加密算法进行加密通信;encrypted_handshake_message, 结合之前参数的hash值与其它相关信息生成一段数据, 采用协商密钥session secret与算法进行加密然后发送给服务器用于数据和我收验证
  4. client <- server, 服务器用私钥解密Pre-master数据, 加上random_C和random_S计算协商密钥, enc_key =Fnc(random_C,random_S,Pre-master);计算所有接受的hash值, 解密客户端发送的encrypted_handshake_message, 验证数据和密钥正确性; change_cipher_spec, 验证通过之后, 服务器发送change_cipher_spec告知客户端的通信采用协商的密钥和算法进行通信;encrypted_handshake_message, 服务器结合所有参数信息并使用协商密钥session secret与算法加密并发给客户端
    • 备注
      • 握手结束, 客户端接受到所有信息的hash值, 采用协商密钥解密encrypted_handshake_message, 验证服务器发送的数据和密钥, 验证通过则握手完成

参考

Tags:

Categories:

Updated: