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

news2025/7/20 22:31:21

文章目录

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

前言

前边,我们已经大概交代了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意义和作用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Super intelligent port AI smart port termial, CIMCAI top port AI

中国上海人工智能企业CIMCAI,全球港航人工智能领军者企业,顶尖AI科技及工业级成熟人工智能产品,打造高效能智能化港口数字化航运码头数字化。Ceaspectus™领跑全球港口人工智能,建设新一代高效能先进港口码头。Ceaspectus™先进方…

通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作

1.通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作 例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输入led2off,开饭led2灯熄灭 5.例如在串口输入led…

苹果电容笔和普通电容笔区别是什么?开学好用电容笔推荐

苹果的电容笔与一般的电容笔有何不同呢?两者的差距并不是很大。不过这款原装的苹果电容笔,重量要普通的电容笔重得多,而且笔尖还有一个特殊的重力感应装置,在其他方面两者并没有太大的差异。但是,由于苹果电容笔的售价…

QT自绘标题和边框

在QT中如果想要自绘标题和边框,一般步骤是: 1) 在创建窗口前设置Qt::FramelessWindowHint标志,设置该标志后会创建一个无标题、无边框的窗口。 2)在客户区域的顶部创建一个自绘标题栏。 3)给窗口绘制一个背…

Hadoop的生成经验调优和基准测试

文章目录(1)项目经验之HDFS存储多目录(2)项目经验之集群数据均衡(3)项目经验之Hadoop参数调优(4)项目经验之支持LZO压缩配置(5)项目经验之LZO创建索引&#x…

软考中级--嵌入式系统设计师考试培训教程开始了

1.考试时间: 1.1 上半年5月下旬考试 1.2 下半年11月上旬考试 2.考试内容 2.1 系统基础 满分75分 时间150分钟 2.2 系统设计 满分75分 时间150分钟 3.计划安排 3.1 熟悉考试大纲 3.2 按考纲学习相关内容 整理设计知识 快速学习形成知识印象 3.3 复习整理的知识 …

Hadoop3.3.1完全分布式部署

Hadoop目录Hadoop3.3.1完全分布式部署(一)1、HDFS一、安装1、基础安装1.1、配置JDK-181.2、下载并解压hadoop安装包本地运行模式测试 eg:2、完全分布式运行模式1、概要:2、编写集群分发脚本,把1~4步安装的同步到其他服务器:2.1、创建脚本vim …

Tailwind CSS 在Vue中的使用

什么是Tailwind CSS? Tailwind CSS 是一个功能类优先的 CSS 框架,它集成了诸如 flex, pt-4, text-center 和 rotate-90 这样的的类,支持 hover 和 focus 样式,它们能直接在脚本标记语言中组合起来,构建出任何设计。 …

【算法基础】 Trie树

一、Trie树Trie树用于高效存储和查找字符串集合的数据结构。二、Trie字符串统计维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。共有 N�个操作,所有输入的字…

c#前端实现对pcl点云颜色根据强度特征动态变化突出指定对象

前言 本文主要介绍如何使用c# winform对点云颜色根据点云强度信息对显示的点云颜色进行动态调整。 目的是根据强度信息采用不同的颜色特征突出不同的物体。 一、点云强度是什么? 点云强度又可以叫做反射率, 通常常见的点云格式包括:以pcl为…

SpringBoot可以同时处理多少请求?

本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star ⭐⭐⭐⭐⭐转载请注明出处:https://blog.csdn.net/weixin_43461520/article/details/129207427 前言 前两天面试的时候,面试官问我:一个i…

【拿好了!Linux 运维必备的 13 款实用工具!】

​本文介绍几款 Linux 运维比较实用的工具,希望对 Linux 运维人员有所帮助。 查看进程占用带宽情况 – Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载: http://sourceforge.net/projects/nethogs/files/ne…

NPDP认证|产品研发过程中,产生冲突怎么办?

随着传统行业在研发过程中牵涉到很多利益相关方,这些相关方在产品研发过程中关注角度的不同,会产生各种各样的矛盾冲突,如研发与产品的冲突、运营与产品的冲突、客户与产品的冲突,那么产生冲突的原因是什么呢? 产生冲突的原因? 1…

Redis:实现全局唯一ID

Redis:实现全局唯一ID一. 概述二. 实现(1)获取初始时间戳(2)生成全局ID三. 测试为什么可以实现全局唯一?其他唯一ID策略补充:countDownLatch一. 概述 全局ID生成器:是一种在【分布式…

墨天轮发布数据库行业报告,创邻科技Galaxybase大放异彩

近日,知名数据库社区墨天轮发布《2022中国数据库行业年度分析报告》,该报告由墨天轮联合业界专家学者共同编写,共122页,详细总结了2022年数据库行业产学研用的发展近况、挑战以及对未来趋势的展望。旨在于给数据库行业带来有价值的…

Hadoop命令大全

HDFS分布式文件系统 , 将一个大的文件拆分成多个小文件存储在多台服务器中 文件系统: 目录结构(树状结构) "/" 树根, 目录结构在namenode中维护 目录 1.查看当前目录 2.创建多级目录 3.上传文件 4.查…

狂神说:面向对象(二)

一、创建与初始化对象new分配内存空间、默认初始化、构造器调用二、构造器特点:1. 没有返回值 2. 方法名与类名相同类里面啥都没写的时候,new一个这个类对象,java会生成一个默认构造函数(构造器):构造器核心…

公司新招了个腾讯5年经验的测试员,让我见识到什么才是真正的测试天花板····

5年测试,应该是能达到资深测试的水准,即不仅能熟练地开发业务,而且还能熟悉项目开发,测试,调试和发布的流程,而且还应该能全面掌握数据库等方面的技能,如果技能再高些的话,甚至熟悉分…

Qt 进程间通信

Qt进程间通信的方法: TCP/IPLocal Server/Socket共享内存D-Bus (Unix库)QProcess会话管理 TCP/IP : 使用套接字的方式,进行通信(之前介绍了,这里就不介绍了)。 Local Server/Socket…

智能家居之主机--驱动层搭建

智能家居之主机--驱动层搭建bsp-底层驱动bsp_gpiobsp_adcbsp_uartbsp_timer伪调度bsp-底层驱动 bsp_gpio 利用一个config.h的配置文件,把所有要使用的gpio的属性配置好,这样有一个好处,比较集中,也比较好查,不需要一个…