当前位置: 首页 > news >正文

计网----累积应答,TCP的流量控制--滑动窗口,粘包问题,心跳机制,Nagle算法,拥塞控制,TCP协议总结,UDP和TCP对比,中介者模式

计网----累积应答,TCP的流量控制–滑动窗口,粘包问题,心跳机制,Nagle算法,拥塞控制,TCP协议总结,UDP和TCP对比,中介者模式

一.累积应答

1.什么是累计应答

每次发一些包,收到这些包之后,统一回复一个ACK(累计到一定数量的包后统一给一个回复,告诉前面的包都收到了)

2.累计应答用在哪

累计应答用在TCP的流量控制–滑动窗口

二.TCP的流量控制–滑动窗口

TCP的流量控制是通过滑动窗口来实现的

1.什么是窗口

窗口概念:

TCP是没发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了,再发送下一个。这个模式就有点像我和你面对面聊天,你一句我一句。但这种发放的缺点是效率比较低的

有了窗口,就可以指定窗口的大小。窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值

2.滑动窗口

看下图进行了解

在这里插入图片描述

提示

1.图中每一个数字就是一个包

2.图中蓝色的框就是滑动窗口(这里的滑动窗口的大小是20)

3.滑动窗口前面的数据是已发送并收到ACK确认的数据

分析

发送方统一发送滑动窗口中的数据包,如果接收方收到了滑动窗口中所有的包就统一回复一个ACK(这里是回复一个52的ACK)

注意

如果发送方所发送的数据丢失了,这里假设39号包丢失了其他的包都收到了,那么就会返回一个39的ACK,告诉发送方下一次从39号的数据包开始发,39号之后已经处理的包就不再处理了,因为已经处理过了

如果发送方所发送的数据丢失了,这里假设39号包,40号包,50号包丢失了其他的包都收到了,那么会返回一个39的ACK(返回的ACK的值是能收到的连续的序号的最大的那个),告诉发送方下一次从39号的数据包开始发,并且已经处理的包就不再处理了,因为已经处理过了

3.流量控制

1.什么是流量控制

所谓流量控制,主要是接收方收递信息给发送方,使其不要发送数据太快,是一种端到端的控制。主要的方式就是返回的ACK中会包含自己的接收窗口大小,并且利用大小来控制发送方的数据发送

看下图进行了解

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:当接收窗口变为0时,发送窗口也会变为0,发送端就会暂停发送数据。然后等应用程序从接收缓冲区里读出数据的时候,接收端的接收窗口就会变大,然后告诉发送端,发送端的发送窗口也会变大,之后发送端就可以继续发送数据了

三.粘包问题

1.什么是粘包

tcp是字节流传输,是一种没有边界的,可以合并的传输数据方式。

合并就要能拆开,拆不开就是粘包

举例:接收方接收数据之后存在接收缓冲区里,等待应用程序来读,但如果第一次接收的数据,应用程序没有读,第二次接收的数据会写在第一次接收的数据的后面,那这样数据就变成一块了,然后当应用程序来读的时候就没有办法区分这些数据哪些是第一次接收的数据,哪些是第二次接收的数据。

2.解决粘包问题

1.设置标志位(起始/结束标志位)

起始标志位缺点:只有一个包,没收到第二个包,不知道什么时候第一个包结束

起始/结束标志位的共同缺点:没有办法避免用户发的包里面的内容和标志位重复

应用场景:已知要发送的内容都是什么

2.固定包大小

缺点:当用户发送的单个包的数据小于固定包大小就会浪费空间

应用场景:下载文件(文件比较大)

3.先发数据长度,然后再发数据包

缺点:多发了一个数据长度的包,浪费了时间和空间

应用场景:

4.短连接 :每次连接发送一个包然后就断开

缺点:每次连接和断开都会花时间

应用场景:访问网站

注意:解决粘包问题没有最好的方法,只有最合适的方法

四.心跳机制

1.应用场景:

在长连接下,有可能很长一段时间都没有数据连接。理论上来说,这个连接时一直保持连接的,但是实际情况中,如果中间节点出现什么故障时难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活

2.什么是心跳机制

就是每隔几分钟(自己设定时间)发送一个固定消息给服务端,服务端收到后回复一个固定消息。如果服务端几分钟内没有收到客户端信息则视客户端断开

3.心跳包的发送,通常有两种技术:

1.应用层自己实现的心跳包(比较灵活)

