HTTP

http 各版本对比

  • HTTP 1.0

    • 无状态,无连接
    • 短连接:每次发送请求都要重新建立 tcp 请求,即三次握手,非常浪费性能
    • 无 host 头域,也就是 http 请求头里的 host
    • 不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象
  • HTTP 1.1

    • 长连接,流水线,使用 connection:keep-alive 保持长连接
    • 请求管道化
    • 增加缓存处理(新的字段如 cache-control )
    • 增加 Host 字段,支持断点传输等
    • 由于长连接会给服务器造成压力
  • HTTP 2.0

    • 二进制分帧
    • 头部压缩,双方各自维护一个 header 的索引表,使得不需要直接发送值,通过发送 key 缩减头部大小
    • 多路复用(或连接共享),使用多个 stream ,每个 stream 又分帧传输,使得一个 tcp 连接能够处理多个 http 请求
    • 服务器推送(Sever push)
  • HTTP 3.0

    • 基于 google 的 QUIC 协议,而 quic 协议是使用 udp 实现的

    • 减少了 tcp 三次握手时间,以及 tls 握手时间

    • 解决了 http 2.0 中前一个 stream 丢包导致后一个 stream 被阻塞的问题

    • 优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗

    • 连接迁移,不再用 tcp 四元组确定一个连接,而是用一个 64 位随机数来确定这个连接

      • 更合适的流量控制
      • 基于 UDP 实现
      • 0RTT 建连
      • 基于 UDP 的多路复用
      • 加密认证的报文
      • 向前纠错机制

Content-Type

  • Content-Type: multipart/form-data

    一般用于表单提交或文件上传,boundary 表示字段的分隔符, 例如:

    POST /upload HTTP/1.1
    Host: test.com
    Content-Type: multipart/form-data;boundary=aaa
    
    --aaa  # 表示一个字段
    username: admin
    --aaa
    password: 123456
    --aaa--  # 表示结束

    new FormData().append 时会自动生成 boundary ,例如一个多文件上传的请求体为:

    ------WebKitFormBoundary9IH9jkNXrJXFuUpB
    Content-Disposition: form-data; name="file"; filename="hsmui.png"
    Content-Type: image/png
    
    ------WebKitFormBoundary9IH9jkNXrJXFuUpB
    Content-Disposition: form-data; name="file"; filename="icons.png"
    Content-Type: image/png
    
    ------WebKitFormBoundary9IH9jkNXrJXFuUpB--
  • Content-Type: application/x-www-form-urlencoded

最常见 POST 提交数据的方式,其中的数据会被编码成以&分隔的键值对,字符以URL编码方式编码,例如:{a: 1, b: 2} -> a=1&b=2 -> a%3D1%26b%3D2

  • Content-Type: application/json;charset=utf-8

适合 RESTful 的接口,现在使用 ajax 一般都使用这种方式

三次握手与四次挥手

  • 握手阶段:
    • 1、客户端向服务端发送一段 TCP 报文,请求连接;
    • 2、服务端在确认连接有效时,返回一段 TCP 报文,表示能正常接收客户端消息并同意创建连接;
    • 3、客户端收到来自服务端的确认TCP报文之后,再次向服务端发送报文,表示可以正常接收服务端的响应信息,并正式建立连接;
  • 挥手阶段:
    • 1、客户端向服务端发送TCP报文,表示准备释放连接,处于半关闭状态;
    • 2、服务器向客户端发送 TCP 报文,表示已收到准备释放连接的消息;
    • 3、数据发送完毕后,服务端再次发送TCP报文;
    • 4、客户端收到确认数据完全发送的报文之后,发送 TCP报文确认连接关闭;

强缓存与协商缓存

  • 使用强缓存策略时,如果缓存资源有效,则直接使用缓存资源,不必再向服务器发起请求。强缓存策略可以通过 http 头信息中的 Expires 属性和 Cache-Control 属性两种方式设置,命中后返回 200
  • 如果命中强制缓存,我们无需发起新的请求,直接使用缓存内容,如果没有命中强制缓存,如果设置了协商缓存,这个时候协商缓存就会发挥作用了。命中协商缓存的条件有两个:1、max-age=xxx 过期了;2、Cache-Control 值为 no-cache 。通过两种方式来设置,分别是 http 头信息中的 Etag(优先级高)Last-Modified 属性。当 Last-ModifiedEtag 属性同时出现的时候,Etag 的优先级更高。使用协商缓存的时候,服务器需要考虑负载平衡的问题,因此多个服务器上资源的 Last-Modified 应该保持一致,因为每个服务器上 Etag 的值都不一样,因此在考虑负载平衡时,最好不要设置 Etag 属性。

跨域

GET 和 POST 的区别

GETPOST
幂等
缓存
长度限制URL 有长度限制无限制
编码请求只能进行 URL 编码,只能接收 ASCII 字符支持更多的编码类型,而且不对数据类型做限制
TCP报文请求会发一次报文分为两个 TCP 数据包

对称加密和非对称加密

  • 对称加密就是两边拥有相同的秘钥,两边都知道如何将密文加密解密。但是因为传输数据都是走的网络,如果将秘钥通过网络的方式传递的话,一旦秘钥被截获就没有加密的意义的;

  • 非对称加密,公钥大家都知道,可以用公钥加密数据。但解密数据必须使用私钥,私钥掌握在颁发公钥的一方。首先服务端将公钥发布出去,那么客户端是知道公钥的。然后客户端创建一个秘钥,并使用公钥加密,发送给服务端。服务端接收到密文以后通过私钥解密出正确的秘钥;