4次挥手最后的ACK如果重新发送还是失败呢

来源:2-4 为啥time_wait需要等待2msl

hdjs

2020-12-25

老师想问下 4次挥手最后客户端发送ACK丢失了,那么会重新发送ACK,如果这个ACK还是丢失了呢,是会一直重复下去吗,在一直重试发送ACK吗,是不是服务端收不到ACK就不会进入CLOSED
图片描述

写回答

2回答

牛儿吃草

2021-01-02

最后还会进入CLOSED的。
服务端发送FIN,进入LAST_ACK状态,客户端收到这个FIN包后发送ACK包,由于某种原因,这个ACK包丢失了,B没有收到ACK包,然后服务端等待ACK包超时,又向客户端发送了一个FIN包  
   a) 假如这个时候,客户端还是处于TIME_WAIT状态(也就是TIME_WAIT持续的时间在2MSL内)
客户端收到这个FIN包后向服务端发送了一个ACK包,服务端收到这个ACK包进入CLOSED状态  
   b) 假如这个时候,客户端已经从TIME_WAIT状态变成了CLOSED状态  
       客户端收到这个FIN包后,认为这是一个错误的连接,向服务端发送一个RST包,当服务端收到这个RST包,进入CLOSED状态
   c) 假如这个时候,客户端挂了(假如这台机器炸掉了)【第四种情况,不在参考链接里】
        服务端没有收到客户端的回应,那么会继续发送FIN包,也就是触发了TCP的重传机制,如果客户端还是没有回应,服务端还会继续发送FIN包,直到重传超时(至于这个时间是多长需要仔细研究),服务端重置这个连接,进入CLOSED状态

2
1
hdjs
非常感谢老师耐心解答
2021-01-04
共1条回复

hdjs

提问者

2020-12-25

如果客户端ACK一直失败,服务端是不是一直回应FIN,客户端在回应ACK,一直循环这个过程,直到服务端收到ACK,客户端和服务端才会进入CLOSED

0
0

(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目

简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关

1316 学习 · 352 问题

查看课程