网络原理 4-TCP3

上篇文章,我们讲了TCP协议的连接管理(”三次握手“和”四次挥手“的过程)。

4、滑动窗口

这个滑动窗口是TCP中非常有特点的机制。我们知道,TCP是通过前面讲的三个机制:确认应答,超时重传,连接管理,实现了可靠传输。

但是,为了实现可靠传输,同时也付出代价,单位时间传输的数据量变少了(传输效率降低了)。

在确认应答机制下,每次发送方收到一个ack才会发送下一个数据,就会导致有大量时间都消耗在等待ack上了,此处等待消耗的时间成本是非常多的。我们希望的是,在保证可靠传输的前提下,尽可能让效率高些,让消耗的时间成本少些。

滑动窗口这个机制就是为了解决上述问题的,滑动窗口可以在保证可靠传输的基础上,提高效率。(这里的提高效率,其实是降低了时间的损耗,而不是增加了传输速度)。

虽然通过滑动窗口这个机制,一定程度上提高了效率,但还是不可能高于UDP这种不需要可靠性的协议。 

滑动窗口,其实就是批量传输:发一个数据,然后不等ack,再发下一条,继续往下发,连续发了一定的数据之后,统一等一波ack。——把多次请求等待ack的时间,使用同一份时间进行等待了,减少了总的等待时间。

为啥会叫滑动窗口呢?—— 批量传输数据的过程,就像下图窗口滑动的过程,返回一个ack,就窗口就往后移动(发送下一组数据)。 

在这幅图上面,黄色区域中的四份数据已经批量传输出去了,传输出这四份数据之后,就等待ack ,暂时先不传输数据了。我们就把黄色区域(不等待ack,能够批量传输的数据量)称为“窗口大小”。

注意:这里并不是等所有ack回来再开始发下一组数据(5001~6001)的,而是等回来一个ack就开始往后发一组数据。

上述发送/返回ack过程都会很快,窗口快速地向后面移动,也就形成一个“滑动”的效果了。因此就把上述过程称为滑动窗口了。

出现丢包的处理

滑动窗口是我们为了提升传输效率的一个机制,但TCP安身立命之本还是可靠性。提升效率的大前提一定是传输是可靠的,如果“滑动窗口”传输的过程中丢包会这么处理呢?

情况一:数据报已经到达,但是ACK丢包了

如上图,主机A的数据都是完好的传到了主机B,但是主机B返回的一些ack出现丢包了,这种情况并不会对我们数据的传输造成影响,我们无需进行任何处理。

注意:这里返回ack 确认序号的含义,比如说返回一个5001,代表5001之前的数据,我(主机B)都已经收到了,就相当于告诉主机A 4001 之前的数据我也已经收到了。

情况二:数据报丢了

数据丢了的情况,此时就需要重传了

如上图1001~2000的数据报丢失了,解决这份数据报丢失的关键要点:在主机A继续向发送数据的时候,主机B的应答报文中返回的确认序号是1001,相当于在向对方索要1001~2000的数据。当发送方向接收方重传了1001~2000的数据报之后(此时已经传到3001~4000的数据了),确认序号就变为了当前所传数据的下一序号(4001)。

在上述重传的过程中,整体的效率是非常高的,这里做到了“针对性重传”。只需要把那个丢了的数据重传,已经收到的数据就不必重传了,我们就把这种重传称为“快速重传”。

注意:

我们前面讲的几个机制:确认应答、超时重传、滑动窗口、快速重传,他们是并不冲突的。

 

滑动窗口中当然也有确认应答,只不过把等待策略稍作调整,转成批量的了。批量的前提是:你短时间内发了很多数据。如果你发的数据很少,此时滑动窗口滑不起来,就变成了确认应答。

如果当前传输过程是按照滑动窗口(短时间内传输了大量数据)就按照快速重传保证可靠性,此时判定丢包的标准就是看有连续多个ack索要同一个数据。

如果当前传输过程是不是按照滑动窗口(没有传输很多数据),此时仍然按照之前的超时重传保证数据的可靠性,此时判定丢包的标准就是达到超时时间还没有ack到达。

5、流量控制

