TCP的四次挥手

TCP的四次挥手

TCP的四次挥手过程和状态迁移

在这里插入图片描述

  • 当客户端打算断开链接的时候,就会通过TCP的首部(FIN位置为1),之后客户端就进入到了FIN_WAIT_1这个状态
  • 服务器端接收到FIN报文之后,就向客户端发送ACK应答报文,并进入到CLOSE_WAIT状态
  • 客户端接收到服务器端发送的ACK报文之后,进入到FIN_WAIT_2这个状态
  • 等待服务器端处理完数据之后,也向客户端发送FIN报文,服务器进入到LAST_WAIT状态
  • 客户端接收到服务器端发送的FIN报文之后,再向服务器端发送ACK报文,并进入到TIME_CLOSE状态
  • 服务器接收到ACK报文后,就进入到了CLOSE状态
  • 经过2MSL之后,客户端也进入到了CLOSE状态

为什么需要四次挥手

  • 客户端发起关闭连接请求的时候,只是客户端这边不需要再发送数据了,但是还是能够接收数据的
  • 服务器收到客户端的 FIN 报⽂时,先回⼀个 ACK 应答报⽂,⽽服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报⽂给客户端来表示同意现在关闭连接。

为什么等待的时间是2MSL

  • MSL:报文最大生存时间,它是报文在网络中存在的最长时间,超过这个时间报文就会被丢弃
  • TTL:IP头部有一个TTL的字段,是IP数据报可以经过的最大路由数,每经过一个处理他的路由器,TTL就会减1,当值为0的时候,数据包就会被抛弃,同时发送ICMP通知主机
  • 2倍MSL的原因:网络中可能存在对方发送的数据包,当这些数据包到达,又需要对方响应,所以一来一回就需要2MSL(例如客户端发送的最后一个ack没有到达,服务器端刚好触发超时重传机制,再发送一个FIN过来,这样一来一回就刚好是2MSL)
  • 2MLS的计时:是从客户端接收到FIN后发送ACK报文开始计时的,如果因为ACK没有到达,而服务端有重新发送了FIN,2MLS就会开始重新计时

需要2MLS的原理

  • 防止旧的数据包连接(防止重用旧的连接中的数据包到来,导致数据包的顺序错乱)
    在这里插入图片描述
  • 保证连接能够正常关闭:等待足够长的时间确保最后的ACK能够被接收方接收

TIME_WAIT的危害

连接发起方(客户端)

  • 占用端口的资源,TCP和UDP的端口各自只有65536个,被占满将会导致无法创建新的连接

连接接收方(服务器)

  • 由于⼀个四元组表示 TCP 连接,理论上服务端可以建⽴很多连接,服务端确实只监听⼀个端⼝ 但是会把连接
    扔给处理线程,所以理论上监听的端⼝可以继续监听。但是线程池处理不了那么多⼀直不断的连接了。所以
    当服务端出现⼤ᰁ TIME_WAIT 时,系统资源被占满时,会导致处理不过来新的连接

TIME_WAIT的优化

  • net.ipv4.tcp_tw_resuce:复用TIME_WAIT的socket为新的连接使用
  • net.ipv4.tcp_max_tw_buckets:这个值默认为 18000,当系统中处于 TIME_WAIT 的连接⼀旦超过这个值时,系统就会将后⾯的 TIME_WAIT 连接状态重置
  • 程序中使⽤ SO_LINGER

连接建立,客户端突然故障

  • TCP有一个保活机制:定义一个时间段,在这个时间段内,如果没有任何相关的活动,TCP的保活机制就会被激发,每隔一个时间端发送一个探测指针,如果连续几个指针没有响应,则认为当前的TCP连接已经死亡
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值