【计算机网络】TCP原理 | 可靠性机制分析(二)

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【网络编程】【Java系列】
本专栏旨在分享学习网络编程、计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌

TCP协议为了保证数据传输的可靠性,所以发明了几种机制:确认应答、超时重传、连接管理(即三次握手四次挥手)来确保网络通信中进行数据传输的可靠性,本文中我们对连接管理(即三次握手四次挥手)来进行TCP可靠性分析的讲解。

目录

  • 一、三次握手
    • 三次握手的意义
  • 二、四次挥手
  • 三、三次握手四次挥手的丢包问题
  • 四、总结

一、三次握手

在TCP协议中,三次握手是用于建立连接的过程。客户端和服务器通过互相发送特定的控制报文来确认彼此的可达性和同意建立连接。这个过程确保了双方的通信能力,并且在开始数据传输之前建立了可靠的连接。
四次挥手则是用于关闭连接的过程。当一方决定关闭连接时,它会发送一个关闭连接的请求给另一方。对方确认接收后,双方分别关闭自己的数据传输,并最终确认关闭连接。这个过程确保了双方在结束通信后,释放资源并关闭连接。

在现实生活中,握手一般用于和对方打招呼,然后再开启后面的话题。网络通信中也是如此,我们通过“握手”来发送一个打招呼的数据(用于触发某些特定的场景,这些数据并不包含业务信息)。

然而A和B要想完成建立连接的过程,就需要3次这样打招呼的数据交互。我们来画张图来表示A、B双方3次打招呼的过程,请看下图:
在这里插入图片描述
上图中的四次“交互”完毕之后,A和B之间的连接就算是建立好了,注意,重点来了,上图中的交互看起来好像是4次,但实际上只有3次交互(因为中间两次的交互合并在一起了)。如下图:
在这里插入图片描述
中间的两次交互为什么要合并在一起呢,这样做的好处是什么:我们想一下,如果中间的两次交互分开来进行发送的话,那么这两次发送的数据就需要分别来进行封装,这个时候就需要封装两次;但是如果两次交互合并在一起发送的话,此时就只需要封装一次,成本自然是比封装两次低。综上,三次握手本质上是4次数据交互,只不过对中间两次数据交互进行了合并,两次交互合并成一次交互既可以节省了两次封装和分用的过程,也降低了成本,提高了效率
在这里插入图片描述

三次握手的意义

  • 第一点:投石问路

三次握手也是TCP保证数据传输可靠性的一种方式:TCP要想保证数据传输的可靠性,就需要以网络传输、网络路径畅通为前提,还可以验证每个主机的发送能力和接收能力是否正常,简单来说三次握手的意义就是投石问路

  • 第二点:消息协商
    TCP通信过程中,有很多信息需要进行协商,协商这个信息是不是属于本次连接的。为什么这么说呢?是因为网络上传输的信息可能是后发先至的,比如说现在有一个信息迟到了,而此时这个信息所属的连接早就关闭了(服务器与客户端已经断开了上一个连接),此时是一个重新建立的连接,这个时候我们就可以通过消息的信号来明显的识别出这个消息是属于上一个连接的,所以直接将这个连接丢掉即可

综上三次握手主要有两个主要意义:意义1(投石问路):通过投石问路可以验证网络是否发生故障,也可以验证通信双方的发送接受能力是否正常。意义2(消息协商):通过协商必要的参数来使客户端和服务器使用相同的参数进行消息传输。

二、四次挥手

四次挥手即断开服务器和客户端之间的连接。我们只要连接的概念就是通信双方各自在内存中保有通向双方对端的信息,如果我们需要断开连接的话,我们就需要及时释放上面内存中的对端信息。

补充:三次挥手一定是客户端主动向服务器发起的请求;但是四次挥手不一定是谁向谁发起的请求,但绝大多数的情况下都是客户端主动向服务器发起请求建立连接的。

下面是四次挥手
在这里插入图片描述
经过上述的四个步骤之后,连接就彻底断开不再使用了,通信双方会各自释放内存中存储的对端信息。

四次挥手能不能3次来完成呢:这是不可以的,这里我们要明确,有些时候四次挥手确实是可以分为三次来完成的,但是有些时候就不能通过三次即必须通过四次来完成断开连接的任务。最主要的一个原因就是FIN的触发时应用程序的代码来进行控制的:通过调用socket.close()或者线程结束就会触发FIN(对比三次握手中的ACK,ACK(应答报文)并不是通过应用程序的代码来控制的,ACK是通过内核来进行控制的(接收到FIN之后就会立刻返回ACK,是瞬发的))。
如果 socket.close() 执行较慢,也就是客户端和服务器在关闭连接时耗费了一定的时间,即客户端发送FIN包后,服务器需要一定时间才能确认并回复ACK包。在这段时间内,服务器可能还有遗留的数据需要发送给客户端,而合并这两个步骤将无法保证服务器的数据顺利发送给客户端。
因此,为了确保数据的正常传输和保证双方的连接状态同步,四次挥手中间的两个步骤不能合并。它们分别代表了客户端和服务器关闭连接的过程,并且保证了数据的完整性和可靠性。

