TCP三次握手与四次挥手状态变化十一种状态变化详解
原创
©著作权归作者所有:来自51CTO博客作者果果和熊猫的原创作品,请联系作者获取转载授权,否则将追究法律责任


建立连接过程:
客户端
默认状态: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

第一次握手
一开始客户端的状态是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的三次握手
目的:建立可靠的有确认重传机制的连接!


四次挥手
第一次挥手
首先客户端像服务端发起断开连接请求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包丢了
