【剧前爆米花--爪哇岛寻宝】TCP保证效率,应对特殊情况等相关机制

news2024/11/25 7:40:53

作者:困了电视剧

专栏:《JavaEE初阶》

文章分布:这是一篇关于网络编程的文章,在这篇文章中我会着重介绍TCP保证效率,应对特殊情况等相关机制,希望对你有所帮助!

 

目录

效率

批量传输 滑动窗口

快速重传

流量控制

拥塞控制

延时应答

捎带应答

面向字节流——粘包问题

异常情况

进程关闭 / 进程崩溃

主机关机(正常流程关机)

主机掉电(拔电源)

网线断开


效率

在上一篇博客中,我简述了TCP是如何保证可靠性的。不过可靠性固然重要,传输的效率同样不可以忽视,那TCP在保证可靠性的同时又是怎样提高效率的呢?

批量传输 滑动窗口

TCP为了可靠性引入了应答机制,但是每次当主机1发送一个数据报的时候都需要等待主机2发送一个ack数据报才能进行下一步操作,这是不是有点太慢了?

于是,第一个提升效率的方法就出现了,想要提高效率,就需要缩短等待时间,,怎样缩短等待时间,答案:批量发送数据,一次发多条数据,一次等多个ack

这里是批量发送4条数据,发完之后统一等待ack,每次收到一个ack就立刻发下一条并不是收到4个ack再发下一组,,这样就使用一份时间,等待多个ack了,总的等待时间缩短了,整体的效率就提升了,上述批量传输数据的过程就称为滑动窗口。

注意:这里的效率提升仅仅是和没有进行批处理发送进行的对比,TCP的效率再快也快不过没有可靠性的UDP,可靠性和效率属于是鱼与熊掌不可兼得的东西。

快速重传

批量传送的过程中如果发生了丢包该怎么办?

当ack发生丢包的时候:

举个栗子1001这个ack丢包后,发送方就无法收到1001的这个ack报文,不过当2001这个ack报文传输过来的时候,发送方就可以明白1-1000的数据传输成功了,只是返回来的ack发生了丢包。

当数据发生丢包的时候:

举个栗子:1001-2000的数据发生了丢包,1-1000数据传输成功,那接收方就会返回下一个是1001的确认应答,由于丢包,1001的数据迟迟没有发来,所以接收方会一直返回 下一个是1001的ack报文,不过在这期间发送方仍然会将2001-3000,3001-4000...的数据发送出去,接收端也会接受这些发送来的数据,当发送方连续接受了许多个“下一个是1001”的ack报文后就会开始考虑是不是发生了丢包现象,然后会在重传一次1001-2000的数据,如果该数据没有发生丢包即被成功接收了以后,那接收端的下一次ack报文就会根据目前接收的情况进行传输,即如果现在接收端接收到了5001-6000的数据那接下来就会返回6001的ack。

流量控制

流量控制是一个保证可靠性的机制,上面说过,滑动窗口批量发送,窗口越大相当于批量的数据越多,整体的速度就越快,但是越快越好吗?

计算机在日常的工作中很大程度上手运用了缓冲区,这里也不例外,对于接受到的数据,是先放到接收缓冲区,接下来应用程序就可以通过socket里的InputStream来读了,代码中读出来的数据就从接收缓冲区删除了。

如果发的太快,那瞬间就可以把缓冲区给占满,接下来继续发送的数据就会造成丢包,这种情况下就会得不偿失,不如发的慢点。

那TCP 又是怎样对流量进行控制的呢?

这个16位窗口大小,当该报文的是ack报文的时候,这个窗口大小字段就会生效,这里的值就是建议发送方发送的窗口大小,注意这里是建议,接收方是如何计算窗口大小的?简单粗暴,直接那接收缓冲区的剩余空间的作为窗口大小。

接收缓冲区还有剩余空间的时候,发送发会按照之前介绍的规则向接收方发送数据,当接收缓冲区满了之后发送方就会暂停发送,但是仍然会每隔一段时间触发一个窗口探测报文,如果探测一会发现对方这里腾出空间了,就会继续发送。