2.使用SO_KEEPALIVE套接字选项(TCP协议提供的,比较固定)

五.Nagle算法

1.Nagle算法的作用

Nagle算法是为了尽可能发送大块数据,避免网络中充斥这许多小数据块

(路由器转发数据的时候,不论数据包多大,转发的时间都是相同的,如果包的个数多的话,那路由器转发的时间就多)

2.Nagle算法的规则

1.如果包长度达到MSS(最大报文长度),则允许发送

2.如果该包含有FIN,则允许发送

3.设置了TCP_NODELAY选项时(相当于关闭了Nagle算法),则允许发送

4.设置了TCP_CORK选项时若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送

5.上述条件都未满足,但发生了超时(一般为200ms),则立即送出。

​ Nagle算法默认是打开的,如果对于一些需要小数据包交互的场景的程序,比如,telnet或ssh这样的交互性比较强的程序,则需要关闭Nagle算法。关闭Nagle算法的方法:

int value=1;
setsockopt(sock_fd,IPPROTO_TCP,TCP_NODELAY,(char*)&value,sizeof(int));

六.拥塞控制

1.什么是拥塞

网络中的链路容量和交换节点中的缓存和处理及都有着工作的极限,当网络的需求超过它们的工作极限时,就出现了拥塞。网络中出现拥塞时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时TCP就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大…

所以我们就需要用到拥塞控制,用了拥塞控制之后输入负载与吞吐量之间的关系

在这里插入图片描述

2.拥塞控制

TCP的四种拥塞控制算法:

慢开始、拥塞避免、快重传、快恢复

1.慢开始与拥塞避免
1.拥塞窗口

发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接收方的接收能力,发送窗口可能小于拥塞窗口

(注意:发送方能发送的最大数据量取决于滑动窗口和拥塞窗口二者中小的那个)

2.慢开始算法

慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞成都,也就是说由小到大逐渐增加拥塞窗口的大小。

为了防止cwnd增加过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下

当cwnd<ssthresh时,使用慢开始算法

当cwnd>ssthresh时,改用拥塞避免算法。

当cwnd=ssthresh时,慢开始与拥塞避免算法任意。

3.拥塞避免算法

拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增长

4.看图理解慢开始算法和拥塞避免算法

在这里插入图片描述

提示:

​ 1.当使用慢开始算法下一传输伦次所得的拥塞窗口的值大于了ssthresh值,那下一传输伦次所得的拥塞窗口的值变为ssthresh的值,接下来改用拥塞避免算法

​ 2.当发生超时重传时(图中拥塞窗口为24那一点发生了超时重传),判断网络可能出现拥塞,进行图中的那两个步骤

2.快重传和快恢复

注意:快重传比超时重传快

1.快重传

看图理解快重传

在这里插入图片描述

图中发送方发送的M3丢失了,发送方继续发送了M4,M5,M6,这时接收方就会连续重新确认M2,那就会立即重传M3

2.快恢复

快恢复就是在触发快重传之后,将cwnd变为ssthresh+3

3.看图理解快重传和快恢复

在这里插入图片描述

提示:图中当拥塞窗口为12那一点发生了超时重传

注意:慢开始、拥塞避免快重传和快恢复这四个算法是一起使用从而实现拥塞控制的

七.TCP协议总结

1.TCP协议是面向连接的、可靠的传输,基于字节流的传输方式

2.面向连接指发送数据之前必须在双端建立连接,建立连接使用“三子握手”

3.可靠传输:sep和ack

4.基于字节流的传输:粘包问题

解决方案:1.先发数据长度,然后再发数据包 2.设置标志位(起始/结束标志位)3.固定包大小 4.短连接 :每次连接发送一个包然后就断开

5.为什么TCP是可靠的

1.三次握手和四次回收

2.重传和确认机制

3.合理的手段

4.校验重新排序

5.滑动窗口----流量控制

6.拥塞窗口----4中拥塞控制算法

6…TCP可以发广播吗

TCP是一对一传输的,理论上是不能发广播的

问题一:微信用的是TCP协议,为什么可以一次跟很多人聊天

我们每个人(客户端)都只跟服务端聊天,然后服务端帮我们转发给其他人(其他客户端)

问题二:QQ是使用UDP实现的,那为什么我们在使用QQ的时候不会出现数据丢失

在应用层做seq和ack的功能,保证传输数据可靠

