Java EE(16)——网络原理——TCP协议解析二

4.滑动窗口(效率机制)

上篇博客讲到的确认应答/超时重传/连接管理都是安全机制,但也会降低传输效率。滑动窗口就是在保证可靠传输的基础上,尽可能地提高传输效率。
根据确认应答机制,客户端每发送一个请求都需要收到服务器的确认应答报文后才会传输发送下一条请求。

4.1原理介绍

既然这样一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大的提高性能(其实是将多
个段的等待时间重叠在一起了)
在这里插入图片描述
窗口大小:无需等待确认应答还可以继续发送请求的最大值,例如上图可以连续发送4个请求而不需要ACK,那么窗口大小就是4
在这里插入图片描述
发送缓冲区:既然是一次性发送多个请求,那么操作系统会维护一个发送缓冲区来统计哪些数据没有被应答

4.2丢包处理

问题1:如果ACK丢包了,怎么办?

答案:ACK丢包问题不大。例如,服务器返回了ACK(4001),表示前4000序列号的数据已经被接收,即使ACK(1001,2001,3001)都丢包也没啥影响。ACK全部丢失的情况几乎不会发生,因为正常情况下丢包本身就是小概率时间,更何况全部丢包。
问题2:如果数据(2001~4000)已经被接收,而数据(1 ~ 1000)一直没有到达,此时窗口会向后滑动吗?

答案:不会。此时服务器会重复发送ACK(1001)来向客户端索要数据,当ACK(1001)的返回次数超过一定阈值时,客户端会认为数据(1~1000)不是卡在半路,而是丢包了,客户端会重新发送数据。
这叫做快速重传机制

5.流量控制&拥塞控制(安全机制)

5.1流量控制

接收方处理数据的速度是有限的。如果发送方发的太快,导致接收方的缓冲区被打满,这个时候如果发送方继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应
因此TCP支持根据接收方的处理能力,来决定发送方的发送速度。例如,接收方数据缓冲区的大小还剩3000字节,那么接收方会将ACK中的窗口部分设置为3000,告诉发送方你应该将滑动窗口的大小设置为3000
在这里插入图片描述
这就叫做流量控制机制

5.2拥塞控制

网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。
TCP引入慢启动机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据
在这里插入图片描述

流量控制&拥塞控制区别以及谁来决定窗口大小

流量控制是根据接收方的实际情况来反馈窗口大小;而拥塞控制是根据网络的拥塞情况来反馈窗口大小。取两种机制的最小值作为滑动窗口的大小

6.延时应答(效率机制)

如果接受方收到请求后就立刻返回ACK,此时接受发的数据缓冲区的剩余空间可能比较小,那么ACK的窗口大小就比较小。我们不妨让ACK稍作等待再返回,这时候接受方已经处理掉部分数据了,缓冲区的剩余空间就大一些,ACK返回的窗口大小就可以大一些。这样做是为了让发送方可以一次性发送更多的数据,提高传输效率。
至于具体ACK延时多久才返回,每个操作系统设置的阈值不同。

7.捎带应答

在延时应答的基础上,ACK可以携带接受方的响应数据一起返回
在这里插入图片描述
这样的好处是减少纯ACK的返回次数
当然,如果这段时间内实在没有可以携带的数据,ACK也不可能一直等到有数据才返回,而是独自返回

8.粘包问题

这不是TCP协议独有的问题,而是所有面向字节流的协议都会有的问题。
假设发送方的滑动窗口大小是10000字节,虽然发送方是1000字节为单位进行发送,但这些数据到达接受方的数据缓冲区后,仍然会揉在一起。这时候就需要区分出多少个字节是一个完整的应用层数据包。
那么如何避免粘包问题呢?归根结底就是一句话,明确两个包之间的边界
1.对于定长的数据包,每次按照固定长度读取即可
2.对于变长的数据包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置
3.对于变长的数据包,还可以引入特殊符号作为分界线(可以参考我的TCP服务器代码Java EE(13)——网络编程——UDP/TCP回显服务器)

9.异常情况处理

9.1进程崩溃

会进行正常的四次挥手,没啥问题

9.2主动关机

