当前位置: 首页 > news >正文

Java EE|TCP/IP协议栈之TCP协议工作机制上

文章目录

    • 前言
    • 一、确认应答
    • 二、超时重传
    • 三、连接管理
      • 三次握手
      • 四次挥手

前言

前边,我们已经大概交代了TCP的报文结构。但是仍有一些字段我们不确定到底怎么理解,这里就分析TCP的内部工作机制了。

TCP的内部很复杂,有很多机制,这里我们只讨论比较核心的10个机制。

本篇,我们先介绍前3个。

一、确认应答

对于这个机制,我们需要了解以下几点:

  1. TCP中,确认应答是实现可靠传输的核心机制。
  2. 这里的可靠传输,不是说我们发的报文一定传输过去了,而是说对于报文发送成功与否,发送方都会收到一个信号,告诉我们。
  3. 这里的信号就是我们前边提到的六个标志位其一——ack(acknowledge)。它是由接收方发送的。倘若报文带有这条标志,那么我们就可以认为我们发送成功了。此时这个报文也叫做应答报文。
  4. 特殊情况:短时间内连续发送消息,可能出现后发先至的情况。原因是两个主机之间存在多条线路,转发效率也会有所不同。
  5. 如何规避后发先至:给传输的数据和应答报文都进行编号,即使乱了也知道如何进行排序。这里的功能就是通过我们的32位序号和32位确认序号来实现的。

下边,我们就后发先至的规避做进一步的解释:

  • 任何数据都有序号,而确认序号只有应答报文的有效。

  • TCP是面向字节流的,所以这里的编号不是按照第一条、第二条……的方式编号的,实际上也是按照字节流进行编号的。

    这里可能会比较抽象,我们图解一下。
    在这里插入图片描述

为了加深印象,我们这里举个小例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y6EHPC42-1677236750695)(F:\typora插图\image-20230221201437283.png)]

小结:TCP可靠传输能力,最主要的就是通过应答机制保证通过应答报文,就可以让发送方清楚的知道,传输是否成功,进一步通过序号和确认序号对应答报文的顺序进行说明。

二、超时重传

上边的例子里边我们是基于发送成功的前提下进行讨论的,倘若发送失败了呢?TCP采取怎样的策略应对呢?这也就是我们接下来要说的超时重传。

这里我们需要知道一下几个点

  1. 发送失败即丢包,有两种情况。一是发的数据包丢了,二是接收方返回的ack丢了。这里发送方看到的效果就是结果丢了,它会一视同仁,认为是丢包了。
  2. TCP重传引入了一个时间阈值。发送后就会等待ack,进行计时。具体时间根据业务而定。
  3. 重传机制是在丢包后会重新发送n次同样的数据。但是这里的n也不会太大,太大也没有意义。因为连续重传都丢,概率很低(乘法公式)
  4. 重传达到一定次数,不会继续重传,会认为是网络出现故障,接下来TCP会尝试断开重连,若重置还失败就彻底断开。
  5. **对于重传由特殊处理——去重。**TCP存在“接收缓冲区”和发送缓冲区这样的存储空间。主机B收到主机A的数据,其实是B的网卡读到了数据,把这个数据放到了socket/网卡的接收缓冲区【优先级阻塞队列】中。根据数据的序号,TCP很容易识别当前接收缓冲区里的两条数据是不是重复【根据序号进行排序,若相同就去重】。若重复,则把后来这份data丢弃了,保证app调用read读取的数据一定是不重复的。

小结:由于去重和重新排序发送方只发现ack未按时到达,就会触发重传机制。即使重复发送了也没关系,接收方能处理好,去重和排序都依赖于TCP报头的序号。

确认应答和超时重传机制两者相互配合,共同支撑了可靠传输。

注:不是说只有这两个,而是说这两个是最重要的,是支柱一样的存在。

三、连接管理

这里的连接是connection,不是链接link。注意进行区分。前者是AB建立连接,互相记录对方的信息(例如端口号),后者是快捷方式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DeUdjj3u-1677236750696)(F:\typora插图\image-20230221205409033.png)]

注意:这里虽然网络层的ip协议是在传输层下边,但ip的获得跟位置无关,因为它相当于是经过了一个u型的过程。

这里的管理描述了连接如何创建,如何断开。也就是我们经常说的三次握手四次挥手。这也是我们这里要讨论的超级重重点内容!!!

三次握手

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZwDWx5eN-1677236750696)(F:\typora插图\image-20230221210609686.png)]
所以实际的例子效果应该是这样滴

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ulk0bnJA-1677236750697)(F:\typora插图\image-20230221210633777.png)]

  • 这里我们有一个问题,不合并可以不?

    答:不可以,因为封装分用(一条报文从发送到接收)有开销,合并后成本降低,OS也不是冤大头。

  • 那么问题又来了,怎么确定合并了呢?

    答:合并后接收方收到的效果是一条,只不过有两个作用。具体细节略过。

  • 可以只两次握手吗?

    答:不可以,这个确认是双方的,双方的发送能力、接受能力都需要被确认!!

