在tcp文件传输中,以下状态之间的差异何时?
TCP_CA_Recovery和TCP_CA_Loss?!!
什么时候传输状态设置为这些值?数据包丢失是导致恢复,丢失还是两者都没有?
由于
答案 0 :(得分:2)
TL; DR - 检测到重复的ack或选择性ack时达到恢复。数据包丢失会导致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实现'感知'链路拥塞后,所有异常(非开放)状态都是恢复步骤。
TCP_CA_Open
- 正常的ACK处理状态(正常调节拥塞窗口)。
TCP_CA_Disorder
- 检测到/接收到重复的ACK(DUPACK)或选择性确认(SACKS)。
TCP_CA_CWR
- 拥塞窗口减少状态。 Linux TCP堆栈开始在此状态下减少拥塞窗口。此状态可能会被TCP_CA_Recovery
或TCP_CA_Loss
TCP_CA_Recovery
- 在开始重新发送数据包时输入状态。
发件人一直处于恢复状态,直到所有段 输入恢复状态成功时未完成 确认。在此之后,发件人返回打开状态。一个 重传超时也可以中断恢复状态。
(下文提到的来源)。
TCP_CA_Loss
- 当TCP RTO(重新传输超时)到期时输入状态。