三次握手四次断开(为什么两次握手不行,断开为何需要等待2msl)

三次握手四次断开总结

三次握手

三次握手

首先由client发送请求连接的报文,此时SYN=1,ACK=0,且有一个初始seq号x,此报文不可以携带数据(SYN报文不可携带数据),但是也需消耗1个序号,client的连接状态变为syn_sent;

server端收到请求报文后,发送确认报文,此时ACK=1,使确认号生效,此时的确认号为x+1,表示x+1之前的数据已经成功接收,并发送自己的seq号y,SYN=1,server端的连接状态变为syn_rcvd;

client端收到确认报文后,也响应确认报文,此时的确认报文可以携带数据,但是如果不携带数据则不消耗序列号,此报文段内,ack=x+1,ACK=1,seq=y+1,完成三次握手,双方状态变为established;

  • 此处为什么客户端发送确认报文后,客户端还需再一次确认呢?

因为存在这样一种情况,网络存在拥塞,导致第一次客户端的请求报文延时,客户端在丢包计时器时间内未收到服务端确认,认为刚刚发送出去的请求包丢失了,于是客户端再一次发送请求报文,服务端收到请求发送确认报文成功建立连接,但是,不久之后延时的请求旧包到达了服务端,此时只要服务端回复确认包,服务端就认为新的连接已经建立,然而客户端并没有发送请求报文,所以不会响应服务端的确认包,而服务端认为新的连接已经建立一直等待客户端发送数据从而导致资源浪费。

四次断开

四次断开

客户端发起断开,FIN=1,当前序列号为seq=x,此时客户端进入fin_wait状态等待服务端的确认报文;

服务端收到断开请求,立刻回复确认报文,ACK=1,确认号ack为x+1,确认x之前的信息接收成功,服务端的当前序号为y,此时客户端进入fin_wait2状态,等待服务端的释放报文;

此时进入半关闭状态,客户端停止发送数据,但是仍可以接收数据,服务端可能还有未发完的数据,最后的数据发送完后,服务端发送释放报文段,FIN=1,确认号ack仍为上次确认报文的序号x+1,ACK=1,当前序号为w,此时服务端进入close_wait状态,等待客户端的确认报文;

客户端收到释放报文后,发送确认报文,ACK=1,
ack=w+1,当前序号比上次发送断开请求报文增1为x+1,此时客户端进入close_wait状态等待2msl后断开连接。

  • 为什么客户端发送服务端释放报文的确认后还需要等待2MSL(最长报文段寿命)?

因为客户端需确认服务端收到了自己的确认报文,避免服务端没有收到客户端的确认报文一直等待客户端的确认从而消耗资源,于是客户端等待2MSL,如果在这个时间段内再次收到服务端的释放报文表示之前的发送的确认报文服务端没有接收成功,于是再次发送确认报文,且将time_wait计时器重置。

  • 另外还存在一种情况:客户端与服务端已经成功建立连接了,但是突然客户端出故障了

为了防止服务端一直等待客户端的回复,服务端使用保活计时器来控制与客户端的断开,每次收到客户端的数据,服务端会重置保活计时器,如果保活计时器时间段内一直未收到客户端数据,服务端会主动断开连接,一般保活计时器默认是2小时。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
四次挥手是TCP连接的关闭过程,其最后一个步骤是等待一段时间,这段时间被称为2MSL,其MSL是Maximum Segment Lifetime的缩写,表示一个TCP报文段在网络最长的存活时间。四次挥手等待的时间为什么是2MSL呢?原因主要有以下两点: 1. 确保网络所有报文段都被正确处理 在TCP连接的关闭过程,客户端和服务器端都会发送FIN报文段,表示数据传输结束。而这些FIN报文段在网络会经过多个路由器和交换机,可能会出现网络拥塞、延迟等问题。如果关闭连接的一方没有收到对方发送的ACK报文段,就会重复发送FIN报文段,从而影响网络的稳定性。等待2MSL的时间可以确保网络所有的报文段都被正确处理,避免重复发送FIN报文段。 2. 避免重复连接的建立 TCP协议,每个连接都有一个唯一的连接标识,由本地IP地址、本地端口号、远程IP地址和远程端口号组成。如果两个连接的四元组相同,就认为是同一个连接。在TCP连接关闭的过程,可能会出现延迟的ACK报文段,导致连接关闭的一方在等待2MSL的时间内收到了对方发送的FIN报文段。如果等待时间太短,就有可能将这个新的连接误认为是之前关闭的连接,从而出现数据传输错误的情况。等待2MSL的时间可以避免这种情况的发生,确保新连接的正确性。 综上所述,四次挥手等待的时间为2MSL,主要是为了确保网络所有报文段都被正确处理,避免重复连接的建立,保证TCP连接的可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值