TCP FIN_WAIT_2探究(1)
tcp close简单来说只是四次挥手,但在四次挥手过程中,如果其中一端断电、系统崩溃,可能会引发另一端端口长时间释放不了而占用系统资源,下面我会针对tcp FIN_WAIT_2做一些说明:
与fin_wait_2超时时间相关的参数有struct tcp_sock的linger2变量和sysctl_tcp_fin_timeout变量,linger2变量声明如下所示:
struct tcp_sock {
int linger2;
};
linger2通过setsockopt的SOL_TCP,TCP_LINGER2设置,单位是jiffies;setsockopt设置TCP_LINGER2传入的val参数单位是秒,通过HZ x val转换成jiffies赋值给linger2;在设置linger2时,如果传入的val小于0,则置linger2为-1;如果传入的val值比tcp_fin_timeout大,则置linger2为0;如果上述两点都不满足,则置linger2为val x HZ;
sysctl_tcp_fin_timeout在/proc/sys/net/ipv4下有对应的可修改项:tcp_fin_timeout,tcp_fin_timeout通过proc接口读的是以秒为单位,在内核对应的sysctl_tcp_fin_timeout变量以jiffies为单位,在net/ipv4/sysctl_net_ipv4.c文件中可见sysctl_tcp_fin_timeout的proc_handler是proc_dointvec_jiffies,所以proc接口会对其有个转换;
tcp在fin_wait_2状态超过linger2对应的时间并且tcp是SOCK_DEAD状态,会给对端发送reset并且释放当前端口&