【Java网络编程】TCP核心特性(下)

1. 拥塞控制

拥塞控制:是基于滑动窗口机制下的一大特性,与流量控制类似都是用来限制发送方的传送速率的

区别就在于:"流量控制"是从接收方的角度出发,根据接收方剩余接收缓冲区大小来动态调整发送窗口的;而"拥塞控制"是从网络的拥堵状态出发,衡量当前网络拥塞程度从而动态调整拥塞窗口大小的

image.png
如上图所示:接收方和发送方并不是简单直接相连的,路径中间存在着多个通信设备(路由器、交换机等),因此传输过程网络环境错综复杂,因此就算接收方此时剩余接收缓冲区空间足够,发送方的发送窗口值较大也是不合理的!此时我们就需要一套合理的机制来得出针对当前网络拥堵状态、合适的发送窗口大小:也被称为 拥塞窗口
拥塞窗口调整过程

  • 首先是 慢启动 过程:即一开始拥塞窗口(后续写为cwnd)设立一个比较小的值,因为刚开始时网络状态未知,如果开始就设定一个较大值,可能会让本就不富裕的网络带宽雪上加霜
  • 慢启动过程中,拥塞窗口的大小是 指数增长 的,如果没有丢包就让cwnd变为原来两倍(这样做是因为一开始cwnd值较小,指数增长可以快速提高发送效率)
  • 指数增长不会一直持续下去,达到阈值(后续写为ssthresh)之后就转变为 线性增长(这样做的好处是尽可能保持较高的传输速率,并且不会立刻造成拥堵丢包情况)
  • 线性增长也终究还是在增长,当出现丢包情况,就说明此时的网络情况拥堵,就将 新阈值 设定为出现丢包cwnd值的一半,并且让cwnd重新置为一个较小值继续开始慢启动过程

image.png
其中因超时重传导致cwnd减少有两种版本:

  • 一种是TCP Reno版本:新的拥塞窗口值不会将为1,而是从新的ssthresh开始,然后保持线性增长
  • 另一种是TCP Tahoe版本(已废弃):新的拥塞窗口值为1,慢启动过程仍为指数增长,阈值到达新的ssthress值则转变为线性增长

2. 延迟应答

延迟应答:是基于TCP的"滑动窗口"机制以及"流量控制"机制,为了进一步提高传输效率的,它的核心就在于接收方收到数据之后,不会立刻返回Ack报文,而是等待一会(留给应用程序处理接收缓冲区的数据),此时可以回馈的剩余接收缓冲区容量更多了,就可以适当增加发送窗口的大小
image.png
通过滑动窗口机制来传输数据,这里的"延迟应答"的方式类似于按照"ACK报文丢了"的情况进行处理,即接收方连续收到多个ACK报文后,不会每一个都发送ACK报文,而是等待一段时间,例如100ms,然后再返回最后一个ACK报文,此时不仅能够起到"延迟应答"的作用,还可以减少数据传输量

需要注意:这里并不是单纯的按照每隔多少个ACK,返回一个ACK报文,也是和相应的时间间隔相关的,例如每隔2个报文,时间间隔为200ms(不需要记住具体数值,这些都是参数,重要的是理解策略)

3. 捎带应答

捎带应答:是基于"延迟应答",进一步提升传输效率的机制,其核心思想就是尽可能将可以合并的数据报进行合并,从而起到提升效率的作用
我们最常见的通讯模型就是如下"一问一答型"的:
image.png
按照之前的方式:那么当客户端给服务器发送请求后,服务端先返回ACK表示收到了,然后进行业务逻辑处理,返回响应结果response,但是由于 延迟应答机制 的加持,我们在一定条件下可以将ACK报文同response应用层数据报文一起发送(因为ACK报文只将ACK标志位置为1,不会与应用层报文其他内容冲突)

此后后续所有的ACK应答报文都可能和应用层数据报文合并一起发送!也让后续四次挥手变成三次挥手提供可能性!

4. 面向字节流

