前言
使用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'
补充说明:关于 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相关命令的截图,仅供参考。