关机之前系统会强杀进程,此时也会触发四次挥手,但四次挥手未必能执行完毕
(1)四次挥手执行完毕,没啥问题
(2)四次挥手没执行完毕
在这里插入图片描述
服务器收到FIN后会返回ACK,然后再返回FIN,只不过这个FIN将不会得到客户端的回应。那么服务器就会重传FIN,重传一定次数后依然没有结果,服务器会单方面结束连接

9.3瞬间断电

(1)接收方断电
发送方发现没有ACK了。就会进行超时重传,依然没有ACK的话,就会进行"复位连接"
复位连接的意思是,发送方和接收方的所有数据全部重置(不会再次进行三次挥手)
复位连接依然没有结果,就会单方面结束连接
(2)发送方断电
接收方本来就在等待发送方发送数据,但迟迟没有数据发送过来,接收方就会发送一个"心跳包"(心跳包是周期性发送没有实际数据的包)来询问发送方的状态,如果判定对方没有"心跳",就会进行复位连接,然后单方面断开连接

9.4网络断开

断电是一方存在,一方不存在
网络断开是两方都存在,那么发送方会经历上述发送方断电的过程;接收方会经历接收方断电的过程

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

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

相关文章

从入门到精通【MySQL】 CRUD

文章目录 📕1. Create 新增✏️1.1 单行数据全列插入✏️1.2 单行数据指定列插入✏️1.3 多行数据指定列插入 📕2. Retrieve 检索✏️2.1 全列查询✏️2.2 指定列查询✏️2.3 查询字段为表达式✏️2.4 为查询结果指定别名✏️2.5 结果去重查询 &#x1f…

C++学习之云盘上传文件列表下载

1.上传打开文件操作 1. 注册 客户端 成功 {"code":"002"} 该用户已存在 {"code":"003"} 失败 {"code":"004"} 服务器 2. 登录 客户端 服务器 // url http: //127.0.0.1:80/reg // post 数据格式 …

OpenCV图像拼接(5)用于计算一组图像的特征点和描述符的函数computeImageFeatures()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::computeImageFeatures 是 OpenCV 中用于计算一组图像的特征点和描述符的函数,通常在图像拼接或类似的任务中使用。这个函…

详细解析格式化消息框的代码

书籍:《windows程序设计(第五版)》的开始 环境:visual studio 2022 内容:格式化消息框 说明:以下内容大部分来自腾讯元宝。 封装MessageBoxPrintf 在MessageBoxPrintf()中处理可变参数,通过va_list机制&#xff0c…

【SpringSecurity】详细核心类与过滤器流程讲解和封装通用组件实战

Spring Security 全面介绍 1. 什么是 Spring Security? Spring Security 是一个功能强大且高度可定制的认证和访问控制框架,是保护基于 Spring 的应用程序的标准工具。它是一个专注于为 Java 应用程序提供认证和授权的框架,实际上它是 Spri…

浅谈Qt事件子系统——以可拖动的通用Widget为例子

浅谈Qt事件子系统——以可拖动的通用Widget为例子 这一篇文章是一个通过实现可拖动的通用Widget为引子简单介绍一下我们的事件对象子系统的事情 代码和所有的文档 1:Qt侧的API介绍和说明 ​ 这个是每一个小项目的惯例,我会介绍大部分Qt程序中使用到的…

[入门]NUC13配置Ubuntu20.04详细步骤

文章目录 1. 安装Ubuntu20.041.1 制作系统启动盘1.1.1 下载镜像文件1.1.2 配置启动盘 1.2 安装内存条、硬盘1.3 安装系统 2. 网卡驱动配置2.1 关闭安全启动2.2 安装intel官方网卡驱动backport2.2.1 第四步可能会出现问题 2.3 ubuntu官方的驱动2.4 重启 3. 软件安装3.1 录屏软件…

(七)Reactor响应式编程框架

一、简介 Reactor 是运行在 JVM 上的编程框架,最大特点是完全非阻塞,能高效控制 “背压”,简单来说就是处理数据传输时速度不匹配的问题 。它能和 Java 8 里的一些功能直接搭配使用,像处理异步结果的 CompletableFuture、处理数据…

