方法1: connect then close
这种情况,上层应用会感知到一个连接的进入,并准备开始处理,然后便因为client端close而中止
方法2: send syn then receive syn-ack then send reset
这样的话,远端根本不需要完成一个tcp连接,也不会被上层应用感知到;这样需要更加底层的socket(raw socket)编程
方法3: send syn then receive syn-ack then send ack then send reset
2015-12-17 更新:
初写这篇文章时,阿里金融云SLB的tcp健康检查使用的是方法1,也是因此才写的该文章;今天发现阿里金融云SLB的tcp健康检查使用的是方法2,于是在此更新一下该文章。
2016-11-10 更新:
发现阿里金融云的SLB的tcp健康检查又不是方法2了, 阿里云文档上写的是方法2,实际上不是方法2,而是方法3,方法3更坑爹,有些web server会报client异常关闭连接
2018-8-2 更新:
SLB的HTTP模式下,健康检查允许关闭, TCP模式下不允许关闭健康检查;虽然允许设置检查其他端口来避免健康检查对某些服务的骚扰,但依然觉得很别扭;
2018-11-09更新:
对于HTTP服务,仅检查端口存活不大严格,如果进程假死,依然无法提供服务,但是端口是活的,所以,对于HTTP服务,通过HTTP请求来检查还是比较合理的,为了避免不必要的访问日志,可以对这种请求不记录访问日志
nmap 的半连接端口检查:
1 |
nmap -sS -p 22 127.0.0.1 |