TCP连接状态图解析

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

TCP状态图纵览

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

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

TCP连接状态图

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

TCP建立连接过程

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

TCP握手过程

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

TCP关闭连接过程

TCP关闭连接,4步握手。

TCP关闭连

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

Server端典型状态图

server端状态图

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

Client端典型状态图

client端状态图

示例

TCP连接示例

参考资料

推荐文章

如果json值=NULL,RESTKIT内部映射将失败

如果json值=NULL,RESTKIT内部映射将失败

推荐文章

PHP---如果(!会话已注册,已弃用?

PHP---如果(!会话已注册,已弃用?

推荐文章

如何使用活动选项卡上的一个快捷键?

如何使用活动选项卡上的一个快捷键?

推荐文章

Chrome扩展弹出窗口中的表单帖子不执行任何操作

Chrome扩展弹出窗口中的表单帖子不执行任何操作

推荐文章

绘图格式文本

绘图格式文本

推荐文章

PyQT中的简单分层列表

PyQT中的简单分层列表

推荐文章

如何设置数组中默认的多个选择选项

如何设置数组中默认的多个选择选项

推荐文章

Raphael+svgweb+svg核心

Raphael+svgweb+svg核心

推荐文章

基于在Android中单击的按钮的微调器选项

基于在Android中单击的按钮的微调器选项

推荐文章

如何通过减少冗余活动来加快学习android编程的速度?

如何通过减少冗余活动来加快学习android编程的速度?

推荐文章

将JRuby/Rails部署到Glassfish:捆绑器:模块

将JRuby/Rails部署到Glassfish:捆绑器:模块

推荐文章

如何通过Make命令行将-g3标志传递给gcc?

如何通过Make命令行将-g3标志传递给gcc?

推荐文章

是什么导致nomethodror'\u view\u paths'异常?

是什么导致nomethodror'\u view\u paths'异常?

推荐文章

pear中的urlencoding更改post请求值

pear中的urlencoding更改post请求值

推荐文章

如何使用javascript/jquery将OnClick函数添加到页面链接(url)

如何使用javascript/jquery将OnClick函数添加到页面链接(url)

推荐文章

使Visual Studio 2010在代码编辑器中显示更多行

使Visual Studio 2010在代码编辑器中显示更多行