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

news2024/11/28 16:48:32

前言

本篇是介绍部分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.coloradmin.cn/o/423197.html

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

相关文章

spring bean

图灵课堂学习笔记 1. BeanFactory与ApplicationContext的关系 p56 ApplicationContext在BeanFactory基础上对功能进行了扩展,例如:监听功能、国际化功能等。BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封…

python带你制作可以随机的自答题程序

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 目录前言环境使用:模块使用:程序实现思路: <模板> 获取题库一. 获取题库 --> 问题答案二. 进行自动答题操作代码展示题库采集自动答题尾语 &#x1f49d;环境使用: 解释器版本 >>> python 3.8 代码编辑器…

数学基础|线性代数回顾

因为学机器学习的时候发现自己线性代数忘光光了&#xff08;悲&#x1f613;&#xff0c;本篇捞一捞当年学线性代数看哔哩哔哩宋浩老师补充记的潦草笔记。 目录 &#x1f4da;线性代数知识点 &#x1f407;向量 &#x1f955;向量的线性组合 &#x1f955;线性相关无关的性…

JVM 工作原理和即时编译(JIT)

目录 1、什么是虚拟机&#xff1f; 2、JVM 虚拟机简介 3、JVM 的工作原理 4、什么是即时编译&#xff08;JIT&#xff09;&#xff1f; 5、解释型语言和编译型语言的区别 6、为什么说 Java 是一种半编译半解释的语言&#xff1f; 1、什么是虚拟机&#xff1f; 虚拟机是一…

直播美颜技术的演进及其应用:直播美颜SDK详解

直播美颜技术的应用&#xff0c;为直播开辟了新的业态&#xff0c;从最初简单的美颜滤镜&#xff0c;到现在的直播美颜SDK&#xff0c;其技术演进历程也是一步步走来。 一、直播美颜技术的演进 1、简单美颜滤镜 最初的直播美颜技术&#xff0c;就是通过简单的美颜滤镜来实现…

python内存回收gc模块

目录1. python 垃圾回收机制标记-清除的回收机制分代回收2. gc 模块参考资料对已经销毁的对象&#xff0c;Python不会自动释放其占据的内存空间。为了能够充分地利用分配的内存&#xff0c;避免程序跑到一半停止&#xff0c;要时不时地进行内存回收&#xff0c;这时候gc&#x…

超详细——Python中 pip 常用命令

人生苦短&#xff0c;我学Python 相信对于大多数熟悉Python的人来说&#xff0c;一定都听说并且使用过pip这个工具&#xff0c;但是对它的了解可能还不一定是非常的透彻&#xff0c;今天小编就来为大家介绍10个使用pip的小技巧&#xff0c;相信对大家以后管理和使用Python当中…

每天一道大厂SQL题【Day19】华泰证券真题实战(一)

每天一道大厂SQL题【Day19】华泰证券真题实战(一) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

CSS中相对定位与绝对定位的区别及作用

CSS中相对定位与绝对定位的区别及作用场景复现核心干货相对定位绝对定位子绝父相&#x1f525;&#x1f525;定位总结绝对定位与相对定位的区别场景复现 在学习前端开发的过程中&#xff0c;熟练掌握页面布局和定位是非常重要的&#xff0c;因此近期计划出一个专栏&#xff0c…

【问题、AI解答】mongodb中使用$lookup进行连表查询使用_id作为localField出现查询结果字段为空的情况

描述&#xff1a; db.acticles.aggregate([ {$lookup&#xff1a;{from:"acticlesMaptags",localField:"_id",foreignField:"acticleid",as:"tagid"} } ])acticlesMaptags集合中的acticleid字段存在与acticles集合中的_id相匹配的数据…

1.15 从0开始学习Unity游戏开发--游戏UI

