Java网络编程之TCP协议核心机制(二)

news2024/7/30 1:59:51

目录

题外话

正题

滑动窗口机制

如果出现丢包问题怎么办??

滑动窗口触发条件

流量控制

拥塞控制

小结


题外话

宿舍没有空调的感觉谁懂?!!!

人要蒸发了,八点自动热醒,直接强行学习

正题

我们继续讲解TCP协议核心机制

上篇博客讲完了,建立连接机制,确认应答机制,超时重传机制,接着往下书写

滑动窗口机制

由于确认应答机制,每次从客户端向服务器发送数据,服务器都会返回一个ACK(同步确认包)

如下图

我们可以看到,每次客户端发送数据到服务器,都要等待服务器返回ACK数据包才会再发送数据

如果数据包比较多,发送次数就会变得更高,而且会影响效率

当我们触发滑动窗口,就会把一条一条的数据发送转换成批量发送并且批量等待ACK

当客户端收到一个ACK数据包的时候,客户端就会往后继续发送数据包,比如客户端收到了服务器发来的1001序列号的ACK数据包,然后就会发送3001-4000这个数据包

如下图

这样就可以在同一时间发送多个数据包,从而使效率提升

如果出现丢包问题怎么办??

滑动窗口机制是一定要保证可靠性的

下面有两种丢包情况

1.客户端发送数据包抵达,但ACK数据包丢包

如果ACK数据包丢包,不会做任何处理

比如序列号1001和2001的ACK数据包全部丢失,但是3001ACK数据包没有丢失,成功发送到客户端,这就意味着客户端已经知道服务器接收到了0-1000,1001-2000的数据包

如下图

2.客服端发送数据包丢包

如果客户端发送序列号为0-1000数据包时发生丢包,服务器会不断发送序列号为1001的ACK,当客户端收到若干次相同序列号ACK,客户端则会重新发送丢包的数据包,并且之前客户端继续发送过来的数据包服务器也会正常接收

如下图

针对上述出现的丢包问题,整个处理过程是很高效的,这叫快速重传和超时重传不同

1.对于ACK丢失,不做任何处理

2.对于数据包丢失,只需要把缺失部分数据重传即可,不需要重传其它数据

滑动窗口触发条件

如果TCP传输数据比较少,不频繁,就不会触发滑动窗口

如果短时间传输大量的数据,此时才会触发滑动窗口

流量控制

在服务器会有一个接收缓冲区(阻塞队列)

服务器发送的ACK数据包中会在tcp报头中指定一个字段,表示未使用空间大小

客户端会根据接收缓冲区中的未使用空间的大小进行数据传输控制

如下图

客户端发送的数据包会被应用程序消耗

客户端会周期性发送一个"窗口探测报文",主要是为了触发服务器发送ACK

从而知道接收缓冲区空间情况

接收缓冲区大小在TCP中是可以扩容的,接收缓冲区中的未使用空间越多,也就意味着传输的数据可以更多

拥塞控制

拥塞控制和流量控制都是为了搭配滑动窗口机制而产生的

如上图,当我们要将大量数据包从A设备发送到B设备,中间可能会经过好几个节点

如果中间任何一个节点出现丢包都会影响整体数据传输效率

TCP会将它们都看做一个整体

通过"实验"的方式去找到一个合适的窗口大小从而提升数据传输效率

窗口具体变动如下图

由图可见窗口时刻处于一个动态变化

小结

本篇博客讲解了滑动窗口机制,流量控制机制,拥塞控制机制

喜欢的家人们麻烦给个三连(点赞关注收藏!!!)

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

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

相关文章

Boxy SVG for Mac:打造精致矢量图形的得力助手

在矢量图形设计领域,Boxy SVG for Mac以其出色的性能和丰富的功能,成为了设计师们的得力助手。 Boxy SVG for Mac(矢量图编辑器) v4.32.0免激活版下载 Boxy SVG具备强大的编辑能力,支持节点编辑、路径绘制、颜色填充等多种操作,让…

struct.unpack_from()学习笔记

struct.unpack_from(fmt,b_data,offset) 按照指定的格式fmt,从偏移位置offset,对b_data开始解包,返回数据格式是一个元组(v1,v2…) fmt可以有: _struct.py: The remaining chars indicate types of args and must match exactly;…

实现 YOLO 目标计数 | 含代码示例

点击下方卡片,关注“小白玩转Python”公众号 在YOLO算法的无数应用中,我们想聚焦于一个真实的场景:道路车辆计数。这个用例对于智能城市的交通规划和决策具有重要意义。在这篇文章中,我们将带您一步步实现YOLO目标检测和计数&…

工业路由器在新能源数字化中的应用:重塑能源行业的未来

随着全球对可再生能源和能源效率的追求日益加强,新能源数字化已成为推动行业发展的关键因素。在这一变革的浪潮中,工业路由器以其卓越的性能和独特的功能,成为新能源数字化不可或缺的核心组件。本文将深入探讨工业路由器在新能源数字化中的应…

对话:用言语构建深刻的思想碰撞