从边缘到核心:群联云防护如何重新定义安全加速边界?

一、安全能力的全方位碾压 1. 协议层深度防护 四层防御: 动态过滤畸形TCP/UDP包(如SYN Flood),传统CDN仅限速率控制。技术示例:基于AI的协议指纹分析,拦截异常连接模式。 七层防御: 精准识别业…

【Linux】Ubuntu 24.04 LTS 安装 OpenJDK 8

目录 通过 apt-get 直接安装 JDK 1. 更新 apt 软件源 2. 检查 JDK 是否已安装 3. 安装OpenJDK 4. 检查 JDK 是否成功安装 5. 设置 JAVA_HOME 环境变量 找到需要设置的 Java 路径 使用文本编辑器打开/etc/environment文件 添加 Java 安装路径 应用更改和验证配置 通过…

Java 方法执行原理底层解析

java 文件经过javac编译后,变成了存储了一系列指令的.class文件。本文从指令层面分析Java 方法从解析、调用到执行的过程。 1 指令 一般格式:操作码 [操作数1] [操作数2] ... 操作码 1个字节的无符号整数(范围:0x00 ~ 0xFF&…

【数学建模】最大最小值模型详解

数学建模中的最大最小值模型详解 文章目录 数学建模中的最大最小值模型详解引言最大最小值模型的基本概念最大化问题最小化问题 常见的求解方法1. 微积分法2. 线性规划3. 非线性规划4. 动态规划 实际应用案例案例1:生产规划问题案例2:投资组合优化 最大最…

C#的List和DIctionary实现原理(手搓泛型类以及增删查改等功能)

这里写自定义目录标题 ListDIctionary List MyList类:这是一个泛型类,能够存储任意类型的元素。 _items数组:用于实际存储元素。 _size变量:记录当前列表中的元素数量。 构造函数:初始化数组容量为 4。 Count属性&…

Linux系统管理与编程08:任务驱动综合应用

兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 [环境] windows11、centos9.9.2207、zabbix6、MobaXterm、Internet环境 [要求] zabbix6.0安装环境:Lamp(linux httpd mysql8.0 php) [步骤] 3 …

数据结构之基本队列-顺序结构实现-初始化-判断队列是否为空(front=rear)-出队-入队-队尾满了,调整队列-获取队头元素

数据结构之基本队列-顺序结构实现-初始化-判断队列是否为空(frontrear)-出队-入队-队尾满了&#xff0c;调整队列-获取队头元素——完整可运行代码 #include <stdio.h>#define MAXSIZE 100 typedef int ElemType;typedef struct {ElemType data[MAXSIZE];int front;int…

基于LabVIEW的Windows平台高速闭环控制

在Windows系统下&#xff0c;通过LabVIEW实现高速闭环控制面临两大核心挑战&#xff1a;非实时操作系统的调度延迟与硬件接口的传输速度限制。以USB-6351&#xff08;NI USB-6351 DAQ卡&#xff09;为例&#xff0c;其理论采样率可达1.25 MS/s&#xff08;单通道&#xff09;&a…

Java面试黄金宝典8

1. 什么是 Spring MVC 定义 Spring MVC 是 Spring 框架里用于构建 Web 应用程序的模块&#xff0c;它严格遵循 MVC&#xff08;Model - View - Controller&#xff09;设计模式。这种设计模式把应用程序清晰地划分成三个主要部分&#xff1a; Model&#xff08;模型&#xff0…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 RESTful API 设计:从上手到骨折

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整活…

分享最近前端面试遇到的一些问题

前情提要&#xff08;分享个人情况&#xff0c;可以直接跳过&#xff09; 先说一下我的个人情况&#xff0c;我是2026届的&#xff0c;目前是在找前端实习。 3月初&#xff0c;从3月3日开始在Boss上投简历。 分享我的个人故事&#xff0c;不想看可以直接滑到下面&#xff0c;…

rip 协议详细介绍

以下是关于 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09; 的详细介绍&#xff0c;涵盖其工作原理、版本演进、配置方法、优缺点及实际应用场景。 1. RIP 协议概述 类型&#xff1a;动态路由协议&#xff0c;基于距离矢量算法&#xff08…