1.什么是TCP
TCP(Transmission Control Protocol)传输控制协议,是TCP/IP网络模型中是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP要建立连接需要经历很多过程,这些总多的过程没完成一个过程TCP连接就进入到一个新的阶段,TCP状态就是表示TCP连接的建立、使用、维护、及拆除中某一个状态的,我们叫做TCP状态机。理解这些状态的含义能够极大的帮助我们在处理关于TCP的网络问题时,做到游刃有余。
2.TCP的状态机及含义
图1:经典TCP状态图
上图中,粗红色的线代表客户端的TCP连接过程(一般认为主动发起tcp连接的一方为客户端),蓝色虚线是服务器端的TCP连接过程(一般认为被动连接的一方称之为服务器端),细实线用来表示交错的状态。接下来把这些状态分开来理解。
共同状态:
CLOSED:关闭状态,这个最好理解,啥都不干
ESTABLISHED:连接建立状态,此时客户端和服务器端正在进行通信
客户端状态:
SYN_SENT:当处于关闭状态的客户端准备向服务器发起连接请求时,先发送一个SYN报文到服务器,告诉服务器端,我准备来连接你了,请回答;即是:发送了SYN,等待对端回应SYN+ACK。
FIN_WAIT1:客户端获取了想要的数据了,这个时候是时候关闭连接了,在ESTABLISHED状态下,发送一个FIN报文给服务器端,此时等待服务器端的应答;即是:发送了FIN,未收到对端的任何消息(ACK或FIN).
FIN_WAIT2:在FIN_WAIT1的状态下,服务器回了一个ACK包给客户端,意思是你发的连接断开我收到了,不过我现在还有数据没发送完,你再等下;即是:发送了FIN,收到了对端的ACK,但是没有收到对端的FIN. 这里为什么没有收到对端的FIN呢?因为对端还有数据没有发完。
CLOSING:服务器端和客户端都在同时关闭这个连接了,此时客户端只收到一个FIN报文,此时只需要发送一个ACK就行了。即是:我发送了FIN,也收到了对端的FIN. 我还没有发送ACK,也没有收到对方的ACK.
TIME_WAIT:服务器发送完数据了,此时就给客户端发送一个FIN保文,意思是现在我这边的内容也发送完了,我们可以正式关闭连接了。此时客户端会发送一个ACK报文给服务器端,告诉服务器端,我收到关闭连接,现在可以确认关闭了,不过我害怕网络有问题,你收不到我发的ACK包,并且我要确定所有的数据都发送完了,所以我需要等一等,确认你确实收到,否则我就要做重传;即是:该发送的(FIN,ACK)都发送了,等待一个时间,这个时间内希望你不要出问题,正常收到我的ACK,我就可以超时CLOSED了。这个状态只能出现在主动关闭TCP连接的一段。
从图中看出,主动打开的一方的状态转换更为复杂,主要有以下三个分支,现在来逐一的解释一下
FIN_WAIT1-->FIN_WAIT2-->TIME_WAIT:这个状态是客户端连接的一般状态。
FIN_WAIT1-->CLOSING-->TIME_WAIT:客户服务器同时关闭了连接
FIN_WAIT1-->TIME_WAIT:服务器端也没内容发了,发送FIN报文到客户端。进入关闭前的最后状态
服务器端状态:
SYN_RCVD:收到客户端的连接请求,然后发送SYN,并确认客户端的连接请求,即发送ACK包。即是:收到了SYN,同时我发送SYN+ACK. 但是并未收到对端的ACK. 如果收到对端的ACK,则状态迁为Established.
CLOSING_WAIT:客户端请求关闭,收到FIN报文,并告诉客户端收到关闭请求了,即发送ACK包;即是:收到了对端的FIN,我也发送了ACK,但是我没有发送FIN.为什么没有发送FIN,因为我还有数据没发送完。
LAST_ACK:数据也发完了,这个时候就开始正式进入关闭状态了。即是:我自己的数据也发送完了,所以向对端发送了FIN. 等到收到对端的ACK,则我的状态就变程CLOSED.