TCP三次握手与四次挥手状态变化十一种状态变化详解_TCP

TCP三次握手与四次挥手状态变化十一种状态变化详解_客户端_02

建立连接过程:

客户端

默认状态:CLOSED:关闭

发起建立连接状态:SYN_SENT  发送SYN

建立连接状态:ESTABLISHED 已连接

服务端

服务端默认状态为 LISTEN

接受SYN并发送ACK :SYN_RCVD

我接受到了你的SYN请求

ESTABLISHED  建立连接

断开连接过程

客户端:

连接状态:ESTABLISHED

客户端发送FIN 断开连接

客户端状态改为:FIN_WAIT_1

(等待服务端同意)

客户端收到服务端Ack断开确认:FIN_WAIT_2

客户端收到服务端FIN断开请求状态为:TIME_WAIT

(等待)

这时候客户端回复服务端Ack  就关闭了状态改为:CLOSED

服务端:

连接状态:ESTABLISHED

收到客户端FIN断开请求,发送Ack,状态改为:CLOSE_WAIT

服务端发送FIN断开连接请求,等待客户端回复Ack

状态改为:LAST_ACK

服务端收到ACK后,状态改为:CLOSED

TCP三次握手与四次挥手状态变化十一种状态变化详解_客户端_03

第一次握手

一开始客户端的状态是CLOSED

服务端理论上是CLOSED 但是实际上是LISTEN

当双方建立连接后双方的状态是:ESTABLISHED


第二次握手

首先客户端发送SYN请求 与服务端建立连接

此时客户端的状态由CLOSED变为:SYN_SENT

服务端收到后  回复Ack包 并发送SYN包 同意与客户端的连接请求并发出与客户端建立连接

此时服务端的状态由LISTEN变为SYN_RCVD


第三次握手

客户端收到服务端的Ack和SYN请求,回复Ack,同意与服务端的连接请求

此时客户端的状态由SYN_SENT变为ESTABLISHED

服务端收到客户端的Ack包后

此时服务端的状态由SYN_RCVD变为ESTABLISHED


此后服务端可与客户端使用TCP传输数据

以上是TCP的三次握手

目的:建立可靠的有确认重传机制的连接!

TCP三次握手与四次挥手状态变化十一种状态变化详解_TCP_04

TCP三次握手与四次挥手状态变化十一种状态变化详解_服务端_05

四次挥手

第一次挥手

首先客户端像服务端发起断开连接请求FIN包

此时的客户端状态为ESTABLISHED变为FIN_WAIT1


第二次挥手

服务端收到客户端FIN包断开连接请求,回复Ack

此时服务端的状态为ESTABLISHED变为CLOSE_WAIT


此时服务端向客户端未发送完的数据还可以继续发送

发送完后

第三次挥手

服务端向客户端发起断开连接请求FIN包

此时服务端的状态为CLOSE_WAIT变为LAST_ACK

客户端状态由FIN_WAIT1变为FIN_WAIT2


第四次挥手

客户端收到服务端断开连接请求,回复Ack包

此时客户端的状态为FIN_WAI T2变为TIME_WAIT

进入等待关闭  时间2分钟  2MSL(数据报文的最大生存时间)

服务端收到Ack包后 状态由LAST_ACK变为CLOSED


最终客户端和服务端状态都变为CLOSED


TCP四次挥手状态转换:

由于tcp连接是全双工的,断开连接会比建立连接麻烦一点点

全双工  你发送数据的同时,对方也可以发,大马路谁都可以走

半双工   双方都可以发送数据,但是同一时间只允许乙方发送数据,不允许同时发送

单工  只允许甲方向乙方发送数据,而乙方不能向甲方发送数据


2MSL等待状态

TIME_WAIT状态也称为2MSL等待状态,每个具体的TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime) 他是任何报文段被丢弃前在网络内的最长时间。我们知道这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则由限制其生存时间TTL字段。


就是当我们传输数据的时候,如果超过这个时间对方没有回复收到,那么我们认为数据丢包,从新发送


TCP三次握手和四次挥手一共11种状态

上面展示了10种分别是

ESTABLISHED

CLOSED

CLOSE_WAIT

FIN_WAIT1

FIN_WAIT2

TIME_WAIT

LAST_ACK

LISTEN

SYN_SENT

SYN_RCVD

还有第十一种

CLOSING


CLOSING状态表示:

四次挥手时

第一次挥手

客户端发送FIN包请求关闭连接


第二次挥手

这时候服务端应该回复Ack包表示同意


第三次挥手

服务端发送FIN包请求关闭连接


这时候客户端并没有收到服务端的Ack包 而是只收到了服务端的FIN包

这个时候状态就变成了CLOSING

这说明了 服务端发送的Ack包丢了

TCP三次握手与四次挥手状态变化十一种状态变化详解_客户端_06