粘包问题:这里重点讨论"面向字节流"中一个重要话题——粘包问题
结合之前的内容进行理解,这里的包指的是"应用层数据包",即TCP数据到达内核的接收缓冲区后,应用程序会调用socket.receive()进行读取,此时就会出现一个问题,TCP是面向字节流的,因此传输的数据可以看做是一连串字节数据,无法区分包与包之间的边界,例如一个包传送"aaa",另一个包传送"bbb",但是到了接收缓冲区呈现的形式就是"aaabbb",这个问题就是"粘包问题"
解决思路
"粘包问题"并不是TCP独有的,而是所有的面向字节流的协议都会产生的,解决的思路大体有如下两种:

  1. 通过特殊符号,作为分隔符,每次遇到分隔符就表示达到包结尾了,例如我们传输数据后面加上分隔符"\r\n",那么上述情况中接收缓冲区的数据就是"aaa\r\nbbb\r\n",此时我们就有办法进行区分了
  2. 另一种思路就是占用额外的存储空间用来存放该数据包的长度,例如上述情况我们可以表示为"[3]aaa[3]bbb",此时我们读取的过程中就已知长度进行分隔读取了

5. 异常处理

异常情况:上述我们讨论的都是基于TCP正常状况下的网络传输过程,唯一存在的异常情况也就是"丢包"了,但是如果出现更为严重的故障呢?TCP会如何处理呢,这就是该特性需要讨论的地方:
异常情况分类

  1. 发送方或者接收方出现了进程崩溃:

    进程无论是正常结束还是异常崩溃,都会触发 文件资源回收 ,起到关闭文件这样的作用,此时就会完成四次挥手过程,由于TCP连接的生命周期会比进程更长一些,因此可以完成四次挥手,与正常情况基本没什么区别

  2. 发送方或者接收方正常关机

    当有个主机进行关机时,操作系统就会强制终止所有的进程(类似上述的强杀进程过程),自然就会触发四次挥手,但是此时由于很快就要关机,因此四次握手不一定会全部完成,但是大概率第一个FIN报文能够发送给对端,此时对端也会回复ACK报文以及FIN报文,但是这些报文都不会再收到ACK了,此时对端就会触发超时重传,当重传几次仍然没有ACK后就会 单方面释放连接

  3. 发送方或者接收方断电关机

    如果直接断电,那么肯定是来不及发送第一个FIN报文的,此时就要考虑断电的是发送方还是接收方了

    1. 断电的是接收方:此时发送方就会发现,发送的数据没有ACK了,此时就会触发超时重传,重传多次仍没有ACK后就会尝试置RST位为1表示复位重置连接(消除原来的临时数据),但是RST也不会出现ACK报文,此时就单方面释放TCP连接了
    2. 断电的是发送方:此时接收方等待长时间没有收到来自发送方的数据时,就会周期性的发送"心跳"探测报文(不携带应用层数据),如果对端没有"心跳"那么就会单方面释放连接
  4. 网线断开

    相当于3中的a、b进行结合了,这里不再赘述!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑多能互补灵活性和用户低碳意愿的区域综合能源系统鲁棒优化调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

STM32 SDRAM知识点

1.SDRAM和SRAM的区别 SRAM不需要刷新电路即能保存它内部存储的数据。而SDRAM(Dynamic Random Access Memory)每隔一段时间,要刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它…

npm 操作报错记录1- uninstall 卸载失效

npm 操作报错记录1- uninstall 卸载失效 1、问题描述 安装了包 vue/cli-plugin-eslint4.5.0 vue/eslint-config-prettier9.0.0 但是没有使用 -d ,所以想重新安装,就使用 uninstall 命令卸载,结果卸载了没反应,也没有报错&#xf…

一文帮助快速入门Django

文章目录 创建django项目应用app配置pycharm虚拟环境打包依赖 路由传统路由include路由分发namenamespace 视图中间件orm关系对象映射操作表数据库配置model常见字段及参数orm基本操作 cookie和sessiondemo类视图 创建django项目 指定版本安装django:pip install dj…

【linux】04 :linix实用操作

1.常用快捷键 ctrlc表示强制停止。linux某些程序的运行,如果想强制停止,可以使用;命令输入错误,也可以通过ctrlc,退出当前输入,重新输入。 ctrld表示退出登录,比如退出root以回到普通用户,或者…

C++ Qt开发:QHostInfo主机地址查询组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QHostInfo组件实现对主机地址查询功能…

