TCP协议:四次挥手过程

在这里插入图片描述
TCP采用四次挥手来释放连接:

  • 第一次挥手:client发送一个FIN,用来关闭client到server的数据传送,client进入FIN_WAIT_1状态。
  • 第二次挥手:server收到FIN后,发送一个ACK给client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),server进入CLOSE_WAIT状态;
    Tcp通知高层的应用进程,客户端要释放和服务器通信的连接了,此时会处于半关闭的状态,即客户端已经没有数据要发送了,但是服务器要是发送数据,客户端还是能够接收。
  • 第三次挥手:server发送一个FIN,用来关闭server到client的数据传送,server进入LAST_ACK状态。
  • 第四次挥手:client收到FIN后,client进入TIME_WAIT状态,接着发送一个ACK给server,确认序号为收到序号+1,server进入CLOSE状态,client等待2*MSL时间后进入CLOSE状态,完成四次挥手。
    “MSL即最长报文段寿命”

问题:

  • 问题1:client不是立即关闭,而是等待2MSL后关闭?
    • 确保有足够的时候让对方收到ACK包,如果被动关闭的那一方没有收到ACK包,就会触发被动关闭的端重发FIN包,一来一去所用的时间就是2MSL;
    • 避免新旧连接混淆。有的路由器会缓存ip数据包,如果连接被重用了,那么这些延迟收到的包就可能会跟新的连接混在一起。
  • 问题2:为什么需要四次挥手才能断开连接?
    因为是全双工连接,发送方和接收方都需要FIN报文和ACK报文。
  • 问题3:服务器出现大量CLOSE_WAIT状态的原因?
    服务器出现大量CLOSE_WAIT状态只有一种情况,在客户端发送FIN报文时,服务器端没有进一步发送(ACK,或者FIN报文已确认)
    换句话说:对方关闭socket连接,我方忙于读或写,没有及时关闭连接。解决办法如下:
    • 检查代码,特别是释放资源的代码
    • 检查配置,特别是处理请求的线程配置
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值