TCP 协议之Flow control、Congestion control

TCP协议是一个点对点的传输层协议,基于不可靠的环境(IP)提供可靠的服务。Flow control 确保了发送方的传输速率不超过接收方的容量,而Congestion control 则保证了TCP传输的高效。

Receiver Buffer & Sender Buffer

  1. 当 Receiver 收到 data,最开始时 data 是被缓存起来供应用层调用的。


    tcp-buffer.png

当 Receiver 收到 sender 传送的数据,最开始是把它存在 Receiver 的 buffer 中的。而 buffer 的剩余容量就是 Window Size,它决定了 sender 能送过来的数据量。

tcp-buffer-1.png
  1. 一个用户应用程序向另一个用户程序发送消息的过程:

    • 首先,将数据存储在操作系统内核中的 sender buffer 中;
    • 当 sender buffer 中的数据量超过MSS,或者发送时间到期,TCP会传输数据;
    • Receiver 会将收到的数据存放在 receiver buffer 中;
    • Receiver 的应用层通过 read() 函数从 buffer 中读取收到的数据。
  2. 为什么 sender 和 receiver 需要 buffer?

    • sender 发出去的 packet 在没收到 receiver 的 Ack 前,需要缓存起来;如果丢包或者 timeout, 则从 buffer 中重发这个 packet。
    • 因为网络的不确定性(Router路线),receiver 收到的 packet 不一定会按顺序排列,所以需要缓存起来再做处理。

RTT - Round Trip Time

一个数据包从发出去到回来的时间。

Window size

不需要等待 receiver ack 的情况下,可以传送的数据量。以 byte 为单位,比如:window size 为 5000, 则最多可传送 5000 byte 的数据量而不需要等待ack。

MSS - maximum segment size

以字节数定义数据的 sender 与 receiver 所能接受的最大数据量(byte)。

Ack - acknowledgement

用于确认 sender 传输的 packet 是否被 Receiver 接收,是一条带编号的确认消息。

TCP Flow control

receiver 决定 sender 送出来的量,receiver 主导。
因为TCP sender 送出去的 packet不一定会按顺序被 receiver 接受,所以 receiver 需要准备 buffer 把没按顺序传过来的packet存起来,receiver告诉sender 自己的 buffer 多大,sender 就可以送多少数据量。
在TCP segment 结构体(共32 bit)中,有一个Receive window(占16 bit)字段。Flow control 通过给 Receive window 赋值来控制 sender 所能传输的最大数据量。

TCP Congestion control

  1. 为什么会拥塞?
    • sender 发送太多的 packet 量,或者送的太快而网络处理不过来。
  2. 拥塞的后果:
    • 丢包
    • 长时间的延迟

TCP可以自己感知网络传输是否拥塞,同时根据拥塞程度调整传输速度,保证传输的高效。

  1. sender 感知 congestion 的方式:

    • 掉包
      1. timeout
      2. 收到3次重复的 Acks
    • TCP降低传输rate(减少congestion window)
  2. 调节发送速率的方法:

    • AIMD

      1. Additive increase:每过一个RTT时间增加 Congestion window,大小为 1 maximum segment size(MSS)
      2. Multiplicative decrease:只要发现掉 packet, congestion window 就降一半
    • Slow start
      TCP连接建立起来之后,sender 一开始传送的量很少,然后再慢慢增加传输的量。比如说一开始 sender 只发1个 packet, 等这个 packet 被 Ack 后,我们再发2个 packet ,等这2个 packet 被 Ack 后再发4个 packet,以此类推,慢慢增加发包的数量,这就是慢启动。

image.png

  1. 发生拥塞时的处理:

    • 收到3次重复 Acks
      threshold 降一半,每过一个RTT时间增加1MSS
    • timeout
      congestion window 降为1MSS。
      慢启动,达到一个临界值(threshold)后,开始线性增长(AIMD)。
    image.png

参考资料:

Flow control and Congestion control

你可能感兴趣的:(TCP 协议之Flow control、Congestion control)