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->