TCP使用滑动窗口机制来进行流量控制。

窗口

滑动窗口机制机制的核心在于发送方和接收方都维护一个可变窗口,这个窗口的大小代表了当前可以发送或接收的数据量。

发送窗口:

  • 已发送并已确认的数据: 这部分数据已经安全到达,将被移出窗口。
  • 已发送但未确认的数据: 这部分数据已经发出,但还没有收到接收方的确认。它们在窗口内,需要等待确认。
  • 可发送但尚未发送的数据: 这部分数据是窗口中可以立即发送的。

接收窗口:

  • 已接收并已确认的数据: 已经接收并处理完毕。
  • 可以接收的数据: 这部分是接收方当前可以接收的数据量。这个大小被称为rwnd,接收方会把这个值通过TCP头部的Advertised Window字段告知发送方。

窗口移动

当数据被确认后,窗口就会向前滑动。

  • 发送方: 每当收到一个确认,发送窗口的前沿就会向前移动,从而腾出新的空间来发送更多的数据。
  • 接收方: 每当成功接收并处理完数据,接收窗口的前沿也会向前移动。同时,接收方会把最新的窗口大小(rwnd)告诉发送方。

流量控制

滑动窗口机制确保发送方发送数据的速度不会超过接收方处理数据的速度,避免接收方的缓冲区溢出

发送方的发送窗口大小是由以下两个因素决定的:

  • 接收窗口(rwnd): 接收方告知的窗口大小。
  • 拥塞窗口(cwnd): 发送方基于网络拥塞状况计算出的窗口大小。

发送窗口大小是min(rwnd, cwnd)

Linux中,初始的rwnd大小通常是由系统参数/proc/sys/net/ipv4/tcp_rmem控制的,默认值可能是4096字节(4KB)。这个值可以根据具体需求进行调整,以优化网络性能。