- 论坛徽章:
- 0
|
在tcp_rcv_state_process中,对于TCP_FIN_WAIT1状态的处理有这么一段代码:- tmo = tcp_fin_time(sk);
- if (tmo > TCP_TIMEWAIT_LEN) {
- inet_csk_reset_keepalive_timer(sk, tmo - TCP_TIMEWAIT_LEN);
- } else if (th->fin || sock_owned_by_user(sk)) {
- /* Bad case. We could lose such FIN otherwise.
- * It is not a big problem, but it looks confusing
- * and not so rare event. We still can lose it now,
- * if it spins in bh_lock_sock(), but it is really
- * marginal case.
- */
- inet_csk_reset_keepalive_timer(sk, tmo);
- } else {
- tcp_time_wait(sk, TCP_FIN_WAIT2, tmo);
- goto discard;
- }
复制代码 当计算出来的tmo大于60s时,会先启动keepalive定时器,超时时间为(tmo-60s),
在keepalive定时器处理函数中是这样处理的:- if (sk->sk_state == TCP_FIN_WAIT2 && sock_flag(sk, SOCK_DEAD)) {
- if (tp->linger2 >= 0) {
- const int tmo = tcp_fin_time(sk) - TCP_TIMEWAIT_LEN;
- if (tmo > 0) {
- tcp_time_wait(sk, TCP_FIN_WAIT2, tmo);
- goto out;
- }
- }
- tcp_send_active_reset(sk, GFP_ATOMIC);
- goto death;
- }
复制代码 不明白这里tcp_time_wait设置定时器为啥又一次设置为tmo-60s。我总觉得应该是设置为60s
举两个例子,首先假设在第一段代码中处理的数据包没有fin标志,
连接1.tcp_fin_time返回的tmo是70s,那么在第一段代码中设置keepalive定时器70-60=10s,10s后在keepalive_timer里面进入time_wait状态,且time_wait定时器又设置为10s,10s后超时删除sock。总存活时间20s
连接2.tcp_fin_time返回的tmo是50s,那么调用tcp_time_wait且设置time_wait定时器50s,50s后删除连接。总存活时间50s
这不是很奇怪吗?连接1计算的tmo大于连接2,并且报文交互顺序也一样,但是却比连接2早结束。是我哪里理解错了?
多谢各位啦 |
|