相信通过这个例子,我们已经能理解个七七八八了,下边我们就看看教科书上的真正的三次握手的过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K9c0el6B-1677236750698)(F:\typora插图\image-20230221212324250.png)]

对于这里的状态,我们不做过多讨论,只记住几个常见的即可。其中established(已连接的)、listen(服务器状态)表明服务器已准备就绪,随时可与客户端建立连接。

三次握手的意义:

  1. 让通信双方各自建立对对方的认同
  2. 验证通信双方各自发送和接受能力是否正常
  3. 通信双方协商一些重要参数

小结

所谓的三次握手本质上是四次交互,通信双方各自向对方发起一个建立连接的请求,同时再向对方发一个ack。

三次握手的流程(一般是进行图解)

三次握手的意义

四次挥手

三次握手就是建立连接,与之对应的,四次握手就是断开连接。
在这里插入图片描述

下边我们基于这个图,具体来讨论四次挥手的过程及作用。

对于服务器:

ESTABLISHED -> CLOSE_WAIT: 当客户端主动关闭连接(调用close),服务器会收到结束报文段,服务器返回确认报文段并进入CLOSE_WAIT;
CLOSE_WAIT -> LAST_ACK:进入CLOSE_WAIT后说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用close关闭连接时,会向客户端发送FIN,此时服务器进入LAST_ACK状态,等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)
LAST_ACK -> CLOSED: 服务器收到了对FIN的ACK,彻底关闭连接。

对于客户端:

已连接到FIN_WAIT1状态:客户端主动调用close时,向服务器发送结束报文段,同时进入FIN_WAIT_1 。

FIN_WAIT_1 -> FIN_WAIT_2 :站在客户端角度,客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2,开始等待服务器的结束报文段 。

FIN_WAIT_1 -> TIME_WAIT:客户端收到服务器发来的结束报文段,进入TIME_WAIT,并发出LAST_ACK。

TIME_WAIT -> CLOSED :客户端要等待一个2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSED状态 。避免中间出现意外。

____________________________________

这里的TIME_WAIT是额外工作的保障,一定程度上解决了丢包这样的情况。

____________________________________

【中间流程,状态只是中间流程的结果】

试想,这个和三次握手的四次交互不是挺像的吗?这里不可以中间合并吗?如果不能合并,为什么?

不能。原因是ACK的发送是由内核控制的,FIN的发送是由应用调用socket的close方法,进程退出才会触发FIN。

两者的发送很大概率不是同一时机。所以绝大多数情况下是不会同时发送。所以我们将其认为是不可合并的。

这里的TIME_WAIT约定的时间是2MSL,具体是多长?不会太短了吗?

TIME_WAIT这个数值的含义是互联网上两个节点之间数据传输消耗的最大时间。

而这里的2MSL并不是不变的,MSL是可以自己设定的,但是实际开发过程中我们一般把它设置成一个经验值——60秒,那么对于这里的2MSL就是120秒。

小结:

TCP作为一个有连接的协议,需要建立连接和断开连接,其中建立连接时三次握手,断开连接时四次挥手。

三次握手的意义:双方建立认同感;确认双方发送接收能力没有问题;协商通信过程的一些关键参数。

四次挥手不可以合并成三次挥手的原因。

TIME_WAIT意义和作用。

相关文章:

Java EE|TCP/IP协议栈之TCP协议工作机制上

文章目录前言一、确认应答二、超时重传三、连接管理三次握手四次挥手前言 前边,我们已经大概交代了TCP的报文结构。但是仍有一些字段我们不确定到底怎么理解,这里就分析TCP的内部工作机制了。 TCP的内部很复杂,有很多机制,这里我们…...

智能化人机协作 遮挡情况下准确识别目标信息

研究背景 废旧产品(end-of-life products)的拆卸是工程全生命周期管理的一个基本步骤。在减少资源消耗和温室气体排放的同时,回收可重复使用的部件可能创造相当的经济价值,同时也能推动碳中和目标的实现。 但目前EoL的拆卸仍然严…...

React(一):初识React、类组件、jsx的基础语法

React(一)一、初识React1.简单介绍2.React的三个依赖3.Hello React案例二、类组件1.定义类组件并渲染2.绑定事件函数(奇怪的this问题)3.数组形式数据的展示(电影案例)4.计数器案例三、jsx语法详解1.jsx的书…...

2023-2-24 刷题情况

