7.6 TIME_WAIT状态处理

当TCP连接在特定条件下进入TIME_WAIT状态,如close系统调用、收到FIN等,会保持2MSL时间以防止旧连接报文影响新连接,并确保对端能释放资源。TIME_WAIT状态可通过孤儿sock接收SYN、RST或新的SYN请求提前结束。在此期间,TCP处理旧数据包,确保其在网络中消失,避免影响新连接。两端中只有一端处于TIME_WAIT,另一端可快速释放连接。
摘要由CSDN通过智能技术生成

        TCP在以下情况下可能会进入TIME_WAIT状态:

(1)在TCP_FIN_WAIT2状态时调用close系统调用时

(2)TCP_FIN_WAIT2收到对端的FIN时(一定会进入TIME_WAIT状态);

(3)成为orphan sock并且在TCP_FIN_WAIT1状态下收到ACK时;

(4)TCP_CLOSING状态下收到ACK时(一定会进入TIME_WAIT状态);

(5)FIN_WAIT2定时器超时时。

        处于TIME_WAIT状态的TCP连接会保持2MSL(Maximum Segment Lifetime)时间,即2倍的最大生存时间。在这段时间内,相同源|目的IP和源|目的端口的TCP连接无法建立。这样做的目的主要有两个:1)禁止旧连接的报文危害新连接;2)收到对端重传的FIN时回应ACK,使对端尽快释放连接资源。

        进入TIME_WAIT状态函数为tcp_time_wait:

266 void tcp_time_wait(struct sock *sk, int state, int timeo)
267 {
268     struct inet_timewait_sock *tw = NULL;
269     const struct inet_connection_sock *icsk = inet_csk(sk);
270     const struct tcp_sock *tp = tcp_sk(sk);
271     bool recycle_ok = false;
272
273     if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_stamp) //设置了快速回收tw sock并且开启了时间戳
274         recycle_ok = tcp_remember_stamp(sk);//记录时间戳信息到对端IP地址对应的信息管理块中;如果找到信息管理块,则recycle_ok为1
275
276     if (tcp_death_row.tw_count < tcp_death_row.sysctl_max_tw_buckets) //正在使用的tw sock的数量未超过限制
277         tw = inet_twsk_alloc(sk, state); //申请tw sock
278
279     if (tw != NULL) {
280         struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw);
281         const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1);  //rto = 3.5 * icsk->icsk_rto
282         struct inet_sock *inet = inet_sk(sk);
283         //将socket中的信息记录到tw sock中
284         tw->tw_transparent  = inet->transparent;
285         tw->tw_rcv_wscale   = tp->rx_opt.rcv_wscale;
286         tcptw->tw_rcv_nxt   = tp->rcv_nxt;
287         tcptw->tw_snd_nxt   = tp->snd_nxt;
288         tcptw->tw_rcv_wnd   = tcp_receive_window(t
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值