我们前面讲,通过滑动窗口,可以提高传输速率,窗口大小越大,就有更多的数据复用同一块时间等待ack,效率就越高。

窗口大小是不可能无限大的,因为TCP的安生立命之本是可靠传输,任何提升效率的行为,都不能影响可靠性(如果接收方的接收缓冲区饱和了,你继续再给他发就会丢包了,此时重传也可能没用,反而会浪费硬件资源)。

这就像我们小学数学的蓄水池问题: 与其等接收方的接收缓冲区满了,发送方再停止发送,还不如让发送方提前感知到接收方接收缓冲区的情况,提前减慢发送速度,让发送方发送数据和接收方处理数据的速度,可以做到步调一致。这也就是流量控制。

在TCP报头中,有一个16位窗口大小,就是用来做这个的:

通过这个字段来给发送方反馈接收方的接收能力(接收方接收缓冲区的剩余大小),发送方就会知道接下来的窗口大小要设置成多少合适。

补充:

我们这里TCP报头中,窗口大小是16位,但窗口大小并非是64KB(2的16次方是65535,64KB = 64*1024 = 65535),实际上,TCP报头选项中,还包含了一个参数,叫窗口扩展因字,实际上真是要设置的窗口大小是:16位窗口大小*2^窗口扩展因子。

如上图,当接收方的接收缓冲区为0的时候,此时接收方就应该暂停发送,发送方什么时候恢复发送呢?发送方会周期性地发送一个"窗口探测包",这个窗口探测包,并不会携带任何载荷,这样地包对于业务并不产生影响,只是为了触发接收方的ack,一旦查询出的结果是非0时,就什么缓冲区又有空位了,发送方就又可以继续发送了。

 

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

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

相关文章

【使用 Loki + Promtail + Grafana 搭建轻量级容器日志分析平台】

使用 Loki Promtail Grafana 搭建轻量级容器日志分析平台 摘要 本文介绍如何通过 Docker Compose 快速搭建 Loki 日志存储、Promtail 日志采集和 Grafana 日志可视化/告警的完整流程。用最小化示例演示核心配置、常见问题排查和告警规则设置,帮助读者快速上手。…

CRMEB 中 PHP 快递查询扩展实现:涵盖一号通、阿里云、腾讯云

目前已有一号通快递查询、阿里云快递查询扩展 扩展入口文件 文件目录 crmeb\services\express\Express.php 默认一号通快递查询 namespace crmeb\services\express;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use think\Container; use thi…

使用 Python 自动化 Word 文档样式复制与内容生成

在办公自动化领域,如何高效地处理 Word 文档的样式和内容复制是一个常见需求。本文将通过一个完整的代码示例,展示如何利用 Python 的 python-docx 库实现 Word 文档样式的深度复制 和 动态内容生成,并结合知识库中的最佳实践优化文档处理流程…

【MATLAB代码】基于MCC(最大相关熵)的EKF,一维滤波,用于解决观测噪声的异常|附完整代码,订阅专栏后可直接查看

本文所述的代码实现了一种基于最大相关熵准则(Maximum Correntropy Criterion, MCC)的鲁棒性卡尔曼滤波算法(MCC-KF),重点解决传统卡尔曼滤波在观测噪声存在异常值时估计精度下降的问题。通过引入高斯核函数对残差进行加权处理,有效降低了异常观测值对状态估计的干扰。订…

46、web实验-遍历数据与页面bug修改

46、web实验-遍历数据与页面bug修改 在Web开发中,遍历数据和修改页面bug是常见的任务。以下是关于这两个主题的讲解: ### 一、遍历数据 **目的**:在页面上动态展示数据,例如用户列表、商品信息等。 **常用方法**: ####…

华为云Flexus+DeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建自己的自定义聊天助手

华为云FlexusDeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建自己的自定义聊天助手 什么是华为云ModelArts 华为云ModelArts ModelArts是华为云提供的全流程AI开发平台,覆盖从数据准备到模型部署的全生命周期管理,帮助…

Qwen大语言模型里,<CLS>属于特殊的标记:Classification Token

