44、TCP状态处理与Netlink套接字详解

44、TCP状态处理与Netlink套接字详解

TCP状态处理与Netlink套接字详解

1. TCP状态处理

在TCP通信中,状态处理是确保数据可靠传输的关键。当考虑是否能从恢复状态撤销时,下一步就是退出恢复状态。

1.1 退出恢复状态
  • Reno实现:要退出恢复状态,需要对超过tp → high_seq的内容进行确认(ACK)。这样做是为了避免在对tp → high_seq以下的段进行重传产生重复ACK时,进入错误的快速恢复状态。
  • SACK/DSACK实现:对于每个重复ACK会生成DSACK,因此只要tp → high_seq被确认,就可以退出恢复状态。若无法退出恢复状态,则调用tcp_moderate_cwnd()来调整拥塞窗口,减缓数据传输速率,直到收到超过tp → high_seq的ACK。

以下是tcp_fastretrans_alert()部分代码示例:

1527 if (tp->ca_state == TCP_CA_Open) { 1528 BUG_TRAP(tp->retrans_out == 0); 1529 tp->retrans_stamp = 0; 1530 } else if (!before(tp->