如果服务器始终不进行close会发生什么:
在这里插入图片描述
如果服务器始终不进行关闭的话,此时TCP的状态就会处于CLOSE_WAIT状态(如上图,调用close方法之后TCP的状态就转化为LAST_ACK状态),此时造成如下情况:
情况1:对于服务器来说此时的连接虽然没有关闭,但是此连接实际上是没办法使用的。
情况2:针对socket进行读操作的话,如果数据还没有读完(即缓冲区还有数据),那么数据依然可以正常读到;如果数据已经读完了的话,此时就会读到EOF(对于字节流来说,返回-1;如果是scanner,hashNext就会为false)。
情况3:针对socket进行写操作的话,此时就会直接触发异常。
其它情况:比如说代码忘记调用close方法了,对于客户端来说收不到对方的FIN此时就会等待,但是如果直接等不到的话,那么客户端就会单方面放弃连接,释放对端信息资源(当然理想状态下,我们希望客户端和服务器双方都能够释放对端信息资源,但是如果做不到的话,此时是不影响客户端或者服务器单方面释放对端信息资源的)

三、三次握手四次挥手的丢包问题

三次握手四次挥手过程中,如果出现了丢包的情况,此时依然是会触发重传机制的,即尽可能的进行重传,如果重传多次依然没有重传成功的话,此时就会单方面放弃连接的尝试并释放对端的信息资源。

三次握手的丢包问题:

  • 第一次握手时,客户端发送SYN数据包到服务器,如果发生丢包则无法建立连接,此时TCP协议就会触发超时重传机制,客户端就会再次发送SYN数据包。
  • 第二次握手时,服务器接收到来自客户端超时重传过来的SYN数据包后,会发送SYN-ACK数据包回应给客户端,当然SYN-ACK数据包有可能丢包,此时就会触发超时重传。如果超时重传多次之后客户端依然没有接收到SYN-ACK数据包,则客户端则任务服务器不可达,并放弃建立连接的尝试
  • 第三次握手时,客户端接收到来自服务器的SYN-ACK数据包(当然可能是超时重传过来的SYN-ACK数据包)之后,此时客户端就会向服务器发送ACK数据包(表示客户端已成功收到来自服务器的 SYN-ACK 应答,可以建立连接。)。如果服务器没有接收到ACK数据包,此时依然会发生超时重传机制。如果发生了丢包,那么服务器并不知道客户端接收到了 SYN-ACK 应答,因此连接无法建立。

四次挥手过程中的丢包:

  • 第一次挥手:客户端向服务器发送FIN数据包,表示要关闭连接。如果发生丢包,则服务器会继续等待客户端发送FIN数据包,如果服务器一直没有接收到FIN数据包的话,TCP协议就会触发超时重传。
  • 第二次挥手:服务器接收到FIN数据包之后,就会向客户端发送ACK数据包,如果发生丢包,则会触发超时重传。
  • 第三次挥手:如果客户端没有接收到ACK的话,则触发超时重传,如果超时重传多次后依然没有ACK数据包,客户端可能任务服务器已经关闭连接,并释放对端的资源。
  • 第四次挥手:。极端情况:在四次挥手过程中,如果第四步中 ACK 数据包被丢失,服务器会认为客户端仍然没有确认连接关闭的请求,因此会认为连接没有完全关闭,会继续等待客户端的确认,并尝试不断发送 FIN 数据包,直到达到超时时间为止。如果 FIN 数据包的重传次数达到上限,服务器会认为连接已经关闭,释放资源。

四、总结

我们现在已经知道TCP协议通过确认应答、超时重传、连接管理来进行保证数据传输的可靠性,其中起到决定性作用的是确认应答,连接管理即三次握手四次挥手在一定程度上可以用来检验网络是否可靠,而确认应答可以则保证每次数据传输都是可靠的。

本文到这里就结束了,希望友友们可以支持一下一键三连哈。嗯,就到这里吧,再见啦!!!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何做好档案统一管理?

档案统一管理是指将一个组织或机构的所有档案资料进行集中管理和整理的一种管理方式。档案统一管理的目标是确保档案的完整性、准确性和可访问性,提高档案的利用价值和管理效率。 要做好档案统一管理,需要以下几个步骤: 1. 确定档案的分类与命…

【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(2)

前言 前文介绍了 NXP S32K3 以太网 RMII 接口调试的开发环境搭建,下面开始详解软件调试步骤。没看过第一节的小伙伴请移步《【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(1)》,话不多说我们直接进入正题。 lwip Stack 介绍 …

debug OpenBLAS library 和 应用示例

1. 构建openblas lib git clone gitgithub.com:OpenMathLib/OpenBLAS.git cd OpenBLAS/ 如果要安装在自定义文件夹中,可以修改 PREFIX 的定义: 将 PREFIX /opt/OpenBLAS 修改成 PREFIX ../local/ 然后构建: make -j make install 如果要…

