3.TCP连接状态

  socket大概包含10个连接状态。我们平常工作中遇到的,除了针对SYN的拒绝服务攻击,如果有异常,大概率是TIME_WAIT和CLOSE_WAIT的问题。

TIME_WAIT一般通过优化内核参数能够解决

CLOSE_WAIT一般是由于程序编写不合理造成的,更应该引起开发者注意。

TIME_WAIT

TIME_WAIT 是主动关闭连接的一方保持的状态,像 nginx、爬虫服务器,经常发生大量处于time_wait状态的连接。TCP 一般在主动关闭连接后,会等待 2MS,然后彻底关闭连接。由于 HTTP 使用了 TCP 协议,所以在这些频繁开关连接的服务器上,就积压了非常多的 TIME_WAIT 状态连接。

通过ss -s命令查看,可以看到timewait数量。

sysctl 命令可以设置这些参数,如果想要重启生效的话,加入/etc/sysctl.conf文件中。

# 修改阈值
net.ipv4.tcp_max_tw_buckets = 50000

# 表示开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_tw_reuse = 1

#启用timewait 快速回收。这个一定要开启,默认是关闭的。
net.ipv4.tcp_tw_recycle= 1

# 修改系統默认的TIMEOUT时间,默认是60s
net.ipv4.tcp_fin_timeout = 10
测试参数的话,可以使用 sysctl -w net.ipv4.tcp_tw_reuse = 1 这样的命令。如果是写入进文件的,则使用sysctl -p生效。

CLOSE_WAIT

CLOSE_WAIT一般是由于对端主动关闭,而我方没有正确处理的原因引起的。说白了,就是程序写的有问题,属于危害比较大的一种。

我们拿”csdn 谐音太郎”遇到的一个典型案例来说明。

 

代码是使用HttpClient的一个使用片段。在这段代码里,通过调用in.close()来进行连接资源的清理。

但可惜的是,代码中有一个判断:非200状态的连接直接返回null。在这种情况下,in连赋值的机会都没有,

当然也就无法关闭,然后就发生了连接泄漏。所以,HttpClient的正确关闭方式是使用其api:abort()

 

 

 



posted @ 2020-08-03 09:42  天涯160  阅读(140)  评论(0)    收藏  举报