计算机网络 - TCP的效率与特性


前言

本篇是介绍部分TCP的特性,了解TCP提高传输速率的机制;如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
    • 1. 滑动窗口
    • 2. 流量控制
    • 3.拥塞控制
    • 4.延时应答
    • 5. 捎带应答
    • 6. 面向字节流
    • 7. 异常情况 - 通信过程的异常情况
  • 总结

本文开始

1. 滑动窗口

TCP在保证可靠性的同时,也要保证效率;

为什么引入滑动窗口?
如果客户端一个一个syn(申请连接), 就需要花大量的时间去等待ack(应答报文),想要提高效率,就需要批量发送数据了;
此时就引入了滑动窗口;

滑动窗口:批量传输数据;窗口中是等待的数据;(批量传输数据,等待多个ack)

滑动窗口的限制:虽然滑动窗口可以批量发送数据,但不是无限发送数据,等到一定的程度,就需要等待ack;等到一个ack就立即发送下一条数据,相当于保证滑动窗口的大小不变(批量等待的数据是一定的,少了就加,多了等待);

窗口滑动:
下图当收到2001这个应答报文,相当于确认收到2001之前的数据,此时会立即发送下一段数据5001-6001;

在这里插入图片描述

效率建立在可靠性的基础上,批量发送数据时,可能会出现丢包现象;
前提:批量传输数据的时候;
① ack应答报文丢失
这个情况,对可靠性没有任何影响;
这里就体现了确认序号的意义:确认序号表示,在该序号之前的数据都已经收到;后面的ack传输过去,表示前面的数据已经收到了,所以前面的ack丢了没有任何影响;
② 数据丢失
这里使用了快速重传;
当发送方主机A的部分传输数据丢失,接收方主机B会多次索要丢失的这部分数据,当主机A连续收到主机B索要的数据信息,就会重传这部分数据;

在这里插入图片描述

上图中接收缓冲区:当发送方数据丢失,接收方多次向发送方索要数据,发送方才会重传丢失的数据;在发送方重传之前,因为时批量发送数据,剩余数据依然会向接收方发送数据;所以当重传之后,接收方向发送方索要601开始的数据;

2. 流量控制

为什么引入流量控制呢?
虽说滑动窗口越大,批量发送的数据越多,速度就越快,但并不是越快越好,如果发送的数据瞬间充满接收缓冲区,接下来继续发送,此时数据就会丢包;所以引入了流量控制,限制数据的传输;

流量控制:让接收方来限制发送方的速度;(缓冲区满了,会阻塞等待)

流量控制如何控制呢?
在ack报文中会携带一个16位窗口大小的字段,里面的值就是建议发送方发送的窗口大小;
【注】URG,ACK,PSH,RST,SYN,FIN这6位是特殊的标志位,当它们为1时,对应的报文就会生效;这里是ack报文生效,里面的值就是建议发送方发送的窗口大小;

在这里插入图片描述

接收方如何计算窗口大小?
窗口大小 = 接收缓冲区的剩余空间;(发送方根据接收方返回的窗口大小,批量发送数据)-> 这里只是一部分,其实还需要拥塞控制;
图示:

在这里插入图片描述

流量控制的发送过程:
① 发送方首先发送一小部分数据,等待接收方的应答报文,此时会知道接收缓冲区的剩余空间,下次发送就会使用滑动窗口批量发送;
② 等到接收缓冲区满了,发送方会暂停发送;
③ 发送方暂停发送后,每隔一段时间会发一个窗口探测报文,如果这期间应用程序使用从socket读取数据,消费接收缓冲区内容,探测报文不在是0,此时发送方就可以继续发送数据;(满了,每隔一段时间探测,等待消费,接收缓冲区不在满了,就继续 发送)
【注】探测报文:不发送数据,但是探测接收缓冲区是否满了,不满就发送,满了隔一段时间继续探测;

这样只是单独把接收缓冲区的剩余空间作为滑动窗口大小进行发送数据,实际还需要考虑拥塞控制;

3.拥塞控制

实际发送方的窗口大小 = min(流量控制窗口 , 拥塞窗口);
流量控制窗口:根据接收缓存取计算出来的;
拥塞窗口:拥塞控制实验出来的;

为什么引入拥塞控制?
从A发送消息到B,不是直接通信,中间需要经过很多节点(路由器,交换机等),也需要考虑这些中间节点的处理能力,所以引入拥塞控制;
如果中间的某个节点出现问题,对整体传输速率有影响,所以需要拥塞控制;