上一章中&#xff0c;我们剩下最后一个任务&#xff0c;需要支持鼠标控制准心来进行设计&#xff0c;那么准心本质上就是一个始终呈现在屏幕上的一个图片&#xff0c;你当然可以用一个3D物体来制作&#xff0c;之前讲解渲染概念的时候也提到过&#xff0c;我们的屏幕就是相机的…

传智健康_day3

本章对检查组管理进行开发 一.新增检查组 1.修改新增弹层可见属性&#xff0c;添加重置表单功能 2.动态刷新检查组包含的检查项信息 <tr v-for"c in tableData"> 使用for循环来遍历查询出tableData中的数据 tableData是一个数组对象&#xff0c;定义在VUE…

hadoop分布式安装

文章目录1. 将安装包hadoop-3.1.3.tar.gz上次至linux中2. 进行解压操作3. 修改目录名称4. 配置环境变量5. 远程传输5.1 scp远程传输6. 免密登录7. 集群规划8. 修改自定义配置文件8.1 hadoop-env.sh8.2 core-site.xml8.3 hdfs-site.xml8.4 mapred-site.xml8.5 yarn-site.xml8.6 …

ReactNative入门

React基本用法&#xff1a; react与js不同的点在于 react使用的是虚拟DOM js是真实DOM 作用&#xff1a;当有新的数据填充 可以复用之前的&#xff0c;而js需要整体重新渲染 创建虚拟DOM还可以使用jsx语法直接声明&#xff1a; 注意要用babel标签将jsx转化为js 但是建议采用j…

UNIX环境高级编程——进程环境

7.1 引言 本章主要讲解了进程的环境。 7.2 main函数 C程序总是从main函数开始执行&#xff0c;其函数原型为&#xff1a; int main(int argc, char *argv[]);argc是命令行参数的数目&#xff0c;argv是指向参数的各个指针所构成的数组&#xff1b;当内核执行C程序时&#x…

SpringBoot集成Kafka详解

一、使用idea创建SpringBoot项目 1.1 使用Spring Initializr创建一个SpringBoot程序 点击Next。 1.2 添加依赖 依赖说明&#xff1a; Lombok简化实体类开发。 Spring Web让项目集成web开发所有依赖&#xff0c;包括Spring MVC&#xff0c;内置tomcat等。 Spring for Apache…

HNU-操作系统OS-2023期中考试复习-刷题

往年期中卷极难获得&#xff0c;这里找了几套卷子。可以看看。 因为往年都是从第一周开始上课的&#xff0c;所以进度会快一点&#xff0c;这学期是从第四周开始上课的&#xff0c;所以进程会慢些&#xff0c;讲到第九章所以只考到第九章。 同样因为太忙了&#xff0c;答案找…

图像分类卷积神经网络模型综述

图像分类卷积神经网络模型综述遇到问题 图像分类&#xff1a;核心任务是从给定的分类集合中给图像分配一个标签任务。 输入&#xff1a;图片 输出&#xff1a;类别。 数据集MNIST数据集 MNIST数据集是用来识别手写数字&#xff0c;由0~9共10类别组成。 从MNIST数据集的SD-1和…

ctfshow web入门web119-124

1.web119 和118题类似&#xff0c;只不过是过滤了PATH 0可以用任何字符代替&#xff0c;比如A,{A},A,{0} KaTeX parse error: Expected }, got # at position 2: {#̲SHLVL}1&#xff0c;或者{##},${#?} {PHP_VERSION:~A}2,php版本为x.x.2时 ${#IFS}3(linux下是3&#xff0c;…

IntelliJ IDEA 2023.1正式发布,Maven项目大提速支持Apache Dubbo

你好&#xff0c;我是YourBatman&#xff1a;做爱做之事❣交配交之人。 &#x1f4da;前言 一年一个大版本&#xff0c;共计3个中型版本&#xff0c;北京时间2023年3月月29日终于迎来了IntelliJ IDEA今年的首个版本2023.1。老规矩&#xff0c;吃肉之前&#xff0c;可以先把这…