TCP为什么需要四次挥手?

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387619.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端开发知识-vue

大括号里边放键值对,即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤: 1.javascript中引入vue.js 可以src中可以是vue的网址,也可以是本地下载。 2.在javasc…

网络爬虫必备工具:代理IP科普指南

文章目录 1. 网络爬虫简介1.1 什么是网络爬虫?1.2 网络爬虫的应用领域1.3 网络爬虫面临的主要挑战 2. 代理IP:爬虫的得力助手2.1 代理IP的定义和工作原理2.2 爬虫使用代理IP的必要性 3. 代理IP的类型及其在爬虫中的应用3.1 动态住宅代理3.2 动态数据中心…

数据挖掘-数据预处理

来自🥬🐶程序员 Truraly | 田园 的博客,最新文章首发于:田园幻想乡 | 原文链接 | github (欢迎关注) 文章目录 3.3.1 数据的中心趋势平均数和加权平均数众数,中位数和均值描述数据的离散程度 &a…

【MySQL】用户管理连接池原理{数据库权限/连接池/mysql访问逻辑}

文章目录 1.普通用户的引入用户创建用户删除用户修改用户密码 2.数据库的权限给用户授权回收权限实操过程 3.简略介绍mysql连接池3.一个用户注册/登录/使用网页版mysql逻辑 1.普通用户的引入 用户 MySQL中的用户,都存储在系统数据库mysql的user表中 mysql> use…

uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功

文章目录 导文是因为要添加服务器域名! 导文 uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功 uniapp微信小程序体验版上传图片不成功 微信小程序本地和真机调试文件图片上传成功但体验版不成功 是因为要添加服务器域名! 先看一下 你小程…

解决jenkins配置extendreport不展示样式

下载插件:Groovy 、 HTML Publisher plugin 配置: 1)Post Steps : 增加 Execute system Groovy script , 内容: System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "&qu…

C++ | string

前言 本篇博客讲解c中的string类的使用(常用接口) 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee:普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 &#x1f389…

Magento2 常用命令以及技巧

1.Magento 命令行工具 Magento2 带有一个命令行工具,在windows下,用管理员权限打开MS-DOS命令提示符,然后cd到Magento根目录,运行下面命令,就可 以看到这个强大的命令行工具的命令清单: php bin/magentoU…

【C++】C++11中R字符串的作用

在 C11 中添加了定义原始字符串的字面量 1.定义和基本使用 定义方式为: R"xxx(原始字符串)xxx"其中 () 两边的字符串可以省略,R只会处理括号中的字符串。 原始字面量 R 可以直接表示字符串的实际含义,而不需要额外对字符串做转义…

半球房屋:高性价比的创新建筑选择—轻空间

在现代建筑领域,半球房屋因其独特的设计和高性价比受到广泛关注。这种建筑形式不仅在外观上引人注目,更在功能和经济效益上表现出色。以下将介绍半球房屋的主要优势,特别是其在成本和效益方面的突出表现。 降低建造成本,节约资源 …

资金管理平台 -SAP创建凭证测试程序及增强!

文章目录 主要程序创建程序程序 代码解析变量定义抬头和项目初始值表头赋值调用BAPI其他的子例程 核心内表增强部分LFACIF5D程序FI_DOCUMENT_CHECK完整程序 BADI增强 主要程序 创建程序 程序 &---------------------------------------------------------------------* *…

Matplotlib面积图绘制秘籍:让你的数据‘膨胀’起来,但不吹泡泡哦!

1. 引言 嘿,数据迷们!想不想让你的数据‘活’起来,跳一曲色彩斑斓的面积舞?Matplotlib面积图,不只是数字的堆砌,它是故事的讲述者,让复杂数据变得一目了然,还带点小幽默。快来一探究…

鸿蒙应用框架开发【首选项】 本地数据与文件

首选项 简介 本示例使用ohos.data.preferences接口,展示了使用首选项持久化存储数据的功能。 效果预览 使用说明 1.点击顶部titleBar的右侧切换按钮,弹出主题菜单,选择任意主题则切换相应的主题界面; 2.退出应用再重新进入&a…

C++客户端Qt开发——界面优化(美化登录界面)

美化登录界面 在.ui中拖入一个QFream,顶层窗口的QWidget无法设置背景图片,套上一层QFrame将背景图片设置到QFrame上即可 用布局管理器管理元素:用户名LineEdit,密码LineEdit,记住密码ComboBox,登录Button…

Windows本地构建镜像推送远程仓库

下载 Docker Desktop https://smartidedl.blob.core.chinacloudapi.cn/docker/20210926/Docker-win.exe 使用本地docker构建镜像和推送至远程仓库(harbor) 1、开启docker的2375端口 2、配置远程仓库push镜像可以通过http harbor.soujer.com:5000ps&am…

【C语言】数据类型全解析:编程效率提升的秘诀

目录 C语言数据类型详解1. 基本数据类型1.1 整型示例代码输出结果 1.2 浮点型示例代码输出结果 1.3 字符型示例代码输出结果 2. 派生数据类型2.1 数组示例代码输出结果 2.2 指针示例代码输出结果 2.3 结构体示例代码输出结果 2.4 共用体示例代码输出结果 3. 类型限定符3.1 cons…

为什么Word中正文总会变成标题?

问题 选中文字之后点击正文,格式总是会自动变成标题,然后出现在目录中,改不掉。 方法 是因为段落样式的大纲级别设置了标题级别 选中识别成标题的正文,右键选择段落,把大纲级别设置成正文就好。

微信小程序云开发订单微信支付与小票和标签打印的完整高效流程

一个字“全”!!! 前言一、流程设定1、如何开通云支付流程2、以订单下单为例的支付流程2.1 业务场景介绍2.2 业务场景流程图 二、代码与代码文件组成1、页面JS2、云函数payPre3、支付回调函数pay_cb3.1 准备条件3.2 必要认知3.3 pay_cb 完整函…

Llama 4训练已开启!Meta科学家最新采访,揭秘Llama 3.1是如何炼成的

Llama 3.1的诞生标志着人工智能领域的一个重要里程碑,它不仅是Meta在大型语言模型(LLM)研发上的一次重大突破,也代表了开源AI模型在技术进步和应用潜力上的新高度。以下是对Llama 3.1的炼成过程、观点阐述以及未来发展趋势的分析。…