Qwen大语言模型里,<CLS>属于特殊的标记:Classification Token 目录 Qwen大语言模型里,<CLS>属于特殊的标记:Classification Token功能解析工作机制应用场景举例说明技术要点在自然语言处理(NLP)领域 都是<CLS> + <SEP>吗?一、CLS和SEP的作用与常见用法1. **CLS标…

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…

JAVA毕业设计224—基于Java+Springboot+vue的家政服务系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的家政服务系统(源代码数据库)224 一、系统介绍 本项目前后端分离,分为用户、家政人员、管理员三种角色 1、用户: 登录、注册、轮播…

滴滴 服务端 面经

一、缓存与数据库的使用场景及性能差异 1. 缓存的适用场景 高频读、低频写场景:如商品详情页、用户信息等读多写少的数据,减少数据库压力。实时性要求不高的数据:如首页推荐列表、统计数据(非实时更新),允…

linux操作系统---网络协议

目录 案例演练----网络搭建 路由启配置 多个路由情况下如何联通 静态路由 案例演练----网络搭建 Cisco交换机的命令行用户模式1 switch> 特权模式1 switch>enable disable回到用户模式 2 switch#全局配置模式1 switch#config terminal 2 switch(co…

华为OD机试_2025 B卷_计算某个字符出现次数(Python,100分)(附详细解题思路)

文章目录 题目描述字符计数解析:简单高效的统计方法核心解题思路完整代码实现应用场景扩展 题目描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出"输入字符串(第二行输入的字符&a…

华为仓颉语言初识:并发编程之同步机制(上)

前言 线程同步机制是多线程下解决线程对共享资源竞争的主要方式,华为仓颉语言提供了三种常见的同步机制用来保证线程同步安全,分别是原子操作,互斥锁和条件变量。本篇文章详细介绍主要仓颉语言解决同步机制的方法,建议点赞收藏&a…

树莓派远程登陆RealVNC Viewer出现卡顿

原因是:没有连接显示屏,图像传输会受到限制。 没有显示屏怎么解决: 📝 树莓派5虚拟显示器配置教程(强制启用全性能GPU渲染) 🔧 步骤1:安装虚拟显示驱动 bash 复制 下载 # 更…

go-zero微服务入门案例

一、go-zero微服务环境安装 1、go-zero脚手架的安装 go install github.com/zeromicro/go-zero/tools/goctllatest2、etcd的安装下载地址根据自己电脑操作系统下载对应的版本,具体的使用自己查阅文章 二、创建一个user-rpc服务 1、定义user.proto文件 syntax &qu…

[BIOS]VSCode zx-6000 编译问题

前提:Python 3.6.6及以上版本安装成功,Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题:添加环境变量 1:出现环境变量错误,“py -3” is not installed or added to environment variables #先在C:\Windows里…

【Linux】系统部分——进程控制

11.进程控制 文章目录 11.进程控制一、进程创建二、进程终止退出码进程终止的方式 三、进程等待进程等待的方式获取⼦进程status小程序阻塞与非阻塞等待 四、进程程序替换替换原理进程程序替换的接口——exec替换函数 五、总结 一、进程创建 之前学习了fork()函数创建子进程&a…

【读论文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷积神经网络

摘要1 Introduction2 Network Architecture3 Training3.1 Data Augmentation 4 Experiments5 Conclusion背景知识卷积激活函数池化上采样、上池化、反卷积softmax 归一化函数交叉熵损失 Olaf Ronneberger, Philipp Fischer, Thomas Brox Paper:https://arxiv.org/ab…

蓝牙音乐(A2DP)音频延迟的一些感想跟分析,让你对A2DP体验更佳深入

零.声明 最近做蓝牙协议栈的过程中遇到一些客户偶尔提报音频延迟的问题,所以引发了一些感想,跟大家分享下,音频延迟主要的影响范围是对一些要求实时性比较高的场景有比较差的体验 连接蓝牙看视频的过程中,发现音画不同步&#x…

MySQL 8.0 绿色版安装和配置过程

MySQL作为云计算时代,被广泛使用的一款数据库,他的安装方式有很多种,有yum安装、rpm安装、二进制文件安装,当然也有本文提到的绿色版安装,因绿色版与系统无关,且可快速复制生成,具有较强的优势。…