TCP四次挥手详解以及小实验

TCP四次挥手

image

1、主动关闭方发送FIN连接释放报文段
客户端调用 close 方法,告诉服务器自己要主动关闭连接,会发送一个 FIN 报文给服务端,客户端进入FIN-WAIT-1状态。

FIN 段是可以携带数据的,比如客户端可以在它发送的最后一块数据块中“捎带” FIN 段。当然也可以单独发送FIN。不管 FIN 段是否携带数据,都需要消耗一个序列号。

半关闭和半连接
客户端发送 FIN 包以后不能再发送数据给服务端,但是还可以接受服务端发送的数据。这个状态就是半关闭,而三次握手中服务器收到SYN报文时的连接即为半连接。

2、被动关闭方发送对FIN的ACK普通确认报文段
由于此时服务器数据很可能还没有发完,需要继续向客户端发送未完成的数据,又不能让客户端等太久,所以先向客户端发送ACK 确认报文段,服务端进入 CLOSE_WAIT,客户端收到ACK之后进入FIN-WAIT-2状态。

3、被动关闭方发送FIN连接释放报文段
当服务器数据发送完毕之后。发送 FIN 报文给客户端,然后进入LAST-ACK 状态,等待客户端的 ACK。(同前面一样如果 FIN 段没有携带数据,也需要消耗一个序列号)

4、主动关闭方发送对FIN的ACK普通确认报文段
客户端收到服务端的 FIN 报文以后,回复 ACK 报文用来确认第三步里的 FIN 报文,随后进入TIME_WAIT状态(主动关闭连接的一方才有 TIME_WAIT 状态),等待 2 个 MSL (MSL:最长报文段寿命)以后进入 CLOSED状态。服务端收到 ACK 以后进入CLOSED状态。正常情况下服务器结束TCP连接的时间要比客户端早一些。

四次挥手在某些情况下会简化为三次挥手
  • 四次挥手的原因:因为在客户端发送close请求后,可能服务器还有部分数据尚未传输完,此时的客户端处于半连接半关闭状态还可以接受数据,如果马上发送FIN+ACK就来不及发送这些数据包,而且先发送ACK的原因是防止客户端等太久重传close请求

当服务器没有数据报要发送时,第二次挥手和第三次挥手会简化成一次

TIME_WAIT等待时间是2MSL

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

补充:最大生存时间怎么来的?
报文每经过一次路由器的转发,IP 头部的 TTL 字段就会减 1,减到 0 时报文就被丢弃,这就限制了报文的最长存活时间
MSL 与 TTL 的区别:MSL 的单位是时间,而 TTL 是经过路由跳数。所以 MSL 应该要大于等于 TTL 消耗为 0 的时间,以确保报文已被自然消亡。

  • 保证服务器能够正常关闭连接

客户端在第四握手时进入TIME_WAIT状态,客户端在发送第四次握手时,数据包可能丢失,服务器就会超时重传给客户端,2MSL就是为了在极端情况下,能接收到服务器的超时重传,让服务器正常释放连接。

  • 防止收到历史数据,导致下一次连接数据紊乱

客户端发送完最后一个数据包时,等待2MSL,让这次连接期间的所有数据报都消亡,这样新的连接就不会出现旧的历史数据

在这里插入图片描述

如上图黄色框框服务端在关闭连接之前发送的 SEQ = 301 报文被网络延迟了。
这时有相同端口的 TCP 连接被复用后,被延迟的 SEQ = 301 抵达了客户端,那么客户端是有可能正常接收这个过期的报文,这就会产生数据错乱等严重的问题

客户端在收到第三次挥手的FIN 报文之后,再次收到服务端的数据包会怎么处理

客户端如果收到乱序的 FIN 报文,会将FIN包加入到「乱序队列」,并不会进入到 TIME_WAIT 状态。
等收到前面被网络延迟的数据包时,重组报文得到完整顺序的数据包之后,发现有 FIN 标志,这时才会进入 TIME_WAIT 状态。

客户端在 TIME_WAIT 状态下收到服务端的数据包会怎么处理?

客户端会发送该数据包的 ACK 确认报文,然后丢掉该数据包。

一些有趣的实验
  • 首先第一点 当我和服务器建立连接后 不做处理挂机一会儿 服务器会自动发送FIN ACK来取消连接

image

  • 第二点现象 我和服务器连接 不做处理挂机一会儿 我主动发FIN包来取消连接

image

  • 第三点 我和服务器连接 不做处理挂机一会儿 服务器发FIN包取消连接 但是是正常的四次挥手关闭

image

总结

1,三次挥手
第二次的ACK和第三次的FIN ACK合并在一起了

2,双方同时摆烂,同时发FIN包
当服务器和客户端 同时想关闭发FIN包的时候,两个机器就会进入CLOSEING阶段
大家都等着对方发ACK,但是迟迟没有收到,于是进行重传,等过了时间就会进行关闭

3,客户端已经关闭,还没来得及发FIN包,此时就由服务器发FIN包,进行四次挥手或者RST强制关闭

4,客户端已经关闭,且贴心的发了个FIN包,此时服务器回话了,但是由于之前的连接已经关闭了,所以我直接回复RST强制关闭连接
image

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值