使用一个队列,把我们要发送的数据放到队列中去并编上号,然后把包发出去,包发出去的同时,起一个定时器进行计时,当接收端收到之后返回一个ack看是否超时,没超时就继续发下面的包,超时了就重新发送一次

问题三:QQ是使用UDP实现的,为什么要在应用层实现seq和ack的功能,保证传输数据可靠,为什么不直接用TCP呢

因为UDP比TCP快,因为我们只需要使用TCP的一部分功能,UCP加上TCP的一部分功能还是比TCP快

八.UDP和TCP对比

看下图

在这里插入图片描述

九.中介者模式

设计模式入门中一个模式叫做中介者模式(mediator)。用一个中介对象来封装一系列的对象交互。中介者是各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。简单来说就是解决多组件之间的通信问题,使得组件之间的通信变得简单

看下图进行理解

在这里插入图片描述

相关文章:

计网----累积应答,TCP的流量控制--滑动窗口,粘包问题,心跳机制,Nagle算法,拥塞控制,TCP协议总结,UDP和TCP对比,中介者模式

计网----累积应答&#xff0c;TCP的流量控制–滑动窗口&#xff0c;粘包问题&#xff0c;心跳机制&#xff0c;Nagle算法&#xff0c;拥塞控制&#xff0c;TCP协议总结&#xff0c;UDP和TCP对比&#xff0c;中介者模式 一.累积应答 1.什么是累计应答 每次发一些包&#xff0…...

OpenCV 直方图和归一化

直方图可以反映图片的整体统计信息, 使用函数 CalcHist() 实现. 但CalcHist() 统计出的数量信息和图像大小相关, 如果要剔除图像大小因素, 需要做归一化处理, 归一化处理后的信息, 反映出各个颜色值得占比情况, 这样更方便不同size图像做对比, 归一化的函数为 Normalize(). ///…...

Flink架构

1、Apache Flink集群的核心架构&#xff1a; 1、client&#xff08;作业客户端&#xff09;&#xff1a;提交任务的地方叫做客户端 2、JobManager&#xff08;作业管理器&#xff09;&#xff1a;作用是用于管理集群中任务 3、TaskManager&#xff08;任务管理器&#xff09;&a…...

Packet Tracer路由器连接终端设备怎么配置?

在Packet Tracer中配置一台路由器和三台终端设备可以帮助你建立一个简单的局域网&#xff0c;以下是配置的基本步骤&#xff1a; 打开Packet Tracer&#xff0c;从左侧设备栏中拖拽一个路由器和三个终端设备到工作区。 连接设备&#xff1a;使用网线将路由器的端口与每台终端设…...

评估APP网页小程序代码UI开发H5估价师怎么评估开发精确研发价格?

作为一名应用程序开发评估师&#xff0c;可能涉及到的主要任务是为特定的应用程序提供估算开发成本和所需时间预测。为了为一个应用程序更准确地评估价格&#xff0c;须遵循以下几个步骤&#xff1a; 问: 如何让一个App更好、更精确地评估出价格&#xff1f; 答: 以下是一个可…...

16 Linux 内核定时器

一、Linux 时间管理和内核定时器简介 1. 内核时间管理简介 Linux 内核中有大量的函数需要时间管理&#xff0c;比如周期性的调度程序、延时程序、定时器等。 硬件定时器提供时钟源&#xff0c;时钟源的频率可以设置&#xff0c;设置好以后就周期性的产生定时中断&#xff0c;系…...

C++11 shared_ptr类型智能指针学习

智能指针和普通指针的用法类似,但是智能指针可以在适当时机自动释放分配的内存。 C++11有三种类型的智能指针,shared_ptr、unique_ptr 以及 weak_ptr; 先学习shared_ptr类型; shared_ptr<T> 的定义位于<memory>头文件,并位于 std 命名空间中; T 表示指针指…...

网络流量分类概述

1. 什么是网络流量&#xff1f; 一条网络流量是指在一段特定的时间间隔之内&#xff0c;通过网络中某一个观测点的所有具有相同五元组(源IP地址、目的IP地址、传输层协议、源端口和目的端口)的分组的集合。 比如(10.134.113.77&#xff0c;47.98.43.47&#xff0c;TLSv1.2&…...

JavaWeb篇_02——服务器简介及Tomcat服务器简介

服务器简介 硬件服务器的构成与一般的PC比较相似&#xff0c;但是服务器在稳定性、安全性、性能等方面都要求更高&#xff0c;因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。软件服务器&#xff08;英文名称Server&#xff09;&#xff0c;也称伺服器。指一个…...

