前言


使用centos6.5系统自带的 netstat,grep,watch等命令,来分析网络连接状态,要求对 TCP 有限状态机的概念有较深入的理解。

同时,这也是除了使用强大的专业第三方协议分析器,如 wireshark 以外,最有效的办法。

写本博文的目的其中之一就是要告诉大家,不使用 wireshark 等第三方工具,自己也能做到一定粒度的网络连接,状态分析,调试等等。


用到的命令总结如下:

watch -n 1 -d 'netstat -antupeo | grep --color 8.8.8.8'
watch -n 1 -d 'netstat -antupeo | grep --color SYN_SENT'
watch -n 1 -d 'netstat -antupeo | grep --color SYN_RECV'
watch -n 1 -d 'netstat -antupeo | grep --color LAST_ACK'
watch -n 1 -d 'netstat -antupeo | grep --color TIME_WAIT'
watch -n 1 -d 'netstat -antupeo | grep --color ESTABLISHED'

watch -n 1 -d 'netstat -antupeo | grep --color FIN_WAIT1'
watch -n 1 -d 'netstat -antupeo | grep --color FIN_WAIT2'

【运维基本功】centos6.5下巧用netstat命令的参数分析TCP连接与关闭过程,图文详解_第1张图片【运维基本功】centos6.5下巧用netstat命令的参数分析TCP连接与关闭过程,图文详解_第2张图片

【运维基本功】centos6.5下巧用netstat命令的参数分析TCP连接与关闭过程,图文详解_第3张图片

【运维基本功】centos6.5下巧用netstat命令的参数分析TCP连接与关闭过程,图文详解_第4张图片

【运维基本功】centos6.5下巧用netstat命令的参数分析TCP连接与关闭过程,图文详解_第5张图片

【运维基本功】centos6.5下巧用netstat命令的参数分析TCP连接与关闭过程,图文详解_第6张图片


补充说明:关于 TIME_WAIT


前面我们提到过,在客户端启动一个长达60秒的 TIME_WAIT计时器,并不会有什么问题;但是如果在一个高并发访问,高负载的服务器上,这就会引发明显的性能问题。

原因在于,在服务器端,每个处于 TCP TIME_WAIT 状态的 UNIX 域套接字(假设服务器端操作系统是 linux,一种 UNIX 的变体)都要占用一个 TCP端口,这些可用的端口数量非常有限。


一般只有从1024开始到65535结束的这6万多个端口。

现在假设第一批属于6万个不同源 IP的 TCP 连接到达服务器,而 web 服务器在最短时间返回带 connection: close 响应头的 HTTP 响应并启动60秒的 TIME_WAIT计时器,这意味着在60秒内,这6万多个端口将不可重用。而假设在这期间又有第二批数万个不同源 IP 的 TCP 连接到达,很明显,此时服务器将无法分配任何可用端口资源来处理这些连接,从而不得不等待60秒才能释放被占用的端口资源。

我们可以认为,在这段时间内,该服务器的可用性与并发能力显得很低下。


不要以为这个描述的场景不会出现。实际上,对于一些大型互联网公司维护的入口网站而言在,在某一时刻经常会遇到连续数万,甚至数十万峰值的并发访问流量。而且这里还没有考虑到遭受分布式拒绝服务***(DDOS)的情况。


或许是有鉴于此,linux 内核就提供几个参数,配置项,用以调优 TCP/ IP 协议堆栈的性能,包括:


1.限制处于 TIME_WAIT 状态的端口总数阀值,一旦超过即刻清零

2.TIME_WAIT 状态端口重用,快速回收

3.增加可打开的套接字描述符(文件描述符的一种)上限

4.用于在一定程度上缓解DDOS***的 TCP SYN cookie 技术


因此,从这些意义上而言, linux 确实比 windows 更适合作为大型站点的底层服务器操作系统。



作为对比,下面提供2张在 windows xp sp3 professional x86 32bit 操作系统下执行 netstat相关命令的截图,仅供参考。



【运维基本功】centos6.5下巧用netstat命令的参数分析TCP连接与关闭过程,图文详解_第7张图片

【运维基本功】centos6.5下巧用netstat命令的参数分析TCP连接与关闭过程,图文详解_第8张图片