TCP之四次挥手

为啥需要4次挥手
因为TCP的连接是全双工的,所以,每一段都需要对读写部分分别进行关闭

第一次关闭的是关闭主动方的写端(发送端),关闭被动方的读端(接收端)
第二次关闭的是被动方的写端(发送端),关闭主动方的读端(接收端)
一般来说都是客户端作为主动方来断开连接


四次挥手的步骤

1.客户端调用close等函数主动关闭,并向服务端发送FIN报文
(当一个连接被建立或者被终止的时候,交换的报文当只包含TCP头部,而没有数据)
状态变为FIN-WAIT-1(一般不存在,因为服务端很快就响应),等待服务端的响应
2.服务端的接收到后,立刻返回ACK,服务端的状态变为CLOSE-WAIT(此时处于半关闭状态)
只关闭了客户端写,服务端读的方向的数据传输,服务端还可以给客户端发数据,等到服务端处
理完数据,把没有发完的数据发完
3.客户端接收到服务短的应答,状态变为FIN-WAIT-2,服务端把要发的数据发完了,会给服务端发
一个FIN报文请求关闭,然后服务端的状态变为LACK-ACK
4客户端接收到报文后,发送ACK,然后状态变为TIME-WAIT(等待2MSL(两个报文周期)中)
服务端收到ACK后,就立刻变为CLOSED
客户端在时间到了之后,变为CLOSED
这才是真正的关闭

为啥要等待2MSL
因为如果主动方发送的ACK丢失了,服务端会在2MSL的时间内再次发送FIN
等待2MSL的目的就是确认ACK肯定到达时服务端

1.因为无法保证客户端发送的最后一次ACK一定被服务端收到,因此对方处于LAST-ACK状态下的
SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME-WAIT状态的作用就是用
来重发可能丢失的ACK报文
2.如果不存在2MSL的时间,则应用程序能够立马建立一个和刚关闭的连接相似的连接,因为他们的
IP和端口号都相同,这个连接尽可能收到属于原来连接的应用层数据的TCP报文

因为需要等待2MSL的时间,所以主动关闭方的端口需要等待2MSL后才能被重新使用,
如果是服务端先主动关闭的,则一段时间内服务器将无法重启
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值