2311d游戏引擎适配ios

原文 通过遵循arsd:simpledisplay(v11.0.0之前)上的一些旧代码,Apple的文档和Jacob的这一惊人贡献桥, 我已从金属绑定中删除了所有extern(Objective-C)代码,现在,所有Objective-C桥接代码都是使用D的反射生成的. 因此,给定此例代码: import core.attribute : selector; extern…...

网络唤醒(Wake-on-LAN, WOL)

远程唤醒最简单的方法&#xff1a;DDNSTOOpenwrt网络唤醒&#xff0c;完美实现。 原帖-远程唤醒_超详细windows设置远程唤醒wol远程连接&#xff08;远程开机&#xff09; WOL Web# 访问 Wake on Lan Over The Interweb by Depicus 可以无需借助软件很方便的从网页前端唤醒远…...

接口测试框架实战(一) | Requests 与接口请求构造

Requests 是一个优雅而简单的 Python HTTP 库&#xff0c;其实 Python 内置了用于访问网络的资源模块&#xff0c;比如urllib&#xff0c;但是它远不如 Requests 简单优雅&#xff0c;而且缺少了许多实用功能。所以&#xff0c;更推荐掌握 Requests 接口测试实战技能&#xff0…...

【C++】详解 void*

文章目录 1. void *是什么&#xff1f;2. void*详解3. 和void的区别4. 应用场景4.1 函数传参时不确定类型&#xff0c;或者要支持多类型的传参&#xff1b;4.2 当函数的返回值不考虑类型指关心大小的时候 5. 总结 今天看到一段代码&#xff0c;觉得非常有意思。 void* say_hell…...

Linux家目录变成了-bash-4.2$

Linux家目录变成了-bash-4.2$ Mark a workarround: 使用root用户&#xff0c;执行cp -a /etc/skel/. /home/zookeeper/&#xff08;不是root用户也可以&#xff09; 其中/home/zookeeper/目录是对应自己的家目录地址~ 若有帮到你&#xff0c;记得点赞&#xff0c;收藏呀…...

Python和SQLite游标处理多行数据

如果您需要处理多行数据&#xff0c;使用游标或其他适当的方法是更好的选择。以下是一些处理多行数据的方法&#xff1a; 使用游标&#xff1a;游标可以逐行处理查询结果&#xff0c;这对于大量数据或需要逐行处理的场景非常有用。以下是一个使用Python和SQLite的游标示例&…...

安全测试之PHP 漏洞全解

PHP 漏洞全解(一)-PHP的攻击方式 针对 PHP 的网站主要存在下面几种攻击方式: 1、命令注入(Command Injection) 2、eval 注入(Eval Injection) 3、客户端脚本攻击(Script Insertion) 4、跨网站脚本攻击(Cross Site Scripting, XSS) 5、SQL 注入攻击(SQL injection) 6、跨网站…...

【bug-maven】(一)java: 错误: 不支持发行版本 5 (二):java: 错误: 无效的源发行版:15

【bug-maven】&#xff08;一&#xff09;java: 错误: 不支持发行版本 5 &#xff08;二&#xff09;&#xff1a;java: 错误: 无效的源发行版&#xff1a;15 &#xff08;一&#xff09;java: 错误: 不支持发行版本 5 报错截图&#xff1a; 出错原因&#xff1a; 打开Projec…...

git命令大全(附使用步骤+注释)

下面有具体使用步骤 git status 查看git状态 git add 提交到暂存区 git commit -m 提交到本地仓库&#xff0c;添加注释 git log 查看日志 git clone 克隆远程仓库 git reset&#xff0c;指定文件识 可以将暂存区的文件回退到工作区 git checkout指定文件’ 可以进行工作区还原…...

【论文阅读】Progressive Spatio-Temporal Prototype Matching for Text-Video Retrieval

资料链接 论文链接&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/papers/Li_Progressive_Spatio-Temporal_Prototype_Matching_for_Text-Video_Retrieval_ICCV_2023_paper.pdf 代码链接&#xff1a;https://github.com/imccretrieval/prost 背景与动机 文章发…...

python --- 类与对象(二)

类属性与方法 类的私有属性 __private_attrs&#xff1a;两个下划线开头&#xff0c;声明该属性为私有&#xff0c;不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。 类的方法 在类的内部&#xff0c;使用 def 关键字来定义一个方法&#xf…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...