拥塞控制:衡量 中间节点 / 路径 的传输能力;

如何计算拥塞控制的发送速率呢?
数据从A传输到B,每次走到路径都不相同,不能够算出一个具体的值;只能通过实验的方式,找到一个合适的发送速率;而这个发送速率其实是一个动态平衡的状态;

拥塞控制这样的动态平衡状态适应了网络拥堵的情况;
拥塞窗口变化的执行过程:
① 首先给一个较小的初始窗口;
② 窗口先开始指数增长,短时间到达阈值(当前网络传输路径能力的较大值);
③ 窗口再线性增长,增长到一定程度,到达当前路径传输上限,开始丢包;(线性增长是为了逐渐接近路径传输的上限,因为指数增长太快了)
④ 窗口会再次回归到一个比较小的初始值,再次重复上述过程,但是指数增长的阈值会比之前的阈值小;
图示:

在这里插入图片描述

【注】
x轴传输轮次: 第几次发送;
y轴拥塞窗口:按照多大的速率发送数据;(不考虑流量控制)
慢开始:开始传输初始值给较小的窗口,相当于传输的速度慢;(当前网络情况未知,所以先给较小的窗口即可,给大了,可能更堵)
网络拥堵:达到路径传输上限;

4.延时应答

延时应答:发送ack的时候,稍微延时再发送, 此时接收方的应用程序,会消费接收缓冲区中的数据,此时返回的窗口大小就会大一点,就可以提高传输效率;

为什么延时应答可以提高传输效率呢?
接收方中存在接收缓冲区,在发送方一直向接收方发送数据;
接收方会做出两种选择:
① 立即返回ack应答报文,设此时应答报文中窗口大小为n;
② 延迟一会在返回ack应答报文,在延迟的时候,会消费接收缓冲区里的数据,此时返回的窗口大小大概率大于n;

5. 捎带应答

捎带应答:基于延迟应答;
例如:四次挥手,通过捎带应答就变成了三次挥手;

在这里插入图片描述

ack 与 response 时机不同,但通过延时应答,ack就会等待一会再发送,就可能会和 response 合并成一个数据报一起发送;

6. 面向字节流

出现的问题:粘包问题;

粘包问题:
A向B连续发送多个应用层数据报后,这些数据都堆积在B的接收缓冲区中,数据都挨在一起,区分不了一个完整的数据报;
如果此时B在读取数据时,就可能读取半个报等情况;

解决方式:自定义应用层协议
① 定义分隔符,区分每个数据报;
② 约定长度,这个长度就是完整数据报的长度,每次读取固定长度即可;

7. 异常情况 - 通信过程的异常情况

前提:两端正在进行通信,出现的异常情况;
① 进程关闭 / 崩溃
进程关闭,socket是文件也关闭,进程关闭了但连接还存在,仍可以四次挥手;-》属于正常关闭,不影响;
② 主机关机 - 开始菜单中的关机
关闭所有进程,会触发四次挥手;如果四次挥手没有执行完,就关闭主机了,对端会超时重传,如果没反应ack, 就重置连接,再没反应,就释放连接;
③ 主机掉电 - 拔电源 - 瞬间
主机瞬间关闭,来不及四次挥手操作;
1)对端是发送方:
对端收不到ack, 先超时重传 -》再重置连接 -》最后释放连接;
2)对端是接收方:
对端不知道发送方是没发送数据,还是直接挂了;
使用了TCP内置的心跳包保活机制:特点
i) 周期性,定期发送与定期回应;
ii) 没心跳,挂了就释放连接;
④ 网线断开 与 主机掉电情况一样;


总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

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

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

相关文章

Android FrameWork详细教程—第一个启动的程序--init 与 Zygote