拥塞控制

介绍完流量控制,现在要来介绍一下拥塞控制,滑动窗口的大小取决于流量控制和拥塞控制,流量控制衡量了接收方的处理能力,而拥塞控制衡量了传输路径的处理能力。

一段数据要完成从主机1到主机2的通信传输需要经过很多中间节点——一系列的交换机和路由器,很明显,在传输路径上任何一个设备的处理能力遇到瓶颈,都会对整体产生明显的影响,拥塞控制做的事就是衡量中间节点的传输能力。

拥塞控制的做法就是通过实验的方式,找到一个合适的发送速率,开始的时候按照一个小的速率发送,如果没有发生丢包的现象就可以提高一下速率——扩大窗口大小,如果出现丢包就立即在把速率调小,这是暂时不考虑流量控制的情况:

这张图详细介绍了相关的过程,那么现在问题来了,目前我们有拥塞控制和流量控制两种手段来控制窗口的大小,那实际发送方的窗口大小应该怎么计算?答案就是取当前拥塞窗口和流量控制窗口中较小的那一个。

延时应答

TCP可靠性的核心,是确认应答,ack要发,但是不是立即发,而是过一会再发,TCP中决定传输效率的关键元素就是窗口大小,这种延时应答影响的就是窗口大小。

发送方将数据发给接收方后,应用程序从缓冲区读数据进行不停的消费,如果此时立即返回一个ack,此时ack里带有一个窗口大小,如果稍等片刻再返回ack,此时ack里的窗口大小一定比立即返回的要大,因为在这片刻中,应用程序就会又从接收缓冲区中消费一批数据了。

说白了延时应答的效果,就是通过这个延时,让接收方应用程序,趁机多消费点数据,此时反馈的窗口大小就会更大一点,发送方的发送速率也就能更快一点。

捎带应答

捎带应答是基于延时应答的,客户端服务器之间的通信模型,通常是“一问一答”这种模式的,比如现在A向B发送一个请求,B收到数据后会回一个ack报文表示自己已经收到,然后根据相关的业务逻辑,通过一系列的代码执行完返回一个响应,这个响应和ack的时机本来是不同的,但是,由于延时应答,他们俩有几率进行合并,合并成一个数据报进行发送比分两次发效率要高很多。为什么四次挥手有可能三次挥完,也是捎带应答起的效果。

面向字节流——粘包问题

比如现在A给B发两条消息,第一条“今晚去哪吃饭”,第二条“吃饭的时候喝点不”。当A给B连续发了多个应用层数据报之后,这些数据就都积累到B的接收缓冲区中,紧紧挨在一起,此时B的应用程序在读数据的时候,就难以区分从哪到哪是一个完整的应用层数据报,就很容易读出半个包或者一个半包,那么该如何解决呢?

第一个方案是定义分隔符,比如约定每说完一句话的时候都已“。”结尾,这样就知道到哪截止,还有一个方案就是约定长度,约定数据的前4个字节,表示整个数据报的长度。

这俩都是自定义应用层协议的注意事项,xml或者json,本质上都是通过分隔符的方式来实现的,HTTP协议,既会使用分隔符,也会使用长度。

异常情况

断开连接需要进行四次挥手,但现实情况是十分复杂的,会有各种不同断开连接的方式,此时TCP又是如何进行处理的呢?

进程关闭 / 进程崩溃

进程没有了,但是socket是文件,不会突然消失会随之关闭,仍然可以进行四次挥手。

主机关机(正常流程关机)

主机关机会先杀死所有的用户进程,也会触发四次挥手,如果挥完最好,如果没有挥完,比如对方发的fin过来了,还没来得及ack就关机了,此时对端就会重传fin,重传几次都没有ack的时候就会尝试重新连接,如果还不行,就会直接释放连接。

主机掉电(拔电源)

瞬间机器就关了来不及进行任何挥手操作。

如果对端是发送方,对端就会收不到ack,然后进行超时重传,重传也连接不上就会重置连接,最后释放连接。

