TCP 状态 TCP_CA_Recovery 与 TCP_CA_Loss

TCP states TCP_CA_Recovery vs TCP_CA_Loss

在一次tcp文件传输中,以下几种状态的区别是什么时候?

TCP_CA_Recovery 和 TCP_CA_Loss ?!!

传输状态何时设置为这些值?数据包丢失会导致恢复、丢失还是两者都不会?

谢谢

TL;DR - 当检测到重复确认或选择性确认时达到恢复。数据包丢失导致 TCP_CA_Recovery 状态,如果达到重传超时,则可能导致 TCP_CA_Loss

这两个标志都是Linux中TCP拥塞避免实现的5种状态之一。

enum tcp_ca_state
{
    TCP_CA_Open = 0,
#define TCPF_CA_Open    (1<<TCP_CA_Open)
    TCP_CA_Disorder = 1,
#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
    TCP_CA_CWR = 2,
#define TCPF_CA_CWR (1<<TCP_CA_CWR)
    TCP_CA_Recovery = 3,
#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
    TCP_CA_Loss = 4
#define TCPF_CA_Loss    (1<<TCP_CA_Loss)
};

here

因此所有的异常(非开放)状态都是TCP实现'senses'后link拥塞的恢复步骤。

  • TCP_CA_Open - ACK处理的正常状态(正常调节拥塞window)。

  • TCP_CA_Disorder - 重复 ACK (DUPACK) 或选择性确认 (SACKS) detected/received.

  • TCP_CA_CWR - 拥塞 window 减少状态。 Linux TCP 堆栈在此状态下开始减少拥塞window。这个状态可以被TCP_CA_RecoveryTCP_CA_Loss

  • 打断
  • TCP_CA_Recovery - 开始重传数据包时进入状态。

The sender stays in the Recovery state until all of the segments outstanding when the Recovery state was entered are successfully acknowledged. After this the sender goes back to the Open state. A retransmission timeout can also interrupt the Recovery state.

(来源如下)。

  • TCP_CA_Loss - 当 TCP RTO(重传超时)到期时进入的状态。

你可以阅读更多关于它的 here. And also this 书。