TCP状态变化总结

在开发和维护过程中总是离不开网络,网络几乎总是离不开TCP的知识。

经过平时的实践和看书的收获。

在这里总结一下TCP协议的各个状态的含义。

ps: 通过netstat 命令可以看到当前TCP所处于的状态。

一、 网上的一张TCP状态变迁图如下,它描述了所有的TCP状态已经可能的状态变化。

TCP状态变化总结

二、可以分成服务器和客户端来描述TCP状态的变化。

三、服务器端调用listen系统调用后处于 LISTEN状态。此时等待客户端主动连接的到来。

四、当服务器端接受到客户端的SYN连接报文,并且回复了SYN的确认(ACK)报文后就变为SYN RCVD状态。表示客户端来的SYN已经接收到。

五、在四的基础上,服务端收到刚才确认的确认报文后就进入ESTABLISHED状态。此时三次握手完成。

六、服务器端收到客户端发来的主动关闭连接请求时,也就是收到FIN报文后进入CLOSE_WAIT状态,然后发给客户端FIN报文后就进入LAST_ACK状态。

==================

七、客户端发出SYN包,主动连接服务器后,就进入SYN_SENT状态。这个状态理论上不会太长。如果一直处于SYN_SENT状态,说明服务端没有响应,请检查配置的服务器端的IP和端口是否正确。

八、在SYN_SENT基础上,收到服务器端发回来的SYN后,并且发生出去ACK确认后就进入ESTABLISHED状态。连接已经建立。

九、客户端执行主动关闭,发出FIN包后首先进入FIN_WAIT1状态,收到SYN确认后进步FIN_WAIT2状态,继续收到FIN包后进入TIME_WAIT状态。

备注:之所以进入TIME_WAIT状态,而不是直接关闭有两个原因:可靠终止TCP连接,保证迟来的TCP报文有足够时间别识别并且丢失。

下边说一下两个容易混淆状态的区别。

CLOSE_WAIT : 被动关闭、 收到对方发来的FIN包后进入该状态。回复FIN给对方后变为LAST_ACK状态。

TIME_WAIT    : 主动关闭、主动发送FIN包并且收到对方的FIN包后进入该状态。

下边聊聊复位报表段:

在某些条件下,TCP会向另一端发送RST标志的报文段,也就是复位报文段。用来通知对方关闭连接或者重新连接,讨论三种情况:

a. 访问不存在端口时

b. 异常终止连接,TCP提供了异常终止一个连接的方法,即给对方发送一个复位报文段。一旦发送了复位报文段,发送端所有排队等待发送的数据都将丢弃。

c.处理半打开连接

   服务器(客户端)关闭或者异常终止了连接,而对方没有接受到结束报文(可能发送网络故障),这时候客户端(服务端)还在保持了原有的状态,但是服务端(客户端)即使重启也没有了该连接的信息了,这种状态称为半打开状态。 这时,客户端(服务端)往半打开状态的连接写入数据,对方将回应一个复位报文段。
 

相关推荐