zoukankan      html  css  js  c++  java
  • 简述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连接中,不会出现旧的连接报文

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

  • 相关阅读:
    iOS 6编程UIScrollView滚动视图结合UIImageView图像视图实现图像缩放效果
    iOS 6编程UIScrollView滚动视图和UIPageControl分页控件实现图像分页显示(2)
    iOS 6编程基于AV Foundation框架开发简单音乐播放器
    iOS 6 的5个新特性创建杀手级应用
    mysql数据库备份和还原
    SEO实战:解决百度收录问题
    nginx的80端口配置两个Web服务
    DedeCMS, Discuz, Phpwind, PhpCMS
    nginx下安装wordpress
    larbin编译和配置
  • 原文地址:https://www.cnblogs.com/baebae996/p/13891386.html
Copyright © 2011-2022 走看看