目录

流量控制

滑动窗口 

丢包重传

情况一:数据到达,应答丢失

情况二:数据包丢失


流量控制

TCP协议会根据接收端的缓冲区大小来调整发送速度,剩余空间多则发送速度快,否则降低发送速度

接收端将⾃⼰可以接收的缓冲区剩余空间⼤⼩放⼊ TCP ⾸部中的 "窗⼝⼤⼩" 字段,窗⼝⼤⼩字段越⼤, 说明⽹络的吞吐量越⾼

接收端⼀旦发现⾃⼰的缓冲区快满了, 就会将窗⼝⼤⼩设置成⼀个更⼩的值通知给发送端

发送端接受到这个窗⼝之后, 就会减慢⾃⼰的发送速度,如果接收端缓冲区满了, 就会将窗⼝置为0; 这时发送⽅不再发送数据, 但是需要定期发送⼀个窗⼝探测数据段, 使接收端把窗⼝⼤⼩告诉发送端.

同时如果接收方的缓冲区腾出空间了,会发送窗口更新通知给发送端

窗口的初始大小由三次握手阶段的ACK包来确定

窗口的大小在TCP首部里是16位,但并不意味着最大只能有65535,首部里的选项还包含了⼀个窗⼝扩⼤因⼦M, 实际窗⼝⼤⼩是 窗⼝字段的值左移 M 位

滑动窗口 

 对每⼀个发送的数据段, 都要给⼀个ACK确认应答. 收到ACK后再发送下⼀个数据段. 这样做有⼀个⽐较⼤的缺点, 就是性能较差. 尤其是数据往返的时间较⻓的时候

既然如此,一次发送多条数据而不等待应答就可大大提升效率

如上图,就是选择一次发送四条数据(这里先记住,TCP协议只能像这样一条发送有限字节的数据,图中就是1000字节,也就是一次只能发送1000字节,不能更多,主要是因为数据链路层的限制,一次性只能传输有限字节的数据)

发送前四个段的时候, 不需要等待任何ACK, 直接发送
收到第⼀个ACK后, 滑动窗⼝向后移动, 继续发送第五个段的数据,依次类推
操作系统内核为了维护这个滑动窗⼝, 需要开辟发送缓冲区来记录当前还有哪些数据没有应答; 只
有确认应答过的数据, 才能从缓冲区删掉;
窗⼝越⼤, 则⽹络的吞吐率就越⾼; 

所谓窗口,就是你写算法题经常遇到的那个滑动窗口。。。这个窗口内所维护的就是待发送的数据段,窗口左边是确认收到应答的数据段,窗口右边就是以后再发的数据段

窗口大小的确定与TCP首部的16位窗口大小有关,先可以理解为那个字段就是窗口大小,根据上面流量控制的讨论,我们知道,这个大小完全取决于接收端的缓冲区剩余空间大小,由这个参数,滑动窗口就能实现流量控制

窗口具体如何移动,取决于TCP首部的确认应答号

确认应答号i+1表示从1~i序号的数据段全收到了,比如上面的图,如果2001~3000丢包了,只收到了1001~2000,不管后面的数据段接收端是否收到,确认应答号都是2001,注意窗口左边的是已经确认过应答的数据段

根据确认应答号i,可以确定窗口左边left = i;

根据16位窗口大小,确定窗口右边right = left + window;

这样滑动窗口就能向右移动起来,注意上面的计算方式只适用于没有丢包的情况

丢包重传

情况一:数据到达,应答丢失

这种情况下, 部分ACK丢了并不要紧, 因为可以通过后续的ACK进⾏确认,比如上图1~1000的数据丢了无所谓,后续会收到1~2000的确认应答号2001,收到2001,根据确认应答好的定义,1~2000全收到了,不用管1~1000没收到应答

情况二:数据包丢失

接收端根本没收到数据包

 对于这种情况,拿下图讨论一下

窗口内的数据段都有可能丢,我们不妨先来回忆一下确认应答号的定义,确认应答号为i表示1~i-1的数据全部收到了,把left赋值为i,表示1~i-1的数据全收到了,如果i <= right,可以看出丢包了,那么i~right的每一个数据段,都有可能丢包了,但是,我们只需要处理最左边的数据段,即以left为开头的第一个数据段,把它重发即可

