一、减缓TCP发送概述
  • 一个待解决的问题是,如何减缓TCP发送
  • 在前面“TCP流量控制”中已经提到,根据接收方剩余缓存空间大小,在TCP头部设置了通知窗口大小字段,该数值是TCP发送方调节发送速率的依据。进一步说,当接收速率或网络传输速率过慢时,我们需要降低发送速率
二、拥塞窗口(cwnd)
  • 为实现上述操作,基于对网络传输能力的估计,可以在发送端引入一个窗口控制变量,确保发送窗口大小不超过接收端接收能力和网络传输能力,即TCP发送端的发送速率等于接收速率和传输速率两者中较小值
  • 反映网络传输能力的变量称为拥塞窗口(congestion windows),记作cwnd
三、发送端实际窗口W
  • 因此,发送端实际(可用)窗口W,就是接收端通知窗口awnd和拥塞窗口cwnd的较小者:

TCP/IP卷一:85---TCP拥塞控制之(减缓TCP发送、拥塞窗口(cwnd)、包守恒、ACK时钟)_包守恒

  • 根据上述等式可得:
    • TCP发送端发送的数据中,还没有收到ACK回复的数据量不能多于W(以包或字节为单位)。这种已经发出但还未经确认的数据量大小有时称为“在外数据值”,它总是小于等于W
    • 通常,W可以以包或字节为单位

TCP/IP卷一:85---TCP拥塞控制之(减缓TCP发送、拥塞窗口(cwnd)、包守恒、ACK时钟)_减缓TCP发送_02

  • 这看似合乎逻辑,但实际并非如此。因为网络和接收端状况会随时间变化,相应地,awnd和cwnd的数值也会随之改变。另外,由于缺少显示拥塞的明确信号(参见前述章节),TCP发送方无法直接获得cwnd的“准确”值。因此,变量W、 cwnd、 awnd的值都要根据经验设定并需动态调节

W值的设定

  • 此外,如前所述,W的值不能过大或过小——我们希望其接近带宽延迟积(Bandwidth-Delay Product,BDP),也称作最佳窗口大小(optimal window size)
  • W反映网络中可存储的待发送数据量大小,其计算值等于RTT与链路中最小通行速率(即发送端与接收端传输路径中的“瓶颈” )的乘积
  • 通常的策略是,为便网络资源得到高效利用,应保证在网络中传输的数据量达到BDP。但若在传输数据值远高于BDP时,会引人不必要的延时(见后面的“缓冲区膨胀”),所以这也是不可取的。在网络中如何确定一个连接的BDP是难点,需要考虑诸多因素,如路由、时延、统计复用(即共用传输资源)水平随时间的变化性等

TCP/IP卷一:85---TCP拥塞控制之(减缓TCP发送、拥塞窗口(cwnd)、包守恒、ACK时钟)_包守恒_03

四、cwnd值的初始化
  • 当一个新的TCP连接建立之初,还无法获知可用的传输资源,所以cwnd的初始值也无法确定。 (也有一些例外,如有些系统的缓存容量是预先设定的,在“TCP超时与重传”中我们称其为目的度量( destination metric)) TCP通过与接收端交换一个数据包就能获得awnd的值,不需要任何明确的信号
  • 显而易见,获得cwnd最佳值的唯一方法是以越来越快的速率不断发送数据,直到出现数据包丢失(或网络拥塞)为止。这时考虑立即以可用的最大速率发送(受awnd的限制),或是慢速启动发送
  • 由于多个TCP连接共享一个网络传输路径,以全速启动会影响其他连接的传输性能,所以通常会有特定的算法来避免过快启动,直至稳定传输后才会运行相应的其他算法
五、包守恒与ACK时钟
  • TCP发送方的拥塞控制操作是由ACK的接收来驱动或“控制”的。当TCP传输处于稳定阶段(cwnd取合适值),接收到ACK回复表明发送的数据包已被成功接收,因此可以继续发送操作。据此推理,稳定状态下的TCP拥塞行为,实际是试图使在网络传输路径上的数据包守恒(参见下图)
  • 这里的守恒是从物理学意义上而言的一某个量(如动量、能量) 进入一个系统不会凭空消失或出现,而是以某种表现形式继续存在

TCP/IP卷一:85---TCP拥塞控制之(减缓TCP发送、拥塞窗口(cwnd)、包守恒、ACK时钟)_减缓TCP发送_04

  • 如上图所示:
    • 上下两条通道形似“漏斗”
    • 发送方发送的(较大)数据包经上通道传输给接收方
    • 相对较狭窄部分表示传输较慢的连接链路,数据包需要适时地被“伸展”
    • 两端部分(位于发送方和接收方)是数据包发送前和接收后的队列
    • 下通道传输相应ACK数据包
  • 在高效传输的稳定状态下,上下通道都不会出现包堵塞的情况,而且在上通道中也不会有较大传输间隔。注意到发送方接收到一个ACK就表明可向上图中的上层通道发送一个数据包(即网络中可容纳另一个包)。这种由一个ACK到达(称作ACK时钟)触发一个新数据包传输的关系称为自同步