计算机网络-CN408

知识重点

1.拥塞机制和流量控制

流量控制:

防止发送方发送数据过快,导致接收方来不及处理,从而造成数据丢失。他是在点对点通信的时候,就是我们端口之间连接的地方。

  • 滑动窗口(Sliding Window):接收方通过 TCP 报文首部的“窗口大小”字段,告知发送方自己当前的处理能力(接收缓冲区剩余空间)。
  • 接收窗口(rwnd):接收方根据自己的接收能力动态调整窗口大小,发送方根据接收方通告的窗口大小调整发送速率,确保发送速率不超过接收方的处理能力。
  • 零窗口探测(Zero Window Probe):如果接收方通告窗口大小为 0,发送方会停止发送数据。为了防止死锁(接收方一直没有机会发送非零窗口通告),发送方会定期发送窗口探测报文,询问接收方的窗口大小。

底层实现:

  • TCP 协议栈会在接收到数据时,根据接收缓冲区的剩余空间更新 rwnd 的值。
  • 发送方发送数据时,会根据 rwnd 的值以及拥塞窗口(cwnd)来动态调整发送速率。
  • TCP 协议栈实现了零窗口探测机制,定期发送探测报文。

拥塞机制:

防止发送方发送数据过多,导致网络拥堵,从而降低整个网络的传输效率。全局网络,考虑整个网络的拥塞情况。

  • 拥塞窗口(cwnd):发送方维护一个拥塞窗口,表示当前网络允许发送的数据量。
  • 慢启动(Slow Start):连接建立初期,cwnd 从一个较小的值开始,每次收到确认(ACK)后,cwnd 指数增长,直到达到慢启动阈值(ssthresh)。
  • 拥塞避免(Congestion Avoidance):当 cwnd 达到 ssthresh 后,进入拥塞避免阶段,每次收到确认后,cwnd 线性增长,避免一下子发送过多数据导致拥塞。

当拥塞发生之后我们会执行:

  • 超时重传

    :如果发送方在一定时间内没有收到 ACK,则认为网络发生拥塞,采取以下措施:

    • ssthresh 设置为 cwnd / 2
    • cwnd 设置为 1(回到慢启动阶段)。
  • 快速重传(Fast Retransmit)

    :如果发送方连续收到 3 个重复的 ACK,则认为发生丢包,立即重传丢失的报文,并采取以下措施:

    • ssthresh 设置为 cwnd / 2
    • cwnd 设置为 ssthresh + 3
  • 快速恢复(Fast Recovery):重传丢失报文后,进入快速恢复阶段,每次收到一个 ACK,cwnd 增加 1,直到收到新的数据 ACK,然后进入拥塞避免阶段。

源码实现:

  • TCP 协议栈实现了上述拥塞控制算法(慢启动、拥塞避免、快速重传、快速恢复)。
  • 协议栈会根据网络反馈(ACK、超时、重复 ACK)动态调整 cwndssthresh 的值。
  • TCP 协议栈还会根据路径 MTU 发现(Path MTU Discovery)来调整最大报文段长度(MSS),避免 IP 分片。

2.TLS四次握手

TLS(Transport Layer Security)协议用于在应用层和传输层之间提供安全的通信。TLS 握手协议用于建立安全的 TLS 连接。 以下描述TLS 1.2的四次握手。

流程:

  • Client Hello:客户端发送一个 Client Hello 消息到服务器,其中包含客户端支持的 TLS 版本、加密算法套件列表、随机数等信息。
  • Server Hello:服务器收到 Client Hello 消息后,选择一个 TLS 版本和加密算法套件,回复一个 Server Hello 消息,其中包含服务器选择的 TLS 版本、加密算法套件、随机数等信息。服务器还发送 Certificate 消息,包含服务器的证书。
  • Server Key Exchange:服务器发送 Server Key Exchange 消息,包含用于密钥交换的信息,例如 RSA 公钥或者 Diffie-Hellman 参数。如果服务器证书包含了足够的密钥交换信息,则可以省略此消息。
  • Client Key Exchange:客户端发送 Client Key Exchange 消息,包含用于密钥交换的信息,例如预主密钥(Pre-Master Secret)。
  • Change Cipher Spec:客户端发送 Change Cipher Spec 消息,通知服务器后续的报文将使用加密算法进行加密。

前面是确认加密,后面是开始进行消息交换得握手。也是基于TCP的三次握手

  • Finished:客户端发送 Finished 消息,对之前的握手消息进行加密和 MAC 运算,用于验证握手的完整性。
  • Change Cipher Spec:服务器发送 Change Cipher Spec 消息,通知客户端后续的报文将使用加密算法进行加密。
  • Finished:服务器发送 Finished 消息,对之前的握手消息进行加密和 MAC 运算,用于验证握手的完整性。

在TLS 1.3中, 优化了握手过程,提升了性能和安全性, 废除了不安全的加密算法,采用更安全的密钥交换算法。 TLS 1.3 握手过程减少到只需要三步。