做完之后,如果确认应答号i > right,直接left = i, right = left + window,否则说明仍有丢包的,假设刚才发的以left为开始的第一个数据段为丢包,那么确认应答号i肯定大于left,直接left = i,然后完全重复上面的工作即可

实际中可能不能根据i <= right来判断是否丢包,因为收到的确认应答号总是要更小的,以下图为例

判断是否丢包,一般根据是否收到3次重复的确认应答为准,不是两次是因为,数据包到达时间并不严格按照发送先后时间,可能3001~4000比2001~3000先到达,导致收到了两次重复的确认应答号,所以一般设置为3次,3次一般足够精确,再多又不好了 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#高级特性面试问题的详细分析,涵盖核心概念、应用场景和最佳实践

序列化与反序列化 1. 什么是序列化和反序列化&#xff1f;用途是什么&#xff1f; // 序列化示例 Person person new Person { Name "Alice", Age 30 }; string json JsonSerializer.Serialize(person); // 序列化为JSON// 反序列化示例 Person deserialized Js…

【电脑】内存的基础知识

内存&#xff08;Memory&#xff09;是计算机中用于临时存储数据和程序的地方&#xff0c;它直接影响到系统的运行速度和性能。以下是关于内存的详细知识&#xff1a;1. 内存类型常见的内存类型包括以下几个主要种类&#xff1a;SDRAM (Synchronous Dynamic Random Access Memo…

Java---IDEA

IDEA概述 IDEA&#xff1a;全称Intellij IDEA&#xff0c;是用于Java语言开发的集成开发环境 集成环境&#xff1a;把代码编写&#xff0c;编译&#xff0c;运行&#xff0c;调试等多种功能综合到一起的开发工具 下载与安装 下载&#xff1a;IntelliJ IDEA – the IDE for …

【每日刷题】x 的平方根

69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;暴力 从0开始遍历&#xff0c;直到 ans*ans > x 为止&#xff0c;这时ans-1就是答案。需要注意可能会爆int&#xff0c;所以ans要开为long&#xff0c;最后再转换为int。 class Solution {publ…

C#元组:从基础到实战的全方位解析

C#元组&#xff1a;从基础到实战的全方位解析 在 C# 编程中&#xff0c;元组&#xff08;Tuple&#xff09;是一种轻量级的数据结构&#xff0c;用于临时存储多个不同类型的元素。无论是方法返回多个值、LINQ 查询中的临时投影&#xff0c;还是简化数据传递&#xff0c;元组都以…

Django母婴商城项目实践(二)

2、母婴商城项目环境配置 环境配置: Python3.12 解释器Pycharm Professional 2025.1 编辑器Django 4.2(或 Django 5.x)MySQL 8.0.28 数据库 1、Django框架 介绍 Django是一个高级的Python Web应用框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django负责…

Go语言的Channel通道的含义。区分缓冲通道和非缓冲通道,并讨论通道的发送、接收、关闭以及如何安全地从已关闭的通道读取数据。

非缓冲通道&#xff1a;非缓冲通道在确定时没有声明容量大小&#xff0c;发送和接收操作会同步阻塞&#xff0c;直到另一端准备好。发送方和接收方必须同时就绪才能完成数据交换&#xff0c;否则会阻塞。常用于goroutine之间的同步通信。缓冲通道&#xff1a;缓冲通道在确定时就…

tensor

&#x1f609;如果您想用jupyter notebook跑我的笔记&#xff0c;可以在下面获取ipynb版本 &#x1f60a;麻烦给个免费的star&#x1f618; ❤️主包也更建议这种形式&#xff0c;上面的笔记也更加全面&#xff0c;每一步都有直观的输出 文章目录&#x1f4da; PyTorch张量操作…

STM32-DAC数模转换

DAC数模转换&#xff1a;将数字信号转换成模拟信号特性&#xff1a;2个DAC转换器每个都拥有一个转换通道8位或12位单调输出&#xff08;8位右对齐&#xff1b;12位左对齐右对齐&#xff09;双ADC通道同时或者分别转换外部触发中断电压源控制部分&#xff08;外部触发3个APB1&am…

