TCP定时器 之 FIN_WAIT_2定时器

当TCP主动关闭一端调用了close()来执行连接的完全关闭时会执行以下流程,本端发送FIN给对端,对端回复ACK,本端进入FIN_WAIT_2状态,此时只有对端发送了FIN,本端才会进入TIME_WAIT状态,为了防止对端不发送关闭连接的FIN包给本端,将会在进入FIN_WAIT_2状态时,设置一个FIN_WAIT_2定时器,如果该连接超过一定时限,则进入CLOSE状态;

注意:上述是针对close调用完全关闭连接的情况,shutdown执行半关闭不会启动FIN_WAIT_2定时器;

启动定时器:

close系统调用关闭连接最终会调用到tcp_close函数,其中当状态为TCP_FIN_WAIT2时,如果有设置该状态等待时间linger2,且等待时间大于TCP_TIMEWAIT_LEN则启动FIN_WAIT_2定时器;

 

定时器回调函数:

定时器超时会调用tcp_keepalive_timer处理函数,当连接处于FIN_WAIT_2状态,且socket即将关闭,则继续判断FIN等待时间,若有剩余时间,则进入tcp_time_wait函数处理;否则发送rst,并关闭连接;

注:因函数是保活定时器和WAIT_2共用的,我们省略了部分WAIT_2无关代码;

 

tcp_time_wait后续补充;

本文链接:TCP定时器 之 FIN_WAIT_2定时器

转载声明:转载请注明来源:Linux TCP/IP Stack,谢谢!


发表评论

电子邮件地址不会被公开。 必填项已用*标注