TCP连接状态图解析

TCP状态图,展示的是TCP从连接建立到连接关闭的整个生命周期,TCP的状态转换以及处理流程。TCP面向的是端口,Linux里面可以通过netstat -a命令查看连接状态。笔者遇到Tomcat生成大CLOSE_WAIT状态的连接问题,故想了解一下TCP的连接机制。

TCP状态图纵览

TCP连接本质是点对点的,理论上无所谓服务器,客户端。不过总得有一个进程等待在那里,对外提供连接的服务,就称之为服务器。

下图是来源于Wikipedia的状态图,蓝线表示服务器的运行线路,棕色描述客户端。

TCP连接状态图解析_第1张图片

总的来说,状态共4个。连接中、已连接、断开连接中、已断开。由于客户端,服务器角色,以及连接和断开的多步过程,使得状态图有点复杂。下面尝试拆开来看看。

TCP建立连接过程

TCP连接,三步握手,大家应该都很熟悉。

TCP连接状态图解析_第2张图片

  1. 客户端发出SYN连接请求, Sequence设置为一个随机数A。
  2. 服务端回应SYN-ACK,ACK内容设置为A+1,Sequence设置为一个随机数B。
  3. 客户端回应ACK,ACK内容设置为B+1,Sequence设置为A+1。

TCP关闭连接过程

TCP关闭连接,4步握手。

TCP连接状态图解析_第3张图片

过程很简单,不再详述。值得注意的是主动发起关闭连接的一方,4步完成之
后,会等待一个超时时间再真正的关闭。

Server端典型状态图

TCP连接状态图解析_第4张图片

文章开始提到的Tomcat服务器产生大量CLOSE_WAIT的问题,是由于Tomcat没有主动发送最后的FIN消息。进一步追踪,发现Client端连接HTTP的Header其中一个为是,Connection: keep-alive,造成服务器未正常关闭连接。

Client端典型状态图

TCP连接状态图解析_第5张图片

示例

TCP连接状态图解析_第6张图片

参考资料

  • Wikipedia
  • 《Computer Networks》

你可能感兴趣的:(Network,tcp,连接,状态图,tomcat)