• 简述TCP四次挥手


    四次挥手过程

    首先,当前客户端和服务器的状态都为 established

    image-20201028152842414

    第一次挥手

    客户端发送FIN报文,表示请求释放连接

    发送完毕后,客户端进入 FIN-WAIT-1 状态

    第二次挥手

    服务器收到FIN报文后,会返回一个ACK报文,表明自己接收到了客户端关闭连接的请求,但还没有准备好关闭连接

    此时服务器进入 CLOSE-WAIT 状态

    客户端收到这个ACK报文后,进入 FIN-WAIT-2 状态

    第三次挥手

    当服务器准备好关闭连接时,向客户端发送FIN报文,请求释放连接

    发送完毕后,服务器进入 LAST-ACK 状态

    第四次挥手

    客户端接收到服务器的FIN报文后,知道服务器已经准备好关闭了,就返回一个ACK报文

    同时进入 TIME-WAIT 状态,等待可能出现的要求重传的ACK报文

    服务器接收到这个ACK报文后,关闭连接,进入 CLOSED 状态

    客户端等待固定时间(2MSL)之后,没有收到服务器的ACK,认为服务器已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态

    补充问题

    1、为什么需要四次挥手?

    关键在于中间2次挥手:

    当服务器收到客户端的FIN报文后,不会立即关闭连接,所以只能先回复一个ACK报文,告诉客户端“我收到了你发的FIN报文了”;只有等服务器的报文都发送或者接收完了,才能发送FIN报文给客户端,完成第三次挥手

    2、为什么客户端需要TIME-WAIT状态?

    假设客户端在第四次挥手中 发送的ACK报文在网络中丢失了,那么服务器就会重发FIN报文,如果客户端在发完这个ACK报文后立即关闭连接,就无法收到服务器重发的FIN报文,导致服务器无法正常关闭TCP连接

    3、为什么客户端的TIME-WAIT状态需要持续2MSL的时间?

    • 第一:为了保证客户端发送的最后一个ACK报文能够到达服务器。 所谓MSL(Maximum Segment Lifetime)指的是一个报文在网络中最长的存活时间,而2MSL就是一个发送和一个回复报文所需的最大时间。如果2MSL之后,客户端都没有再次收到服务器的FIN报文,那么就推断第四次挥手的ACK报文已经被服务器成功接收,所以关闭TCP连接
    • 第二:防止已失效的连接请求报文出现在本次连接中。在经过2MSL后,本次连接内产生的所有报文段都将从网络中小时,使得在下一个新的TCP连接中,不会出现旧的连接报文

    感谢帅地的这篇文章对本文撰写 所提供的的帮助

  • 相关阅读:
    统计字符串中每个字母出现的次数
    三次握手和四次挥手
    select后面不能包含group by 后面没有的列
    常用adb命令
    replace和replaceAll的区别
    java统计一个字符串中某个字串出现的次数
    大厂如何解决分布式事务
    ADB 用法大全
    PBN飞越转弯Flyover衔接TF、CF航段保护区组图
    PBN旁切转弯保护区组图
  • 原文地址:https://www.cnblogs.com/baebae996/p/13891386.html
Copyright © 2020-2023  润新知