TCP 的流量控制
所谓流量控制就是:让发送方的发送速率不要太快,要让接收方来得及接收。
TCP 是利用滑动窗口实现流量控制:
接收端维护一个接收缓冲区;
每接收到一段数据,缓存占用增加;
每被应用程序读取一部分数据,缓存占用减少;
每发送一个 ACK,都包含当前可用的窗口大小 rwnd。
特殊情况:如果 rwnd=0,发送端必须停止发送数据。此时发送端会定期发送零窗口探测包(仅携带 1 字节的数据)来查看窗口是否恢复。
TCP 的拥塞控制
核心思想是:根据网络反馈(ACK、丢包、超时),动态调整发送窗口 cwnd
的大小。
拥塞控制的四个阶段:
慢开始
初始时拥塞窗口大小
cwnd = 1
(单位通常是 MSS);每收到一个 ACK,拥塞窗口指数级增长(× 2);
当
cwnd >= ssthresh
(慢开始门限)时,进入 拥塞避免 阶段。
拥塞避免
拥塞窗口 cwnd 按照线性规律增长(每受到一个 ACK,+ 1);
避免增长过快引发拥塞。
超时重传
如果发生丢包,触发超时重传,说明网络环境更糟糕;
调整慢开始门限 ssthresh = cwnd / 2
拥塞窗口 cwnd = 1,重新进入慢开始。
快恢复
如果收到 3 个重复的 ACK,说明发生丢包但网络仍有一定传输能力。
调整慢开始门限 ssthresh = cwnd / 2
拥塞窗口 cwnd = ssthresh,进入拥塞避免阶段,这样可以减少性能损失。
HTTPS 的加密流程
HTTP 的数据是明文传输,容易被窃听、篡改。HTTPS 使用 TLS 对数据进行加密,防止窃听、篡改和伪造。
使用 TLS 协议(传输加密协议)对数据进行对称加密。具体加密流程如如下:
首先是客户端与服务端进行 TCP 三次握手建立连接;
客户端发送:Client Hello 请求,包含客户端支持的 TLS 版本、支持的加密算法、随机数 client_random;
服务端返回:Server Hello 请求,从中选择合适的 TLS 版本、加密算法、随机数 server_random 以及网站的证书发送给客户端;
客户端收到证书后:
从操作系统中内置的 CA 公钥对证书进行验证,如果证书被篡改则中断连接;
验证成功,从证书中提取服务端的 Server 公钥,生成一个随机的 48 字节预主密钥(pre-master key),使用公钥加密,发送给服务端。
服务端收到加密后的数据,通过私钥解密得到预主密钥;
双方通过 预主密钥 + client_random + server_random 生成会话密钥。之后进行对称加密的数据传输。