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-Modified
和Etag
属性同时出现的时候,Etag
的优先级更高。使用协商缓存的时候,服务器需要考虑负载平衡的问题,因此多个服务器上资源的Last-Modified
应该保持一致,因为每个服务器上Etag
的值都不一样,因此在考虑负载平衡时,最好不要设置Etag
属性。
跨域
GET 和 POST 的区别
GET | POST | |
---|---|---|
幂等 | 是 | 否 |
缓存 | 是 | 否 |
长度限制 | URL 有长度限制 | 无限制 |
编码 | 请求只能进行 URL 编码,只能接收 ASCII 字符 | 支持更多的编码类型,而且不对数据类型做限制 |
TCP报文 | 请求会发一次报文 | 分为两个 TCP 数据包 |
对称加密和非对称加密
-
对称加密就是两边拥有相同的秘钥,两边都知道如何将密文加密解密。但是因为传输数据都是走的网络,如果将秘钥通过网络的方式传递的话,一旦秘钥被截获就没有加密的意义的;
-
非对称加密,公钥大家都知道,可以用公钥加密数据。但解密数据必须使用私钥,私钥掌握在颁发公钥的一方。首先服务端将公钥发布出去,那么客户端是知道公钥的。然后客户端创建一个秘钥,并使用公钥加密,发送给服务端。服务端接收到密文以后通过私钥解密出正确的秘钥;