JavaEE|TCP/IP协议栈之TCP协议工作机制下

news2024/12/23 14:08:42

文章目录

    • 一、滑动窗口
    • 二、流量控制
    • 三、拥塞控制
    • 四、延时应答
    • 五、捎带应答
    • 六、面向字节流(了解)
    • 七、异常情况(了解)
    • 关于其他传输层协议

一、滑动窗口

为什么要引入滑动窗口?

确认应答和超时重传为TCP可靠传输机制提供支持。但同时也带来了效率上的折损。(Vudp>Vtcp)

为了减小速度降低的幅度,引入了滑动窗口机制。

什么是滑动窗口?

这其实是一个形象的比喻。原来我们的客户端/服务器收到数据就会立即尝试返回ACK,而当短时间内大量数据发送过来时,其他数据的发送就需要阻塞等待了。

而我们通过让多段的等待时间重叠在一起,一次发送多条数据,大大提高收发性能。其中这里等待时间重叠在一起的多段报文排列在一起,相当于有个隐形的框框,而这个框又动的所以我们把它称为滑动窗口。
在这里插入图片描述

这里的窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。

滑动窗口在这里具体怎么发挥作用的?

通过上边对定义的阐述,其实我们不难发现,这里效率的得以提高本质上其实是降低了确认应答等待ACK消耗的时间。(这里与IO那里其实是有点相似的)

我们假定这里的窗口大小是3,那么发送前3个段的时候,不需要等待任何的ack,直接发送;

收到第一个ack之后,窗口向后滑动,继续发送第四个段的数据。

【os内核为了维护这个滑动窗口,需要开辟发送缓冲区记录当前还有那些数据没有应答。只有确认应答的数据才可以从缓冲区删除,窗口越大,网络的吞吐量越大,传输效率越高,同时资源开销越多】

这个时候,我们再来想一个问题,数据报丢了怎么办?ack丢了怎么办

对于数据报丢了,会重传的,这里有种“快速重传”的机制。TCP有接收缓冲区的,会再接收缓冲区按照序号进行排队,所以顺序也不会乱。

对于ack丢了,其实这个时候我们可以通过收到的ack结果进行推断。

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

二、流量控制

什么是流量控制?

它是一种干预发送窗口大小的机制。

一般情况下(在cpu能处理的范围内),滑动窗口越大,传输效率越高。

接收方处理能力是一个很重要的约束依据,发送方发的速度,不能超出接收方的处理能力,需要协调发送方的发送速率。

为什么要引入流量控制?

  • 完全不等ack,可靠性能否保障有待考量
  • 窗口太大,也会消耗大量的系统资源
  • 发送速度太快,接收方处理不过来,发了也白发。

怎么进行流量控制

核心就一句话:看接收方缓冲区的剩余大小。

接收方当前接收缓冲区的剩余空间大,就发的快些;小就发的慢些。

需要注意的点!!!!

  • 这里其实就是协议端格式那里的16位窗口大小,但并不是简单的64Kb,TCP首部40字节选项中还有一个窗口扩大因子M,实际窗口大小是64kb左移M位得到的值。
  • 窗口大小是发送方的概念,只不过这个值是需要ack返回的值计算赋给发送方的
  • 发送方窗口大小不是固定值,而是随着传输过程动态变化的。当窗口大小变成0时,发送要终止。暂停发送,客户端会给服务器定时发送窗口探测报文。

三、拥塞控制

为什么要引入拥塞控制?

前边我们只是考虑了AB两个端点之间的通信,但实际上,中间还有很多节点(网络转发设备)。

虽然TCP有了滑动窗口这个大杀器,能够高效可靠的发送大量的数据。但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题。
因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的 。

这里的拥塞控制就相当于交警一样,协调道路通畅。

什么是拥塞控制?拥塞控制具体是怎么发挥作用的?

这是一种大佬们想出的一种通过实验的方式,测得合适的传输速度。

它本质上是通过测试的方式,逐渐找到的一个合适的值。

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

注意!!!

  1. 窗口大小单位不是字节。具体大小视情况而定。
  2. 窗口大小不是固定数值,是随时间一直动态变化的。
  3. 拥塞控制和流量控制窗口共同决定了发送方实际的发送窗口(取较小值)

四、延时应答

为什么要引入延时应答?

为了进一步提高TCP的传输效率。

