当前位置: 首页 > 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 也已开放…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

idea大量爆红问题解决

问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

uniapp中使用aixos 报错

问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...