首页 > 其他分享 >TCP为什么需要四次挥手?

TCP为什么需要四次挥手?

时间:2024-07-30 20:27:14浏览次数:10  
标签:挥手 ACK fin TCP 发送 四次 关闭 FIN

tcp为什么需要四次挥手?

答案有两个:

1.将发送fin包的权限交给被动断开方的应用层去处理,也就是让程序员处理

2.接第一个答案,应用层有了发送fin的权限,可以在发送fin前继续向对端发送消息

为了搞清楚这个问题,我们先要了解四次挥手的过程:

在这里插入图片描述

1.注意事项

  • tcp四次挥手过程中没有客户端和服务端的概念,只有主动方和被动方之分
  • 所有的ack包不会自动重传,如果ack包超时或丢失,通过对端重发fin来解决

2.四次挥手的开始条件

  • 主动断开方调用shutdown,关闭读端
  • 主动断开方调用shutdown,关闭写端
  • 主动断开方调用close,关闭读端和写端
  • 主动断开方程序崩溃,关闭双端,协议栈发送RST包

3.第一次挥手详解

  • 主动断开方触发四个条件之一,协议栈会在内核态发送fin包
  • 如果超时时间内未收到ack,协议栈会重发fin
  • 如果由于程序崩溃,协议栈只发送一次RST包,进入快速关闭流程

4.第二次挥手详解

  • 主动关闭方发送fin,向被动方的读缓冲区写入eof结束符,被动方收到可读事件,read返回值为0
  • 被动断开方根据read返回值0判断对方请求关闭连接,但并不知道对方有没有关闭读端
  • 被动断开方可以选择继续发送数据,如果对方关闭读端则数据丢失
  • 直到被动断开方的应用层代码调用close或shutdown或程序崩溃,协议栈会自动发送fin或RST包

5.RST(连接重置)详解

  • 协议栈发送RST是在本端tcp连接非正常断开时进行的
  • 任意一方发送RST或接收到RST都会进入快速关闭流程,释放相应的资源,然后关闭连接

为什么是四次挥手?

  • 如果是三次挥手,那么可能的情况是:
    • 第二次和第三次挥手合并,也就是和tcp连接的三次挥手类似,被动方接收到fin后,协议栈自动发送ack+fin包
    • 三次挥手合并了第二和第三次挥手,最大的不同是:fin由协议栈自动发送,应用层没有权限控制
    • 如果使用三次挥手,那么被动方在发送fin前无法继续发送消息,而且在程序运行过程中进入tcp连接关闭流程,程序员可能并不知道tcp连接关闭的发生,这对代码逻辑有很大的挑战
以上是我个人的理解,下面是gpt-4o的解释:

为什么不能是三次挥手

  1. 可靠性要求
    • TCP协议要求每个FIN和ACK都要独立确认,以确保每一方向另一方清楚地通知了自己的关闭意图。
    • 将ACK和FIN合并在一个包里可能会导致确认过程的不可靠。如果ACK和FIN合并在一个包中,这个包丢失了,将难以确定是否是ACK还是FIN丢失,需要重新发送哪个包。
  2. 流量控制和数据传输的分离
    • 接收FIN包意味着对方已经完成数据发送,但并不意味着接收方也已经完成数据发送。
    • 被动关闭方可能在接收到FIN包后还有数据需要发送,所以它需要有时间处理和发送剩余的数据。
    • 单独的ACK包确保了被动关闭方有时间处理这些数据,而不是立即发送FIN包。
  3. 避免状态混淆
    • 四次挥手的流程清晰地分离了不同的状态:接收FIN、确认FIN、发送FIN、确认关闭。
    • 这种状态分离可以避免在不同阶段的混淆,确保每一步都清楚且明确。

例子解释

如果采用三次挥手,将第二次和第三次挥手合并,情况如下:

  1. 主动关闭方发送FIN。
  2. 被动关闭方接收FIN并发送ACK+FIN。
  3. 主动关闭方接收ACK+FIN,发送ACK,进入TIME_WAIT。

这种情况下:

  • 如果ACK+FIN包丢失,主动关闭方无法区分是ACK还是FIN丢失,需要重新发送哪个包。
  • 被动关闭方在接收到FIN后立即发送ACK+FIN,可能会丢失未发送完的数据。
  • 主动关闭方在接收到ACK+FIN后立即发送ACK并进入TIME_WAIT,可能会导致被动关闭方的数据传输被中断。

结论