spring-cloud-openfeign 3.0.0(对应spring boot 2.4.x之前版本)之前版本feign整合ribbon请求流程

在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 下图为自己整理的

UE5 UE4 开发常用工具AssetDeveTool

AssetDeveTool工具,支持UE5 5.0-.5.3 UE4 4.26/4.27 下载链接: 面包多 https://mbd.pub/o/bread/ZZubkphu 工坊: https://gf.bilibili.com/item/detail/1104960041 包含功能: 自动化批量展UV功能 快速选择功能 自动化批量减面功能…

SoraAI视频工具优先体验资格申请步骤

SoraAI视频工具优先体验资格申请 申请网址:OpenAI Red Teaming Network application 申请步骤: 填写基础信息 请使用英文根据内容填写以下内容,名、姓、电子邮件、居住国家、组织隶属关系(如果有)、教育水平 、学位(哪个领域的…

02-gitlab的数据备份和恢复

一、gitlab的数据备份 关于数据备份,咱们就不需要多说什么了,主要就是方式数据意外丢失,导致代码上线流程及数据的损坏崩溃; 为了避免严重生产事故,进而gitlab有了数据备份与恢复的功能。 1,修改gitlab的配…

python淘宝网页爬虫数据保存到 csv和mysql(selenium)

数据库连接设置(表和字段要提前在数据库中建好) # 数据库中要插入的表 MYSQL_TABLE goods# MySQL 数据库连接配置,根据自己的本地数据库修改 db_config {host: localhost,port: 3306,user: root,password: ma*****6,database: may2024,charset: utf8mb…

MySQL 篇-快速了解事务、索引

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 事务概述 1.1 事务四大特性(ACID) 2.0 索引概述 2.1 关于 “索引一定要创建在主键上?” 的问题 2.2 索引操作语法 2.3 索引结构 1.0 事务概述 事务是…

【生态适配】亚信安慧AntDB数据库与OpenCloudOS、TencentOS Server五款产品完成兼容互认

日前,亚信安慧AntDB数据库与OpenCloudOS8、OpenCloudOS9、TencentOS Server 2、TencentOS Server 3、TencentOS Server 4五款操作系统完成兼容互认。经过严格测试,亚信安慧AntDB数据库与这五款操作系统兼容良好,整体运行稳定。 图1&#xff1…

stm32普通定时器脉冲计数(发送固定脉冲个数),控制步进电机驱动器

拨码开关设置驱动器,细分 方法思路:用通用定时器TIM2,1ms产生一次中断;在中断里做IO反转; 发送10个脉冲信号

签约仪式如何策划和安排流程?如何邀约媒体现场见证报道

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 签约仪式的策划和安排流程,以及邀约媒体现场见证报道,都是确保活动成功和提升影响力的关键环节。以下是一些建议: 签约仪式的策划和安排流程 明确目标…

patreon订阅

订阅制度: 创作者可以创建一个Patreon页面,邀请粉丝成为其“赞助者”或“粉丝”。这些粉丝可以选择每月或每个创作周期为创作者提供一定数额的资金支持,形成了一种订阅模式。 奖励层次: 创作者通常会设置不同的奖励层次&#xff…

MySQL安装使用(mac)

目录 一、下载MySQL 二、环境变量 三、启动 MySql 四、初始化密码设置 一、下载MySQL 打开 MySql 官方下载页面 我是macOS12,所以选择了8.0.30 下载完成之后,打开安装,一直下一步安装完成,在最后安装完成时,会弹出…

一周学会Django5 Python Web开发-Django5内置模板引擎-模板上下文变量

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计32条视频,包括:2024版 Django5 Python we…

Linux系统Docker部署DbGate并结合内网穿透实现公网管理本地数据库

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-66GkyG9g7oNq7tl8 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

Windows®、Linux® 和 UNIX® 系统都适用的远程桌面工具 OpenText ETX

Windows、Linux 和 UNIX 系统都适用的远程桌面工具 OpenText ETX 为 Windows、Linux 和 UNIX 实施精益、经济高效的虚拟化;提供完整的远程 Windows 可用性;以类似本地的性能远程工作;安全地保护系统和知识产权(IP)&am…