"三次握手"和"四次挥手"

在建立TCP连接时需要三次握手,在断开连接时需要四次挥手

三次握手

在这里插入图片描述
第一次握手: 客户端向服务端发送SYN包{SYN=1,seq=x},客户端进入SYN_SENT状态
第二次握手: 服务端向客户端发送应答的ASK包和SYN包{ASK=1,SYN=1,ask=x+1,seq=y},服务端进入SYN_RCVD状态
第三次握手: 客户端向服务端发送应答的ASK包{ASK=1,ask=y+1,seq=x+1},客户端进入ESTABLISHED状态,服务端收到ASK包后也进入ESTABLISHED状态

建立连接为什么是三次握手,而不是两次呢?
加入是两次的话对客户端 是没有影响的,客户端开始在收到服务端的ASK-SYN包后进入ESTABLISHED状态,客户端向服务端发送数据是没问题的,但对于服务端来说,在接收到客户端的ASk连接请求后就进入了ESTABLISHED状态,并发送向客户端发送ASK-SYN包,如果这时客户端没有收到ASK-SYN包,没有进入ESTABLISHED状态,但服务端就给客户端发送数据,肯定是失败的,服务端将会一直等待下去,这样浪费服务端连接资源。

四次挥手

在这里插入图片描述
由于TCP传输是全双工的,客户端向服务器发送数据的同时服务端也可以向客户端发送数据,所以断开连接需要四次挥手,前两次断开一个方向的连接,后两次断开另一个方向的连接
第一次挥手: 当客户端的数据发送完后,向服务端发送一个FIN包请求断开连接{FIN=1,seq=u},客户端进入FIN-WAIT1状态
第二次挥手: 服务端收到客户端发来的FIN断开请求后,通知应用程序客户端发送数据完成,不会再发数据了,同时做出应答给客户端发送一个ASK包,{ASK=1,ask=u+1,seq=v},服务端进入CLOSE-WAIT状态,客户端在收到应答后进入FIN-WAIT2状态,此时从客户端到服务端的连接断开,客户端不会发送数据,服务端也不会在接收数据,但这时候服务端还可以向客户端发送数据,还需要接下来的两次挥手
第三次挥手: 当服务端的数据发送完以后,也会向客户端发送一个FIN包请求断开连接{FIN=1,ASK=1,seq=w,ask=u+1},服务端进入LAST-ASK状态
第四次挥手: 客户端在接收到断开请求后,进入TIME-WAIT状态,并向服务端发送应答{ASK=1,seq=u+1,ask=w+1},服务端在接收到应答后,进入CLOSED转态,等客户端的TIME-WAIT结束后,客户端也进入CLOSED状态,此时服务端到客户端的连接断开

客户端在收到第三次挥手后为什么没有立即进入关闭状态呢?
因为客户端要等服务端收到客户端的应答,如果服务端没有收到应答,服务端会从新发送断开连接的请求,而这时客户端已经关闭了,那么服务端到客户端的连接将永远不能关闭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值