获取单值网格的最小操作数 题目描述 给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x 。 单值网格 是全部元素都相等的网格。 返回使网格化为单值网格所需的 最小 操作数。如果不能,返…...

测试员拿到新项目怎么着手测试?不要慌,照做准没错

一、目标 结合公司现有的项目情况制定合理规范的测试流程,提高测试效率和产品质量,尽可能减少客户对产品的问题反馈, 核心还是要加强项目组成员之间的工作交流和沟通,保证整个项目的高效率的按质按量的交付。 二、测试流程说明…...

通过cfssl自签证书https证书

背景 公司内部自建Web服务,通过自签CA,然后签发https证书 工具地址: GitHub - cloudflare/cfssl: CFSSL: Cloudflares PKI and TLS toolkit 使用步骤: 1. 在release页面中下载最新的二进制包,我使用的是1.5的解压并重命名二进制文件 tar…...

openEuler部署Ceph集群(块存储)

openEuler部署Ceph集群1 目标2 环境2.1 服务器信息2.2 软件信息3 部署流程3.1 获取系统镜像3.2 创建虚拟机3.3 配置虚拟机3.3.1 配置互信3.3.2 关闭防火墙3.3.3 配置免密登录3.3.4 配置NTP3.3.4.1 安装NTP服务3.3.4.2 配置NTP服务端3.3.4.3 配置NTP客户端3.3.4.4 启动NTP服务3.…...

npm install vue2-ace-editor 安装报错

npm install vue2-ace-editor 安装报错,如下图 目录 npm install vue2-ace-editor 安装报错,如下图 🧨🧨🧨解决方法:在命令后面加上 神秘代码 npm install vue2-ace-editor --save --legacy-peer-deps &a…...

【PyQt5图形界面编程(2)】:创建工程

创建工程 一、创建工程二、开始开发1、运行Qt5Designer,创建QT窗口2、运行pyUIC,转换xx.ui成xx.py3、main.py中引用xx.py中的类4、打包main.py成main.exe来发布5、执行终端报警处理方法三、其他(如果涉及)1、配置环境变量一、创建工程 采用虚拟环境来创建工程 相关的paka…...

ansible实战应用系列教程9:管理inclusions

ansbile实战应用系列教程8:管理inclusions InclusionsIncluding TasksIncluding VariablesInclusions 当处理复杂或冗长的剧本时,管理员可以使用单独的文件将任务和变量列表划分为更小的部分,以便于管理。在playbook中引入外部任务文件和变量有多种方法。 方法一:tasks使用…...

MyBatis学习笔记(五) —— MyBatis获取参数值的两种方式

5、MyBatis获取参数值的两种方式 MyBatis获取参数值的两种方式:${} 和 #{} ${} 的本质就是字符串拼接, #{} 的本质就是占位符赋值 ${} 使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号&a…...

go module构建项目

在go 1.11版本中引入了Go Module内置的包管理模块,是GOPATH的替代品,集成了版本控制和软件包分发支持的功能。即go使用modules管理依赖,项目依赖构建时不需要再依赖GOPATH环境变量。 要使用go module首先要激活modules .升级go到1.11版本 .这…...

已经准备上千道软件测试面试题了,建议大家收藏!!!还有视频详解!

2023华为软件测试笔试面试真题,抓紧收藏不然就看不到了_测试小鬼的博客-CSDN博客_华为软件测试工程师面试题1、对计算机软件和硬件资源进行管理和控制的软件是(D)A.文件管理程序B.输入输出管理程序C.命令出来程序D.操作系统2、在没有需求文档…...

C++设计模式(19)——访问者模式

亦称: Visitor 意图 访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。 问题 假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。 图像中的每个节点既能代表复杂实体 (例如一座城市)&#xf…...

ChatGPT 的工作原理:机器人背后的模型

这篇对支持 ChatGPT 的机器学习模型的温和介绍,将从大型语言模型的介绍开始,深入探讨使 GPT-3 得到训练的革命性自我注意机制,然后深入研究人类反馈的强化学习,使 ChatGPT 与众不同的新技术。 大型语言模型 ChatGPT 是一类被称…...

FreeRTOS入门(04):中断、内存、追踪与调试

文章目录目的中断内存堆(heap)栈(stack)断言调试总结目的 有了前面的几篇文章 FreeRTOS 基本上已经可以在项目中使用上了: 《FreeRTOS入门(01):基础说明与使用演示》 《FreeRTOS入门…...

【C语言】带你彻底理解指针(1)

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨ 文章目录指针的介绍:一、简单指针🌈1.1 指针的定义与使用1.2 指针与数组二、指针数组✨三、数组指针🌞3.1 数组指针的定义3.2 ”数组名“与”&数组名“3.…...

C/C++ 中 JSON 库的使用 (CJSON/nlohmann)

