一、https
和 http 的区别,增加了 SSL/TSL 安全层;
1、SSL/TSL 安全层
- TLS 是安全传输协议,是较为新的安全协议,它基于 SSL 发展而来,不通用;
- SSL 安全套接层,旧一点的安全协议;
- TLS 握手启动,是开启 HTTPS 通信的关键;
2、TSL 握手的过程
- 客户端给出协议版本号,随机数(Client random),以及客户端支持的加密方法;
- 服务端确认使用的加密方法,给出数字证书(内含公钥),以及服务器随机数(Server random);
- 客户端校验数字证书,然后生成(Premaster secret),并使用数字证书的公钥,加密此随机数。
- 服务端用自己私钥,解密随机数(Premaster secret);
- 服务端和客户端根据约定方法,用三个随机数,生成(Session Key)。
如下图:
3、DH 算法
定义:用于密钥分配。
因为整个握手阶段都是明文的,所以加密方法,三个随机数中的两个,都可以被获取。所以安全只靠第三个随机数(Premaster secret)。
可以选择 DH 算法,不用传递 Premaster sercet,双方传递各自参数(DH 参数),然后计算次随机数(变成了4个随机数,其中两个 DH 参数生成 Premaster secret)。
4、session key 的恢复
- 每次 https 通讯,不需要每次都进行 TLS 连接。当 TLS 连接成功,会话不中断,session key 是可以持续使用的。
- 当连接中断后,客户端可以用历史的 session ID 发给服务端,如果服务端此 session ID 匹配到了。那么继续使用此 session key 来使用。
- 新版本有 session ticket 方法。用于分布式的服务器进行验证(服务端可以解密此 ticket,得出 session key)。
5、数字签名
数字证书采用了链式签名策略,根证书的公钥存在浏览器中。
- 摘要:一堆信息经过摘要算法,得到的一段 hash 值;
- 优点:摘要相比信息来说会很短,可以很方便判断是否一个信息;
- 缺点:把无限的信息变为了有限的摘要,有可能碰撞;
- 数字签名的产生:摘要经过加密,就是数字签名;
- 第一步,信息变成明文摘要;
- 第二步,明文摘要变成密文摘要,也称为数字签名;
- 第三步,数字签名由是(加密算法+发送方私钥);
- 数字签名的验证:
- 第一步:摘要密文变成摘要明文(通过发送方的公钥+加密算法);
- 第二步:根据收到的信息来计算摘要(哈希算法);
- 第三步:比较是否相同,如果相同,证明数据来自发送方,且无法抵赖;
- 数字签名处理了什么问题?
- 优点:
- 摘要一致,保证了密文没被修改过;
- 验签操作,可以保证发送方无法抵赖;
- 缺点:不能知道这个发送方是不是靠谱的。
- 优点:
6、数字证书:
定义:用数字签名技术,对服务端公钥进行签名后得到的文件(并没有加密)。 目的:为了防止非对称加密通信过程中,被中间人拦截。服务端会将自己的证书传递给客户端。 证书中包括持有者的公钥,证书签名,有效期,加密算法,持有者等。 客户端拿到数字证书后,用内置的 CA 公钥解密证书的签名得到摘要,然后验签(此签名是 CA 私钥签的,所以可以用 CA 公钥验签)。 CA 机构:
- 各级 CA 机构很多,下级的 CA 证书是通过上级 CA 来签名的;
- 最后有一个根 CA 机构;
- 优点:当二级 CA 私钥泄露,也不会影响安全性;
6、https 的优化策略
性能消耗的环节:
- TLS 握手过程;
- 握手成功后对称加密报文;
优化方式:
- 升级 TLS 到1.3版本,减少握手过程;
- 使用椭圆曲线 ECDSA 加密代替 RSA,加速 TLS 过程;
- 会话复用:
- session ID 和 session Key 存服务端的 hash 表中,会花可以复用,不用重复 TLS 握手;
- session Ticket 将会话密钥存在客户端,服务器收到后解密验证有效期,然后使用,这样应对分布式服务器;
- 会话复用过期:
- 为了避免重放攻击,需要给会话秘钥一个过期时间;
- 其他优化:
- https 的计算压力较大,选择算力更强的 CPU;
- 升级 Linux 版本;
- 优化证书版本,ECC 证书比 RSA 体积小很多;
二、HTTP1.1
1、缺点:
- 队头阻塞:
- 当前面一个数据没有传输完成,后面的数据不能传播;
- 它是纯文本协议,所以无法拆分 http 的载荷,只能顺序传播;
- 当前面一个数据没有传输完成,后面的数据不能传播;
- http 头部冗余;
- 无法双向通信;
2、优点:
- 并发请求技术,一个 domain,最多请求6个资源,避免干扰;
- 默认开启长链接,复用同一个 TCP 链接;
- http1.0 也可以手动设置,但是是有时间限制,一般不超过15s;
- cache control 机制
- 更丰富的协议头,Language,Encoding,Type 等。
- HOST 头可以区分不同的域名,因为有很多域名解析在一个 IP 上。
- OPTIONS 方法,用于 CORS 预解析。
3、其他
- HTTP1.1 管道技术
- 幂等请求才能使用,post 可能有依赖关系。
- 请求资源的时候,可以连续发出。但是响应资源的时候,还是会按请求顺序一一返回。
- 目前主流浏览器禁用这个方案,防止高优先级资源被低优先级阻塞。
三、HTTP/2
2015年推出的,新一代应用层协议。
前身:2010年谷歌推出的 SPDY 协议;
1、重要概念
- 流(Stream):已建立的 TCP 连接上的双向字节流,可以承载一个或者多个消息;
- 消息(Message):一个完整的 HTTP 请求或者响应,由一个或多个帧组成;
- 帧(Frame):通信的基本单位;
- 一个 TCP 连接上面可以传递任意数量流;
2、优点
- 二进制分帧
- HTTP1.1 因为传输的主要是脚本语言,所以文本协议传输更加方便。二进制协议可读性差,调试困难,牺牲了执行性能,提高了开发效率。
- 文本格式传输需要借助 ZIP 压缩减少网络带宽,消耗 CPU 资源。
- 在 HTTP 报文中增加了帧的概念,这样传输的数据,就可以混着来,避免 HTTP1.1 中带来的队头阻塞问题;
- HTTP1.1 响应是文本格式,而 HTTP/2 把响应划分成了两个帧,图中的 HEADERS(首部)和DATA(消息负载)是帧的类型。一条HTTP响应,划分成了两个帧来传输,并且采用二进制来编码。
- header frame 和 data frame。也就是头部帧和数据体帧。帧的传输最终在流中进行,流中的帧,头部(header)帧 和 data 帧可以分为多个片段帧,例如data帧即是可以 data = data_1 + data_2 + ... + data_n。
- 多路复用
- 将 HTTP 的载荷拆分为更小的块,也就是数据帧,每个帧都有一个流 ID,通过这个流 ID,可以在一个 TCP 连接上传播多个流;最后用流 ID 拼接起来。
- 头部压缩
- 维护一份相同的静态字典,包含常见的头部名称,以及常见的头部名称和值的组合
- 维护一份相同的动态字典,可以动态的添加内容
- 通过静态 Huffman 编码对传输的首部字段进行编码
- 服务端推送
- 优先级树
- 用做资源的调度控制,管理优先级
- 每个消息都有 31bit 的优先值;
- HTML > CSS > js > 图片
- 用做资源的调度控制,管理优先级
- 更好的拥塞控制策略
- 因为只建立一个 TCP 链接,在最大贷款限制下,可以更快达到理论最大峰值,6个 tcp 连接会相互干扰。
3、缺点
- 流量控制
- 为了防止内存溢出,发送的请求也不会一股脑发出去,会有批量控制发出;
- TCP 的一系列缺点
- 慢启动
- 队头阻塞
- 如果一个包丢了,整个 TCP 就会停下来重传(它不知道这个是哪个 HTTP 发出的数据),如果丢包率高于2%,那么就不如 HTTP1.1,因为它最多可以6个 TCP 连接;
- 一个包丢了,整条 TCP 就得停下来等,HTTP/2 用一个 TCP 连接,受影响很大。
- 拥塞控制
四、HTTP/3
TCP 协议本身的一些特点,束缚了网速的提升。
HTTP/2 的问题在于应用层协议,HTTP/3 放弃了 TCP,采用 udp 协议封装的 QUIC。
QUIC:Quick UDP Internet Connections
QUIC 要求建立加密连接,此加密不止 http 的负载,是指整个数据流。
1、优点:
- 处理了 TCP 阻塞问题
- 可靠:QUIC 改造了 UDP,提供了慢启动,快速重传,拥塞控制,节奏调整等特性;
- 无序,并发的字节流;
- 快速握手;
- 左边 https 完成一次连接需要 3RTT,右侧 QUIC 因为是 UDP 基础上,所以可以实现 0RTT 连接
- 用 TLS1.3 安全协议,新版本安全握手更快;
2、缺点
3、QUIC 基于 UDP 如何保证可靠性
同样按照 的实现,实现了一套慢启动,拥塞控制,快速重传,超时重传等机制。
五、其他网络面试题
1、WebSocket
基于 TCP 协议的一种全双工协议。复合 W3C 标准。
与 HTTP/2 消息推送功能的区别
- 定义不同
- 一个是为了双工通讯,一个是为让浏览器可以提前缓存静态资源。
与 HTTP 不同点:
- WS 用 HTTP 来建立连接,重新定于了一些 header 域;
- Upggrade:websocket
- Connection: Upgrade
- 握手连接时,类型必须为 GET,版本号大于1.1
- 不能使用代理服务器转发,只可以直连;
- nginx 代理服务器需要修改
2、TCP
传输控制协议, FTP,DNS,Telnet,
传输头
- 固定20个字节;
- Sequence Number:包序号,处理网络包乱序;
- ACK Number 标记 ack 的响应码;
- window:滑动窗口描述;
- Flags:
- SYN 建立同步链接
- ACK,应答顺序号
- FIN,PSH,RST,URG (紧急)
- 偏置值
SYN 超时
服务端收到一个 SYN 请求,会发送 SYN-ACK 响应,然后等待客户端发送的ACK,如果超时后,会默认重新发起 SYN-ACK。这个过程最多会重复五次,间隔也会一直递增,1,2,4,16,32共63s,这样容易被触发 SYN Flood 攻击。
拥塞控制
- 慢启动:
- cwnd 拥塞窗口,发送端会有一个初始值;
- 发送方在接收确认之前,指数级扩大窗口,超时之后重新启动,直到阈值(大部分是65536);
- 窗口达到了阈值,那么就会开始线性增长。
- 初始值和系统有段
- 拥塞控制:到达阈值之后,窗口+1线性增长,如果发生拥塞,阈值变为最大值减半,并重新开发慢启动;
- 超时重传:计时器没有按时收到响应,就重传;
- 快速重传:当发送端收到3个 ACK(重复的),立刻重新传递,不等计时器;
- 为何会收到重复的 ACK,1,2,3,4,5个包,当2丢了,3,4,5收到后都会返回2的 ACK 码。
3、UDP
用户数据报协议: 无连接,不可靠,无顺序,无差错控制 DHCP,DNS,SNMP等;
七层网络模型
物理层:传输比特流 0 1
链路层:传输帧,mac地址可以定位发送者和接受者
网络层:建立主机到主机的连接,ip地址去寻找网络(局域网)
传输层:建立端口到端口的连接,0-65535
应用层:直接面相用户的高级协议
一般来说 MTU 最大传输长度为1500字节,所以网络层在发送的时候,会拆分数据。
六、重点概念
1、队头阻塞:Head-of-Line blocking
某个比较慢的对象,阻止了后续对象继续执行。 一个资源完全发送完毕后,另一个资源才可以继续发送。
2、tcp 队头阻塞
定义:
HTTP 的数据对 TCP 来说,没有任何区别,当发生丢包之后,无法正确判断,之前或者之后的包传递完成。所以 HTTP3 将流 ID 从 HTTP 应用层挪到了传输层,有了流 ID,就可以在传输层上判断是否完成。
基本概念
HTTP1.1 有队头阻塞,因为它要完整的发送响应,并不能多路复用; HTTP/2 引入了帧的概念,标识资源属于哪个流,TCP 不负责这些流的区分,直接传递; 如果一个 tcp包 丢失,那么后续包都要等待重传,即使后续包和本包无关,这就是 TCP 的队头阻塞;
处理方法
让传输层有应用层流 ID,不可能去改变 TCP 协议。 创建了 QUIC 协议,他有自己的帧,流 ID 之前存放在 HTTP/2 的数据帧中,现在被下移到传输层的QUIC 帧中。 HTTP/3 从应用层中删除了流的概念,他的数据帧没有流 ID,为了支持这个新的传输层协议,创建了新的 HTTP/3 协议。
七、参考链接:
https:
www.ruanyifeng.com/blog/2014/0… developer.51cto.com/art/202103/… zhuanlan.zhihu.com/p/26559480
http3:
cloud.tencent.com/developer/a… zhuanlan.zhihu.com/p/330300133
其他
zhuanlan.zhihu.com/p/32059190 coolshell.cn/articles/19… www.cnblogs.com/lsgxeva/p/8…