四次挥手设计的目的是确保每个关闭步骤都得到确认,保证连接的可靠性和完整性。虽然理论上可以考虑三次挥手,但那样会增加丢包情况下的复杂性和不确定性,违背了TCP协议设计的初衷。四次挥手虽然多了一步,但提供了更高的可靠性和明确的状态分离,有助于实现稳定和可靠的连接关闭过程。
那样会增加丢包情况下的复杂性和不确定性,违背了TCP协议设计的初衷。四次挥手虽然多了一步,但提供了更高的可靠性和明确的状态分离,有助于实现稳定和可靠的连接关闭过程。

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

标签:挥手,ACK,fin,TCP,发送,四次,关闭,FIN
From: https://blog.csdn.net/2303_77208351/article/details/140781289

相关文章

  • Winform程序控制网络继电器(康耐德,泥人..)运用Socket,TCP协议
    //继电器官网查看命令https://www.konnad.com/service/download/product-model/sdd4040-ad3staticbyte[]DOON=newbyte[]{0x00,0x01,0x00,0x00,0x00,0x06,0xFF,0x05,0x00,0x64,0xFF,0x00};//控制继电器打开(DO-1灯亮)staticbyte[]DOOFF=new......
  • Modbus TCP/ip Logosoft Comfort V8
    我正在做一个学校项目,其中包括徽标和我的计算机之间的tcp/ip通信,但我无法使其工作。我并不是想创建一个服务器,我只是想将一个值从我的计算机发送到徽标的网络数字输入。标志ip:192.168.0.2网络输入ID:1TCP/IP端口:502网络输入地址:1Estoyhaciendounproyectoescolar,qu......
  • 基于EasyTcp4Net开发一个功能较为完善的去持久化聊天软件
    之前自己写了一篇介绍TCP的一些常用的功能介绍和特征,并且用代码做了示例,最终开发了一个EasyTcp4Net的TCP工具库,其最大的特色就是使用了微软提供的高性能库中的一些数据结构来处理TCP数据。最近辞职待业在家,也没啥事做,就利用自己写的TCP通讯库基础上开发了一个示例的聊天程序,功能......
  • TCP协议详解
    TCP协议详解TCP(TransmissionControlProtocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在网络通信中扮演着至关重要的角色,尤其是在需要保证数据完整性和顺序性的应用场景中。以下是对TCP协议的详细解析,包括其工作原理、特点、应用场合以及关......
  • java中的tcp
    在Java中,TCP(TransmissionControlProtocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它运行在IP(InternetProtocol,互联网协议)层之上,为应用层提供可靠的通信服务。TCP通过确保数据包的顺序传输、重传丢失的数据包以及错误检测,来保证数据的完整性和可......
  • 如何理解tcp的三次握手?
    TCP(传输控制协议)是一种网络通信协议,用于可靠地传输数据。它是互联网协议套件(TCP/IP)中的一部分,负责将数据分割成小块(称为数据包),通过网络传输,然后在接收端重新组装这些数据包,确保它们按照正确的顺序到达,并且没有丢失或损坏。三次握手是TCP连接建立过程中的一个重要步骤。在三次......
  • Linux网络:传输层协议TCP(三)滑动窗口及流量控制
    目录一、关于滑动窗口在TCP中的应用1.1什么是滑动窗口,为什么要有滑动窗口1.2滑动窗口的实现1.3滑动窗口针对丢包重传的处理机制二、流量控制一、关于滑动窗口在TCP中的应用1.1什么是滑动窗口,为什么要有滑动窗口在上一篇博文中博主阐述了确认应答ACK策略,对每一个对......
  • 如何在 Python 中从 Milesight TrafficX 摄像头、Post(MQTT、TCP/IP、HTTP) 获取数据?
    你好,祝你度过愉快的一天或一夜,我有这个MilesightTrafficX摄像头已启动并正在运行,仪表板中有一个名为POST的设置,您可以在下图中看到:我想要的是知道如何设置这些设置(基于实际上我的意思是)能够在我的Python代码中接收数据。无论协议如何,数据都将如下所示:......
  • 网络协议 TCP、UDP 和 HTTP
    TCP与UDPTCP(TransmissionControlProtocol)和UDP(UserDatagramProtocol)是两个广泛使用的传输层协议,它们在数据传输的方式、可靠性和应用场景方面有显著的区别。TCP特点:面向连接:TCP是面向连接的协议,传输数据前需建立连接(三次握手)。可靠传输:TCP通过确认(ACK)、序列号、重传......
  • QT网络编程(二)——TCP协议工作原理及实战
    目录引言一、TCP协议基础知识1.TCP协议特点2.TCP连接的三个阶段3.三次握手和四次挥手二、Qt中的TCP编程1.引入Qt网络模块2.QTcpServer类常用函数3.QTcpSocket类常用函数三、TCP网络通信流程TCP服务器TCP客户端四、实战示例UI界面核心代码运行结果......