09.面向对象进阶

面向对象进阶 在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程进行更为深入的了解。 property装…

OpenAI ChatGPT-4开发笔记2024-03:Chat之Tool和Tool_Call(含前function call)

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了,必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…

考公还是互联网?

来源 花了 10 小时检索,汇总的有效信息 V2EX,牛客,Google,Bing,广东省人事考试网,国家公务员局,B站,小红书,知乎,掘金,Github,公务员…

Rollup-plugin-bundle-analyzer VS Rollup-plugin-visualizer

分析和可视化Rollup打包后的文件的插件 Rollup-plugin-bundle-analyzerRollup-plugin-visualizer Rollup-plugin-bundle-analyzer和Rollup-plugin-visualizer都是用于分析和可视化Rollup打包后的文件的插件,但它们在功能和使用方式上存在一些差异。 Rollup-plugi…

低成本高回报:如何利用免版素材库提升设计品质?

免版素材库起源于互联网的发展,是指一种包含大量图片、图标、字体等创意资源的网站或平台,这些资源多为设计师和相关行业人士创作,并免费提供给用户使用。免版素材库的资源通常遵循一定的授权协议,如CC0(Creative Comm…

Python pip 常用指令

前言 Python的pip是一个强大的包管理工具,它可以帮助我们安装、升级和管理Python的第三方库。以下是一些常用的pip指令。 1. 安装第三方库 使用pip安装Python库非常简单,只需要使用pip install命令,后面跟上库的名字即可。 # 安装virtuale…

【leetcode 447. 回旋镖的数量】审慎思考与推倒重来

447. 回旋镖的数量 题目描述 给定平面上 **n **对 互不相同 的点 points ,其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。 返回平…

加速科技ST2500 数模混合信号测试设备累计装机量突破500台!

国产数字机,测试中国芯!新年伊始,国产半导体测试设备领军企业加速科技迎来了振奋人心的一刻,ST2500 数模混合信号测试设备累计装机量突破500台!加速科技凭借其持续的创新能力、完善的解决方案能力、专业热忱的本地化服…

企业级快速开发平台可以用在什么行业?优点多吗?

应用专业的企业级快速开发平台可以带来什么效果?目前,低代码技术平台在很多领域都获得了广泛应用和推广,在实现高效率办公、流程化办公和数字化发展中扮演了非常重要的角色,具有举足轻重的作用。针对这个话题,现在将给…

外汇天眼:台北妇女轻信假投资诈骗话术,小赚1万却惨赔1500万

当今社会物价急速上涨,许多民众为了避免资产因通膨缩水,纷纷开始寻找各种能增加收入的渠道,因此投资理财日渐受到重视。 然而,诈骗集团也注意到这趋势,并且推出虚假的投资平台或方案,以各种话术行骗。 不久…

【css】快速实现鼠标悬浮变色效果

<div class"nav-item"><div class"ic-img"></div><div>切换</div> </div>.nav-item {width: 100rem;height: 45rem;line-height: 45rem;display: flex;text-align: center;justify-content: center;align-items: cent…

用python提取word中的所有图片

使用word中提取的方式图片会丢失清晰度&#xff0c;使用python写一个脚本&#xff0c;程序运行将弹出对话框选择一个word文件&#xff0c;然后在弹出一个对话框选择一个文件夹保存word中的文件。将该word中的所有图片都保存成png格式&#xff0c;并命名成image_i的样式。 程序…

go image.DecodeConfig 和image.Decode 不能同时使用吗

问题场景&#xff1a;在同时使用go image.DecodeConfig 和image.Decode获取图片信息时&#xff0c;报错提示&#xff1a; 无法读取图像配置 image: unknown format package mainimport ("fmt""github.com/golang/freetype""image""image/d…

软件压测工具有哪些功能和特点

目前市场上有许多成熟的压测工具&#xff0c;开发人员可以根据自己的项目特点和需求选择合适的工具进行压力测试。本文将介绍软件压测工具的功能和特点&#xff1a; 一、软件压测工具定义 软件压测工具是一种专门设计用于模拟大量用户并发访问系统的工具。通过模拟真实场景中的…

1876_电感的特性小结

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! 1876_电感的特性小结 主要是…

服务器运维工具推荐——站长、运维必看!

服务器运维是确保服务器系统稳定运行并保持高效性的重要工作。为了提高运维工作的效率&#xff0c;使用一些优秀的服务器运维工具是非常必要的。使用了解多款运维工具后&#xff0c;总结了几款还不错的工具&#xff1a; 1、Zabbix &#x1f4d2;简介&#xff1a;Zabbix是一款开…

分析一个项目(微信小程序篇)二

目录 首页&#xff1a; 发现&#xff1a; 购物车&#xff1a; 我的&#xff1a; 分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够知道每个组件所处在哪个位置&#xff0c;发挥什么作用。 接…
最新文章