对话:用言语构建深刻的思想碰撞 在写书中,对话是一种有力的工具,能与读者进行有效的沟通和交流,引发深思和反思。它不仅是信息传递的方式,更是加深情感、探讨主题和吸引读者参与的桥梁。你应从读者的角度思考&#xf…

【学习AI-相关路程-工具使用-自我学习-jetsoncudapytorch-开发工具尝试-基础样例 (3)】

【学习AI-相关路程-工具使用-自我学习-jetson&cuda&pytorch-开发工具-安装尝试-基础样例 (3)】 1、前言2、环境说明3、自我总结(1)了解整体过程阶段 1: 硬件设置阶段 2: 软件准备阶段 3: 数据准备阶段 4: 模型设计和训练阶…

在Spring 当中存在的八大模式

在Spring 当中存在的八大模式 文章目录 在Spring 当中存在的八大模式每博一文案1. 简单工厂模式2. 工厂方法模式3. 单例模式4. 代理模式5. 装饰器模式6. 观察者模式7. 策略模式8. 模板方法模式最后: 每博一文案 我认为 “知世故而不世故” 才是真正意义上的成熟。回…

Python功能强大的构建系统库之buildout使用详解

概要 在软件开发过程中,管理项目依赖和构建环境是一项复杂而重要的任务。Python buildout库是一种强大的构建系统,能够帮助开发者自动化地管理项目的依赖、生成可重复的开发环境,并简化部署过程。本文将详细介绍buildout库,包括其安装方法、主要特性、基本和高级功能,以及…

csdn的insCode怎么用IDE和linux终端

1.进入insCode,选择工作台 找到我的项目,没有项目的话可以新建一个。 选择在IDE中编辑,界面如下: 右边有个终端,点击即可出现linux的xterm终端。

区块链技术和应用

文章目录 前言 一、区块链是什么? 二、区块链核心数据结构 2.1 交易 2.2 区块 三、交易 3.1 交易的生命周期 3.2 节点类型 3.3 分布式系统 3.4 节点数据库 3.5 智能合约 3.6 多个记账节点-去中心化 3.7 双花问题 3.8 共识算法 3.8.1 POW工作量证明 总结 前言 学习长…

算法:树状数组

文章目录 面试题 10.10. 数字流的秩327. 区间和的个数315. 计算右侧小于当前元素的个数 树状数组可以理解一种数的存储格式。 面试题 10.10. 数字流的秩 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构…

Volatile的内存语义

1、volatile的特性 可见性:对一个volatile变量的读,总能够看到任意一个线程对这个volatile变量的写入。 原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile这种复合操作不具有原子性。 接下来我们用程序验证。…

如何用Java实现SpringCloud Alibaba Sentinel的熔断功能?

在Java中使用Spring Cloud Alibaba Sentinel实现熔断功能的步骤如下&#xff1a; 添加依赖 在项目的pom.xml文件中添加Spring Cloud Alibaba Sentinel的依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud…

强烈推荐 20.7k Star!企业级商城开源项目强烈推荐!基于DDD领域驱动设计模型,助您快速掌握技术奥秘,实现业务快速增长

更多资源请关注纽扣编程微信公众号 1 项目简介 商城是个从零到一的C端商城项目&#xff0c;包含商城核心业务和基础架构两大模块,推出用户、消息、商品、订单、优惠券、支付、网关、购物车等业务模块&#xff0c;通过商城系统中复杂场景&#xff0c;给出对应解决方案。使用 …

Linux_应用篇(08) 信号-基础

本章将讨论信号&#xff0c;虽然信号的基本概念比较简单&#xff0c;但是其所涉及到的细节内容比较多&#xff0c;所以本章篇幅也会相对比较长。 事实上&#xff0c;在很多应用程序当中&#xff0c;都会存在处理异步事件这种需求&#xff0c;而信号提供了一种处理异步事件的方法…

使用VirtualBox+vagrant创建CentOS7虚拟机

1.VirtualBox 1.1.什么是VirtualBox VirtualBox 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发&#xff0c;由Sun Microsystems公司出品的软件&#xff0c;使用Qt编写&#xff0c;在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。 1.2.下载Virtual…

优先级队列(堆)的实现

1.什么是优先级队列 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队 列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然不合适&#xff0c;比如&#x…

Atlas 200I DK A2安装MindSpore Ascend版本

一、参考资料 mindspore快速安装 二、重要说明 经过博主多次尝试多个版本&#xff0c;Atlas 200I DK A2无法安装MindSpore Ascend版本。 也有其他博主测试&#xff0c;也未尝成功&#xff0c;例如&#xff1a;【MindSpore易点通漫游世界】在Atlas 200I DK A2 (CANN6.2.RC2)…

【汽车之家注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

构建php环境

目录 php简介 官网php安装包 选择下载稳定版本 &#xff08;建议使用此版本&#xff0c;文章以此版本为例&#xff09; 安装php解析环境 准备工作 安装依赖 zlib-devel 和 libxml2-devel包。 安装扩展工具库 安装 libmcrypt 安装 mhash 安装mcrypt 安装php 选项含…