如果对端是接收方,对端就无法立即知道,发送方是还没来得及发新的数据还是发生意外情况直接没了,所以TCP内置了心跳包保活机制,如果对端是接收方,对端会定期发送一个心跳包,发送方会返回一个,如果双方的回应都很及时则说明没有出现问题,考虑到丢包情况,这个心跳机制会周期性的进行很多次,如果没一次都没有回应,就知道对方挂了。

网线断开

网线断开和主机掉电同理。

以上就是本篇博客的全部内容,如有疏漏欢迎指正!

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

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

相关文章

【九章刷题录】C/C++:数组中重复的数字(JZ3)

精品题解 👉 九章刷题录👈 猛戳订阅 JZ3 - 数组中重复的数字 📜 目录: 「 法一 」暴力大法(BF) 「 法二 」排序 遍历 「 法三 」哈希集合 「 法四 」哈希无序集 「 法五 」原地哈希 「 法六 」Map …

北京筑龙作为软件服务商出席《国企阳光采购标准》研讨会

近日,由中国企业国有产权交易机构协会市场创新专业委员会主办、青岛产权交易所有限公司承办的《国企阳光采购标准》研讨会在青岛召开,该会议共有19家已开展采购业务的各地产权交易机构参加,北京筑龙作为软件服务商出席会议。 《国企阳光采购标…

【Linux】线程同步

文章目录 条件变量相关函数初始化条件变量-pthread_cond_init销毁条件变量-pthread_cond_destroy等待条件变量-pthread_cond_wait唤醒等待条件变量pthread_cond_broadcastpthread_cond_signal 小例子关于等待函数的补充条件变量使用规范 条件变量相关函数 初始化条件变量-pthr…

多台linux设备之间设置免密登陆

1、首先,先搞一个公钥,如果已经有公钥了,请自行跳过 我这是有了,如果没有,也没关系,造一个就好,命令为: ssh-keygen -t rsa 一路回车就行,看下执行结果: 2、…

使用AWTK实现汽车仪表Cluster/DashBoard嵌入式开发概述

AWTK=Toolkit AnyWhere,一款国产免费开源工具,ZLG开发的开源GUI引擎,为嵌入式等系统提供图形界面开发IDE。 随着汽车技术的发展,汽车仪表盘也在快速发展,从最初的机械式到电气式,再到数字化。这次电动化、智能化又一次让汽车仪表出现了飞跃式的发展,再未来,仪表板上可…

【vsomeip】vsomeip安装与入门案例

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍vsomeip的使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&am…

luatOS网站 lua语言学习 练习题

lua 教程跳转链接&#xff0c;练习题都来自这里 逻辑运算 检验大小&#xff08;自测题&#xff09; 题目&#xff1a;如果已知number变量n&#xff0c;那么如果需要判断n是否符合下面的条件&#xff1a; 3<n≤10 以下四行判断代码&#xff0c;正确的是&#xff1f; &a…

【C++】运算符重载(日期类的实现)

【C】运算符重载&#xff08;日期类的实现&#xff09; 前言运算符重载operator全局和类中 日期类的实现成员变量的确定构造函数拷贝构造 运算符重载部分的重载思路实现GETmonthdayoperator 的重载思路实现 -的与-的重载实现 各个比较运算符的重载实现 前置与后置实现 &#xf…

接口自动化【六】——接口关联之jsonpath提取+设置全局变量+通用封装

文章目录 前言一、jsonpath提取二、jsonpath与excel当中提取表达式结合三、类的动态属性设置四、设置全局变量&#xff08;这个模块就作为一个讲解&#xff09;五、new_handle_global_data.py六、new_handle_extract.py七、test_new_upload_image.py 文件中上传图片的代码更改八…

mybatis 在当前项目中的实际应用及自定义分页的实现

mybatis 在当前项目中的实际应用及自定义分页的实现 项目中分页代码的解耦 实现目标 实现目标&#xff0c;使用spring 提供的分页相关的类&#xff0c;避免代码中直接使用PageHelper 具体实现 创建自定义PageHelper&#xff0c;并使用spring-data-common提供的具体实现类操…

