TCP状态变化总结
在开发和维护过程中总是离不开网络,网络几乎总是离不开TCP的知识。
经过平时的实践和看书的收获。
在这里总结一下TCP协议的各个状态的含义。
ps: 通过netstat 命令可以看到当前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.处理半打开连接
服务器(客户端)关闭或者异常终止了连接,而对方没有接受到结束报文(可能发送网络故障),这时候客户端(服务端)还在保持了原有的状态,但是服务端(客户端)即使重启也没有了该连接的信息了,这种状态称为半打开状态。 这时,客户端(服务端)往半打开状态的连接写入数据,对方将回应一个复位报文段。