第一个启动的程序–init 不管Java还是C运行一个程序都是以main方法作为入口。所以我们先看看init.cpp的main函数. 目录:/system/core/init/main.cpp 具体代码: int main(int argc, char** argv) { #if __has_feature(address_sanitizer)__asan_set_er…

Kaggle 赛题解析 | AMP 帕金森进展预测

文章目录一、前言二、比赛说明1. Evaluation2. Timeline3. Prize4. Code Requirements三、数据说明四、总结🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 竞赛题目:AMP-Parkinson’s Disease Progression Prediction 竞赛地址…

基于逻辑回归构建肿瘤预测模型

使用逻辑回归构建肿瘤预测模型 描述 乳腺癌数据集包括569个样本,每个样本有30个特征值(病灶特征数据),每个样本都属于恶性(0)或良性(1)两个类别之一,要求使用逻辑回归&…

spring beancopier Cannot invoke “Object.getClass()“ because “cause“ is null异常处理

我们项目用到spring beancopier, 在别的机器上运行正常,代码拉到我机器上就不正常了,抛出异常信息如题。 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.ibm.riskmeasure.rwaservice.service.singlete…

ASP.NET Core MVC 从入门到精通之初窥门径

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生&#xff0c…

字节跳动软件测试面试过了,起薪20k

普通二本计算机专业毕业,从毕业后,第一份接触测试的工作是在一家通讯小公司,大部分接触的工作是以功能测试为主,一直都是几千块钱工资,还一度被派出差,以及兼职各种产品、运维、运营的活,感觉自…

真1分钟搞懂缓存穿透、缓存击穿、缓存雪崩

💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…

NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027

然后我们来看连接与关系部分 然后右键一个关系可以看他的配置 注意这个,如果添加多个关系,这里flowfile就会自动clone 然后可以看到连接的配置中有,flowfile过期时间配置,有back pressure 背压配置, 有负载均衡配置 这里的这个FlowFile Expiration是配置FlowFile在队列中的过期…

网络中的一些基本概念

组建网络的重要设备 集线器,交换机(组建局域网,不能跨局域网组建网络),路由器(wifi本质上是无线路由器,路由器的本质的把俩个局域网给连起来) 网络通信的一些基础概念 IP地址 标识了网络设备所在的位置 端口号 标识了一个具体的应用程序 协议 协议是网络通信的概念,约定好…

虹科案例 | 虹科Domo商业智能,助力保险公司逃离繁杂数据池!

金融行业的发展充满着不确定性,一个具备强大承保能力和精算专业知识的资金池,对于身处该领域的公司和个人都是十分必要的。 在全国城市联盟(NLC)的协助下成立的NCL Mutual会员制互助保险公司,为各个地区城市提供了稳定…

第13届蓝桥杯省赛真题剖析-2022年4月23日Scratch编程初中级组

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第121讲。 第13届蓝桥杯省赛举办了两次,这是2022年4月23日举行的第二次省赛,比赛仍然采取线上形…

MySQL SQL性能分析 慢查询日志、explain使用

SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的insert、update、delete、delect的访问频次: -- session 是查看当前会话; -- global 是查询全局数…

paddle实现手写数字识别模型继续解读

要点: 手写数字识别用简单的线性进行分类效果比较差,添加卷积层和池化层效果会相对较好。参考文档:百度官方文档 一 网络结构 前几节我们尝试使用与房价预测相同的简单神经网络解决手写数字识别问题,但是效果并不理想。原因是手…

7.1 基本运放电路(1)

集成运放的应用首先表现在它能构成各种运算电路上,并因此而得名。在运算电路中,以输入电压作为自变量,以输出电压作为函数;当输入电压变化时,输出电压将按一定的数学规律变化,即输出电压反映输入电压某种运…

Msray-Plus采集工具帮您轻松获取目标受众的数据,让您的市场营销更加便捷

市场营销是企业推广产品和服务的重要手段之一,是企业获取客户和提高销售业绩的关键环节。然而,传统的市场营销方式存在着很多弊端,如缺乏数据支持、信息不准确、效率低下等问题,这些问题直接影响了企业的市场营销效果。而随着互联…

【Redis学习】Redis集群

理论简介 定义 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节东间共享数据的程序集。…

Python中的主函数

在Python代码中,我们常常看到主函数是以if __name__ __main__开头的,比如 它的原理是什么呢? 首先要知道,__name__是内置变量,用于表示当前模块的名字。在一个模块中运行以下语句,你会发现输出的是__main…

elasticsearch 核心概念

1.近实时(Near Real Time,NRT) elasticsearch 是一个近实时的搜索和分析平台,这意味着从索引文档到可搜索文档都会有一段微小的延迟(通常是1s以内)。这种延迟主要是因为 elasticsearch 需要进行数据刷新和索引更新。 …

基于目标级联法的微网群多主体分布式优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

餐饮店的运营需要考虑哪些方面

餐饮店的运营需要多方面的考虑和规划,以下是传递宝APP上一些常用的餐饮店运营方法: 1.定位:明确餐饮店的定位和目标客户群体,针对不同的客户需求,提供个性化的服务和产品,比如是附近的上班族,还…
最新文章