什么是延时应答?延时应答具体是怎么发挥作用的?

它也是提升效率的机制。当滑动窗口大一些,传输速度快一些,所以现在要做的就是在接收方能够处理的前提下,尽可能地把窗口变大。

收到数据之后,不是立即返回ack,而是稍微等一会再返回。等待的时间里,接收方的app能够把接收区缓冲区处理一部分。让接收区缓冲区尽可能的大一些。

而实际上,延时应答采取方式是,在滑动窗口下,ack不再每一条都返回,此时隔一条返回一个ack。

五、捎带应答

为什么要引入捎带应答?

也是为了提高TCP的传输效率。在延时应答的基础上,引入的捎带应答。

什么是捎带应答?

其实就相当于是一问一答。而服务器客户端最典型的模型就是一问一答。

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

六、面向字节流(了解)

面向字节流,虽然方便了传输,但是引进了麻烦事儿——“粘包问题”。

接收缓冲区,其实是把刚才这里收到的多个数据放到一起。应用read读取的时候,读到哪才算是一个完整的应用数据报。我们无从得知(由于TCP是字节流,一次读1个字节,读N个都可以。)

为此,我们可以采用应用层约定应用协议的方式,尤其明确好应用层数据报之间的边界。比如说约定好分隔符(必须是原来数据包里边没有的)、或者约定好每个包的长度,每次都按指定大小读取等。

七、异常情况(了解)

异常情况就是传输过程中出现了不可抗力,一般有一下几种情况。

  1. 进程崩溃
  2. 主机关机
  3. 主机断电
  4. 网线断开

12,来得及挥手,都相当于调用了close(方法,)进程无了、pcb无了、文件描述符表也没了。触发四次挥手,发送FIN。

这里的34,就来不及挥手了,认为连接还在,一旦接收端接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset。即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在。如果对方不在,也会把连接释放。

这里的掉电有两种情况:

  1. 接收方掉电:发送方拿不到ACK,之后进入超时重传,几次重传之后,触发RST复位报文段,之后放弃连接,对资源回收。
  2. 发送方掉电:此时,接收方还在尝试接收数据。这时,每隔一段时间,向对方发送一个PING包,期待对方返回一个PONG包,若没有返回,说明对方已经挂了,这就叫做采用保活机制(心跳包机制)。

关于其他传输层协议

传输层并不是只有TCP/UDP

针对不同的业务要求,会采取其他不同的传输层协议。

例如,对于游戏场景,就有一种比较典型的传输层协议——KCP。它的特点是即传输效率较高同时可靠性也是比较高。

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

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

相关文章

FTP中的TCP传输服务(电子科技大学TCP/IP实验五)

目录 一.实验目的 二.预备知识 三.实验原理 四.实验内容 五.实验步骤 八、总结及心得体会 九、对本实验过程及方法、手段的改进建议 一.实验目的 1、掌握 TCP 协议工作原理 2、掌握 TCP 的连接建立…

阿里团队刚发布的重磅图像生成基础模型,多重条件引导+图像合成,SD级别,5B参数...

一个多小时前刚发的论文,Composer: Creative and Controllable Image Synthesis with Composable Conditions。 我读完了快速帮大家概要一下啊。论文地址见文章最后。阿里巴巴团队开发的这个重磅图像生成模型 Compose,支持多重引导条件的图像生成(合成)&…

containerd安装配置

containerd基本使用命令 containerd安装 容器运行时containerd安装配置 https://blog.csdn.net/rendongxingzhe/article/details/124595415 yum list | grep containerd containerd的本地CLI工具ctr命令 containerd的组件 containerd提供包括容器的运行、测试、发布和接口…

improve-1

类型及检测方式 1. JS内置类型 JavaScript 的数据类型有下图所示 其中,前 7 种类型为基础类型,最后 1 种(Object)为引用类型,也是你需要重点关注的,因为它在日常工作中是使用得最频繁,也是需要…

DevOps是什么?DevOps能够给我们带来什么?

目录专栏导读一、DevOps是什么?二、为什么会出现DevOps?1、容器化技术的发展,微服务架构的发展,直接促进了DevOps的迅速发展2、敏态需求的增加,即探索性工作的增加3、软件开发活动在企业经营活动中占比的不断增加4、企…

【华为OD机试模拟题】用 C++ 实现 - 水仙花数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明水仙花数题目输入输出描述示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。…

【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

