首页 > 其他分享 >TCP的四次挥手过程

TCP的四次挥手过程

时间:2024-05-12 11:30:38浏览次数:24  
标签:状态 挥手 ACK 被动 TCP 四次 FIN 连接 WAIT

TCP连接是双向传输的对等的模式(全双工模式),就是说双方都可以同时向对方发送或接收数据。
而断开的时候,也是双方都可以主动断开,此时需要经过四次挥手的过程,流程如下图所示:
TCP四次挥手

  1. 主动方发送FIN包给被动方,主动方状态变成FIN_WAIT_1,等待被动方的确认。此时主动方不能再发送数据。
  2. 被动方收到FIN之后,返回ACK包给主动方,确认自己收到这个包,被动方状态变成CLOSE_WAIT,等待关闭连接(等待缓存数据都发送过去)
  3. 主动方收到ACK之后,状态变成FIN_WAIT_2,等待被动方的FIN包。
  4. 被动方将缓冲区剩余的数据发送给主动方。
  5. 被动方发送FIN给主动方,被动方状态变成LAST_ACK状态。
  6. 主动方收到FIN之后,返回ACK包给被动方,主动方变成TIME_WAIT状态。
  7. 被动方收到ACK确认后,变成CLOSE状态。
  8. 主动方在经过2MSL时间之后,变成CLOSE状态。

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

为什么握手需要三次,而挥手需要四次?

因为 TCP连接是全双工模式,一方断开连接,另一方还是可以继续发送数据,所以无法像三次握手一样,将 FINACK合并到一起,而是需要等待被动方处理完所有数据,不再有数据发送时,才会发送 FIN,来关闭被动方的连接。

为什么需要 TIME_WAIT状态?

需要 TIME_WAIT 状态,主要是两个原因:

  1. 防止历史连接中的数据,被后面相同四元组的连接错误的接收:
    在连接关闭过程中,可能会存在一些延迟的数据包在网络中,这些数据包可能在连接关闭后到达目的地。TIME_WAIT 状态的存在可以确保在这段时间内不会接收到与当前连接相关的旧数据包,防止这些数据包造成连接的混乱。
  2. 保证「被动关闭连接」的一方,能被正确的关闭:
    如果主动方收到 FIN,发出 ACK之后,直接进入 CLOSE状态,那么当这个 ACK丢失时,被动方收不到 ACK则会重发一个 FIN,但此时主动方已经是 CLOSE状态,无法再给被动方发送 ACK了。

如果两端同时关闭,会出现什么情况?

前面说过,TCP连接双方都可以主动断开,那如果两边同时断开,会怎样呢?
TCP同时断开

从上图可以看到,一方发出FIN,进入FIN_WAIT_1状态,原本期待收到ACK,但此时收到了FIN,则会变成CLOSING状态,等到收到ACK时,再进入TIME_WAIT状态,同样要经过2MSL时间变成CLOSE状态。

参考资料

标签:状态,挥手,ACK,被动,TCP,四次,FIN,连接,WAIT
From: https://www.cnblogs.com/lcc9527/p/18187618

相关文章

  • 无线通信模块通过TCP/IP协议实现与PC端的数据传输
    在当今的信息时代,无线通信技术的发展日新月异,为我们的工作和生活带来了极大的便利。其中,无线通信模块通过TCP/IP协议向PC端传送数据已经成为了一种常见的通信方式。本文将详细介绍这一过程的主要步骤和涉及的关键技术,并以WIFI模块为例,探讨如何在QT平台下实现数据的无线传输。一、......
  • TCP KEEPALIVE以获得更好的POSTGRESQL体验
    一、数据库连接断开的原因连接断开的可能原因有多种:1、数据库服务器崩溃如果服务器由于某种原因崩溃,要调查服务器是否存在问题,您应该首先查看PostgreSQL日志,看看是否可以找到匹配的崩溃报告。2、客户端放弃的连接如果客户端在没有正确关闭数据库连接的情况下退出,服务器在网......
  • 故障分析 | TCP 缓存超负荷导致的 MySQL 连接中断
    1.背景在执行跑批任务的过程中,应用程序遇到了一个问题:部分任务的数据库连接会突然丢失,导致任务无法完成。从数据库的错误日志中,发现了 Abortedconnection 的信息,这说明客户端和服务器之间的通信被异常中断了。2.分析为了找出问题的原因,我们首先根据经验,分析了可能导致连接被......
  • TCP长连接/HTTP长连接/HTTP长(短)轮询
     TCP长连接/HTTP长连接/HTTP长轮询TCP长连接VSHTTP长连接TCP长连接和HTTP长连接是两个相关但概念上有所区别的技术。TCP长连接TCP(TransmissionControlProtocol)是互联网传输层的一个面向连接的协议,它提供可靠的数据传输服务。在TCP连接中,长连接是指客户端和服务器建立连......
  • ModbusTcp和ModbusRtu全面理解
    一、何为Modbus通信协议1.1Modbus基本介绍Modbus是一种通信协议,是Modicon公司(现在的施耐德电气SchneiderElectric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(Defacto),并且现在是工业电子设备之间常用的连接方式M......
  • socket TCP 网络编程 笔记
    1.宏观目的:实现简单的TCP通信我们需要server.c和client.c2.server.c/**socket*bind*listen*accept*send/recv*/#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<string.h>#include<netinet/in.h>......
  • TLS的四次握手
    TLS的四次握手由于HTTP是明文传输,因此需要加密,于是采用TLS的RSA握手去实现加密传输。所以流程变为先通过TCP的三次握手加上TLS的四次握手建立连接。第一次握手客户端发送clienthello,内容包括TLS版本号,随机数,可用于加密的协议。第二次握手服务器接收到客户端的消息,发送给客户......
  • CentOS中使用tcpdump抓包 转载
    安装:yuminstalltcpdump命令使用:监听特定网卡tcpdump抓取第一块网卡所有数据包 [root@server110tcpdump]#tcpdumptcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecodelisteningoneth0,link-typeEN10MB(Ethernet),capturesize65535by......
  • 交叉编译tcpdump
    1.下载源码gitclonehttps://github.com/the-tcpdump-group/libpcap.gitgitclonehttps://github.com/the-tcpdump-group/tcpdump.git2.交叉编译libpcap执行shautogen.sh生成configure设置交叉编译链./configure--host=arm-linux-gnueabihf设置install环境,将Makefile......
  • TCP的三次握手过程
    TCP是面向连接的、可靠的、基于字节流的传输层通信协议。TCP是面向连接的协议,所以使用TCP前必须先建立连接,而建立连接是通过三次握手来进行的。TCP包头结构在讲解三次握手的过程之前,我们先来看一下TCP包的结构:TCP包头大小在大多数情况下是固定的,它通常是20字节(不包括任何......