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 生成会话密钥。之后进行对称加密的数据传输。