基于stm32计算器设计

这里写目录标题 完整de代码可q我获取1 系统功能设计2 系统硬件系统分析设计2.1 STM32单片机核心电路设计2.2 LCD1602液晶显示模块电路设计2.3 4X4矩阵键盘模块设计3 STM32单片机系统软件设计3.1 编程语言选择3.2 Keil程序开发环境3.3 FlyMcu程序烧录软件介绍3.4 CH340串口程序烧…

【华为OD机试模拟题】用 C++ 实现 - 最近的点(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明最近的点题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址…

【基础篇0】Linux下ANACONDA与TF-LITE环境配置

0 写在前面:一些摸索与总结 对于Linux系统,我发现不管是电脑x86的Ubuntu还是树莓派arm的raspberry系统,在系统安装完毕后,总是自带一个特定版本的python.   例如我的ubuntu22.04自带的python版本是3.10,而高版本的py…

Vue3之组件

何为组件 组件化的概念已经提出了很多年了,但是何为组件呢?组件有啥优势?本文将会做出解答,首先我们需要弄清楚何为组件。在VUE的官网中的解释是: 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对…

Android 基础知识4-3.2 EditText(输入框)详解

一、EditText(输入框)介绍 EditText在开发中也是经常使用的控件,比如,要实现一个登录页面,需要用户输入账号、密码等信息,然后我们或得用户输入的内容,把它交给服务器来判断。因此,这…

【模拟集成电路】分频器(DIV_TSPC)设计

分频器(DIV_TSPC)设计前言一、DIV工作原理二、DIV电路设计(1)32分频原理图(2)D触发器原理图(3)D锁存器原理图(4)三输入与非门原理图三、DIV仿真测试32分频器测…

k8s学习之路 | Day15 k8s 中的 yaml 语法

文章目录yaml 基础什么是 yaml&#xff1f;yaml 特性适用场景基本语法规则数据类型yaml 对象yaml 数组yaml 纯量yaml 引用k8s 中的 yaml 语法\<string>\<Object>\<map[string]string>\<[]Object>\<boolean>示例 yaml 说明我在学习过程中&#xf…

【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明最多获得的短信条数题目输入输出示例一输入输出说明示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过…

优化WebView实现H5秒开

WebView与原生对比差在哪里&#xff1f;这里引用百度APP图片来说明。百度的开发人员将这一整个过程划分为了四个阶段&#xff0c;并统计出了各个阶段的平均耗时。可以看到&#xff0c;在初始化组件阶段就花费了 260 ms&#xff0c;首次创建耗时均值为 500 ms&#xff0c;毫无疑…

7-vue-2

vue3.2 自定义全局指令、局部指令 // 在src目录下新建一个directive文件&#xff0c;在此文件夹下新建一个index.js文件夹&#xff0c;接着输入如下内容 const directives (app) > {//这里是给元素取得名字&#xff0c;虽然是focus&#xff0c;但是实际引用的时候必须以v…

为赋能,创共赢~ 〖TFS_CLUB社区〗-〖星荐官计划〗来袭~ 期待各位小伙伴的加入~

文章目录❤️‍&#x1f525; TFS社区介绍❤️‍&#x1f525; 星荐官计划在直播结束之后&#xff0c;有几位小伙伴跟我说&#xff0c;想法是好的&#xff0c;但是会很难搞。试想一下如果真的是很容易做的事情&#xff0c;那岂不是人人都可以做&#xff1f;正因为难做&#xff…

PyQt5数据库开发2 5.2 QSqlRelationalTableModel

目录 一、Qt窗体设计 1. 新建Qt项目 2. 添加组件 3. 添加资源 4. 添加Action 5. 添加工具栏 6. 添加菜单项 7. 添加退出功能 二、SQL Server下建表插数据 1. 建立表 2. 插入数据 3. 单表数据 4. 联合查询 三、代码实现 1. 新建项目目录 2. 编译窗体文件和资…

[计算机网络(第八版)]第一章 概述(章节测试/章节作业)

随堂作业 练习版(无答案版) 1.2 因特网概述 1【单选题】因特网的前身是1969年创建的第一个分组交换网 A、internetB、InternetC、NSFNETD、ARPANET 2【单选题】因特网采用的核心技术是 A、TCP/IPB、局域网技术C、远程通信技术D、光纤技术 1.3 三种交换方式&#xff1a;电路…