前后端集合如何传递

前端vue后端rest风格&#xff1a;1.路径传参&#xff08;参数必传&#xff09;&#xff0c;通过pathvarible注解后端&#xff1a;DeleteMapping("/{YYIDs}")public R<Void> remove(NotEmpty(message "主键不能为空")PathVariable String[] YYIDs) {…

1353. 最多可以参加的会议数目

1353. 最多可以参加的会议数目 题目链接&#xff1a;1353. 最多可以参加的会议数目 代码如下&#xff1a; class Solution { public:int maxEvents(vector<vector<int>>& events) {int mx 0;for (auto& e : events) {mx max(mx, e[1]); // 找到最大的结…

OCR 本地版本

UMI OCR 支持本地部署&#xff0c;支持HTTP OCR

大数据驱动的酒店用品需求预测模型研究 开发——毕业论文,毕业设计——仙盟创梦IDE

主页酒店用品 平台协议促销毕业论文摘要本研究旨在构建基于大数据分析的酒店用品需求预测模型&#xff0c;以提高酒店用品批发企业的库存管理效率和供应链响应速度。研究整合了酒店历史采购数据、季节因素、市场趋势、节假日信息等多源数据&#xff0c;通过对比传统时间序列模型…

Windows11桌面解锁守护脚本

使用python程序加bat一键运行脚本&#xff0c;妈妈再也不用担心我的电脑桌面了import os import time import cv2 import pyautogui import psutil from datetime import datetimeclass UnlockMonitor:def __init__(self):"""初始化监控器"""sel…

Linux Ubuntu系统的用户管理

一.关于root用户默认我们安装完系统后 注册的用户就是管理员用户标识符 $ 管理员标识符#最高管理员在Ubuntu系统中,root是最高管理员,拥有最大的权限,默认情况下root用户没有启用密码,而是通过sudo机制来获取管理员权限二.Ubuntu系统中root用户的默认状态root用户存在,但未启用…

ROS1学习第三弹

ROS1学习第二弹 本文纯属记录学习过程&#xff0c;所学教程来自B站古月居ROS入门21讲 tf工具的使用 命令行中 1.rosrun tf view_frames 生成当前各个坐标的结构图&#xff0c;导出pdf文件到当前终端所在文件夹下面2.rosrun rviz rviz -d rospackage find turtle_tf /rviz/tu…

技术演进中的开发沉思-30 MFC系列:五大机制

MFC&#xff0c;记得我刚毕业时在 CRT 显示器前敲下第一行 MFC 代码时&#xff0c;那时什么都不懂&#xff0c;没有框架的概念。只觉得眼前的 CObject 像位沉默且复杂的大家族&#xff0c; 就像老北京胡同里的大家族&#xff0c;每个门牌号都藏着自己的故事。但现在看看&#x…

机器学习-06(Optimization-自动调整学习率)

临界点其实不一定是在训练神经网络过程中遇到的最大阻碍。随着对参数的不断更新&#xff0c;Loss值会不断下降&#xff0c;直至几乎没有变化&#xff0c;不再下降。当参数更新到临界点时&#xff0c;意味着gradient非常小&#xff0c;所以要认定参数是否到达临界点应当确认grad…

Uniapp中的uni.scss

uni.scss为uni-app新建项目自带工程文件&#xff0c;使用的预处理器为sass/scss&#xff0c;由此可见&#xff0c;uni-app官方推荐的是scss。 uni.scss特点 无需引入&#xff0c;uni-app在编译时&#xff0c;会自动引入此文件在此中定义的scss变量&#xff0c;可以全局使用&…

PreparedStatement 实现分页查询详解

PreparedStatement 实现分页查询详解 在 JDBC 中使用 PreparedStatement 实现分页查询是高效安全的方式&#xff0c;可以避免 SQL 注入并提升性能。下面我将详细说明实现步骤和原理。 &#x1f4d0; 分页查询核心参数参数名说明计算公式pageNum当前页码&#xff08;从1开始&…