OTA升级技术概览

随着物联网技术的不断发展&#xff0c;越来越多的设备和系统需要进行远程升级以保持其安全性和功能性。OTA&#xff08;Over-the-Air&#xff09;升级技术是一种通过无线网络远程升级固件或软件的方法&#xff0c;已经成为现代工业、智能家居、汽车等领域中广泛应用的技术。本文…

欧拉公式——最令人着迷的公式之一

欧拉公式是数学里最令人着迷的公式之一&#xff0c;它将数学里最重要的几个常数联系到了一起&#xff1a;两个超越数&#xff1a;自然对数的底e&#xff0c;圆周率π&#xff1b;两个单位&#xff1a;虚数单位i和自然数的单位1&#xff0c;以及数学里常见的0。 ​而且它对数学领…

generate 和 summary 配合——解析 bingchat 逻辑

generate 和 summary 配合——解析 bingchat 逻辑 new bing 微软作为 openai 公司背后的大股东&#xff0c;多年投入一朝开花结果&#xff0c;当然要把 ChatGPT 技术融入到自己的核心产品中&#xff0c;提升整体生产力。微软的第一个措施&#xff0c;就是在必应搜索引擎 bing…

chatgpt赋能Python-python_span_抓取

介绍 随着互联网的不断发展&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已成为所有网站主人必须面对的问题。在SEO中&#xff0c;抓取是一个非常重要的环节&#xff0c;也是一个关键性的步骤&#xff0c;它直接影响到网站的排名。 在Python编程中&#xff0c;有很多…

Mac上安装多个版本的MySQL

文章目录 准备工作先确定自己机器是多少位的下载包 具体步骤1. 先安装低版本的MySQL2. 清理完后&#xff0c;再安装高版本的MySQL3. 将低版本的文件夹移回 /usr/local4. 切换版本5. 验证 扩展清理命令其他信息 准备工作 先确定自己机器是多少位的 uname -a输出X86_64&#xf…

【Error】Python3.7 No module named ‘_sqlite3‘ 解决方案

场景&#xff1a;docker容器运行keybert时出现错误 No module named ‘_sqlite3‘&#xff0c;是容器环境没有sqlite的库&#xff0c;如下图所示&#xff1a; 本机是能够正常导入sqlite3的&#xff0c;虚拟环境conda下也有该库。 python3.8版本的不可用于python3.7中&#xff0…

【LeetCode】169. 多数元素

169. 多数元素&#xff08;简单&#xff09; 方法一&#xff1a;sort排序&#xff0c;时间复杂度为O(nlogn) 思路 我自己的写法用了最简单的方法&#xff0c;首先使用 sort() 对数组元素按照从小到大进行排序&#xff0c;然后依次遍历每个元素&#xff0c;如果该元素的出现次…

CompletableFuture 异步编排如何使用?

概述&#xff1a; 在做提交订单功能时&#xff0c;我们需要处理的事务很多&#xff0c;如&#xff1a;修改库存、计算优惠促销信息、会员积分加减、线上支付、金额计算、生成产品订单、生成财务信息、删除购物车等等。如果这些功能全部串行化处理&#xff0c;会发费很长的时间…

【盘点】界面控件DevExpress WPF的几大应用程序主题

DevExpress WPF控件包含了50个应用程序主题和40个调色板&#xff0c;用户可以在发布应用程序是指定主题&#xff0c;或允许最终用户动态修改WPF应用程序的外观和样式&#xff0c;其中主题带有调色板&#xff0c;可以进一步个性化您的UI&#xff01; PS&#xff1a;DevExpress …

oracle WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK问题分析

服务概述 财务系统出现业务卡顿&#xff0c;数据库实例2遇到>>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! <<<错误导致业务HANG住。 对此HANG的原因进行分析&#xff1a; 故障发生时&#xff0c;未有主机监控数据&#xff0c;从可以获取的数据库A…