C/C 中 JSON 库的使用 (CJSON/nlohmann)概述cjson基本操作从(字符指针)缓冲区中解析出JSON结构转成成JS字符串(将传入的JSON结构转化为字符串)将JSON结构所占用的数据空间释放JSON 值的创建创建一个值类型的数据创建一个对象(文档&#xff09…...

【Opencv项目实战】目标检测:自动检测出现的所有动态目标

文章目录一、项目思路二、算法详解2.1、计算两个数组或数组与标量之间的每个元素的绝对差。2.2、轮廓检测 绘制物体轮廓 绘制矩阵轮廓2.3、连续窗口显示2.4、读取视频,显示视频,保存视频三、项目实战:实时动态目标检测实时动态目标检测一、…...

活动报名:Tapdata Cloud V3 最新功能全解与核心应用场景演示

作为中国的 “Fivetran/Airbyte”, Tapdata Cloud 自初版公测以来,已累积10,000 注册用户。核心场景包括 Any Source → Any Target 的实时数据库同步、数据入湖入仓,以及通用 ETL 处理等。近期,功能特性全面优化的 Tapdata Cloud V3 也已开放…...

人工智能AI威武,爱也……恨也……

人工智能AI威武,爱也!恨也!!它会创作会代码,从它那儿能仿到更好的思维;多它那里可以学到更好的代码。它聪慧全能,成为一坨人偷懒神器;变成“智者”作弊的“倚天屠龙”!&a…...

SpringBoot-基础篇

SpringBoot基础篇 ​ 在基础篇中,我给学习者的定位是先上手,能够使用SpringBoot搭建基于SpringBoot的web项目开发,所以内容设置较少,主要包含如下内容: SpringBoot快速入门SpringBoot基础配置基于SpringBoot整合SSMP…...

Tapdata Connector 实用指南:实时数仓场景之数据实时同步至 ClickHouse

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata 是一个以低延迟数据移动为核心优势构建的现代数据平台,内置 60 数据连接器,拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力,以及低代码可视化操作…...

刷题专练之数组移除元素

文章目录前言一、移除元素1.题目介绍2.思路:3.代码二、移动零1.题目介绍2.思路3.代码三、删除有序数组中的重复项1.题目介绍2.思想3.代码四、80. 删除有序数组中的重复项 II1.题目介绍2.思路3.代码4.推荐题解前言 我每个刷题篇的题目顺序都是特别安排的,…...

常见激活函数Activation Function的选择

Activation Function激活函数一般会神经网络中隐层和输出层上,其中作用在输出层主要用于适配输出,比如sigmoid函数可用于生成[0,1]之间的概率估计值。而作用于隐层主要用于增加神经网络的非线性,增加了网络的表达能力,本文主要介绍…...

大厂跟进ChatGPT,为什么百度“文心一言”成色最好?【快评】

作者 | 曾响铃 文 | 响铃说 赶ChatGPT热度,百度3月初就要发布与ChatGPT类似的人工智能聊天机器人服务“文心一言”(英文名:ERNIE Bot),似乎无法提振资本市场对百度的信心。 2022年第四季度及全年未经审计的财报发布…...

ChatGPT和Web3:人工智能如何帮助您建立和发展您的 Web3 公司

ChatGPT是OpenAI在2022年11月推出的聊天机器人。该机器人建立在OpenAI的GPT-3人工智能家族上,并通过监督学习和强化学习技术进行了优化。 与ChatGPT机器人聊天时,你会感觉自己在与一个懂得一切并以非常教育性的方式回答的朋友交谈。回答在许多知识领域非…...

【人工智能 AI】怎样实施RPA 机器人流程自动化(Robotic Process Automation)?核心技术有哪些?

文章目录 RPA 简介RPA的实施RPA的核心技术1. 自动化测试(1)自动化测试工具(2)自动化测试框架2. 自动化脚本(1)自动化脚本语言(2)自动化脚本框架3. 机器学习(1)机器学习模型(2)机器学习框架(3)自然语言处理(4)图像处理(5)深度学习(6)机器人操作系统RPA核心能…...

基于BP神经网络的性别识别,BP神经网络详细原理,自编码神经网络代码,神经网络案例之18

目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 数据 神经网络参数 基于BP神经网络 性别识别的MATLAB代码 效果图 结果分析 展望 背影 男人体内蛋白质比例大,女生…...

2023年消费电子行业研究报告

第一章 行业概况 消费电子行业是电子信息行业的子行业。消费电子是指围绕着消费者应用而设计的与生活、工作和娱乐息息相关的电子类产品,通常会应用于娱乐、通讯以及文书用途,最终实现消费者自由选择资讯、享受娱乐的目的,主要侧重于个人购买…...