TCP滑动窗口和拥塞控制

2023-11-17

滑动窗口

什么是滑动窗口

滑动窗口是TCP协议为了实现流量控制而设计的机制,它通过窗口的大小来控制发送端发送的数据量。

 

为什么要使用滑动窗口

TCP协议在没有引入滑动窗口的概念之前,TCP没发送一次数据,都需要进行一次应答,只有收到了应答,才能发送下一个数据,这种方式存在一个问题,如果数据报往返的时间越长,通信的效率就越低。
为了解决这个问题,TCP引入了窗口的概念。在没有收到上次发送数据的ack应答,还可以发送下一个数据报,之后可以通过后面的ack来确认前面发送的数据报是否都被接收方接收到了。
窗口实际上是操作系统开辟的一块缓存空间(窗口的实质),其中空间和序号都是有限的,并且要循环使用,一般为环形队列。发送方会将已经发送的数据存放在缓存空间中,收到应答后,再将这个数据从缓存空间中清除掉。
 

滑动窗口的工作原理

1、在建立TCP连接之前,通信双方会交换自己的窗口大小信息。
2、发送端根据窗口大小,可以发送多个报文而不需要立即进行ack应答。
3、接收端接收到报文后,立即进行ack应答,应答可以帮助发送端得到成功接收的报文段,并依据此来调整窗口内未确认的报文段。
4、当发送端收到ack应答时,会将窗口向前滑动,以便发送更多的报文段。这就是滑动窗口的名称由来。
5、如果接收端不能及时回复ack应答,发送端窗口将不再滑动,将不再发送更多报文段,此时会发生“阻塞”。
6、当接收端的阻塞情况解除时,它会进行ack应答,发送端接收到ack应答之后重新开销滑动窗口并进行发送。

 

滑动窗口会出现的几种问题

数据包丢失怎么解决?

当发送端发送了一定数量的报文段,当有某个报文段丢失,接收方在没有收到自己预期的序号时,会按照上一次的ack进行应答,如果接收方连续三次都按照上一次的ack进行重复应答,那么就需要发送方重新发送数据包。
所以滑动窗口机制下,如果数据包丢失,那么会触发快速重传机制。

 

ACK丢失怎么解决?

滑动窗口可以通过累计确认来解决ack丢失的问题。
当发送端发送了一定数量的报文段,但是前几条数据的ack都丢失了,由于最后一个ack没有丢失,那就证明之前的数据接收端都收到了,这就是累计确认。累计确认可以让中途ack丢失的情况通过下一个ack应答来进行确认,如果最后一个ack也丢失了,那就是滑动窗口机制最坏的情况了,这种情况下会触发超时重发机制。

 
 

拥塞控制

拥塞控制是什么?

拥塞控制是TCP协议为了避免网络拥塞而设计的机制,它通过监测网络拥塞情况,动态调整发送端的发送速率,以避免资源的过度占用和数据包丢失。

它的主要作用是:根据网络拥塞情况来调整发送速率,减少了网络中数据包丢失和重传,使得网络拥塞状况得以缓解。
 

拥塞控制的实现

拥塞控制是由慢开始、拥塞避免、快重传和快恢复机制来实现的。
在了解这几个机制之前,我们需要了解两个概念

  • 拥塞窗口(cwnd)
  • 慢开始门限(ssthresh)

1、慢开始:在TCP连接开始时,发送端会启动慢开始阶段,刚开始的时候拥塞窗口很小,之后每收到一个ack拥塞窗口的大小都会加倍,直到一个阈值。慢开始的目的是在建立连接时逐渐增加发送速率,避免过快发送数据和过多的数据包导致网络拥塞。

2、拥塞避免:为了防止拥塞窗口增加过快而导致网络拥塞,所以TCP设置了一个慢开始门限(ssthresh)。
当拥塞窗口 < 慢开始门限,使用慢开始算法。
当拥塞窗口 = 慢开始门限,两种算法都可以使用。
当拥塞窗口 > 慢开始门限,停止使用慢开始算法,使用拥塞避免算法。
3、快重传:快重传要求接收方收到一个失序的报文段后就立即发出重复确认,而不要等待自己发送数据时才进行携带确认,并且要求发送方只要同时收到三个重复确认就应当立即重新发送发送端尚未收到的报文段,而不需要设置重传计数器。
4、快恢复:快恢复机制是和快重传机制配合使用的,它有两个要点:
(1)当发送方连续收到了三个重复确认时,为了防止网络发生拥塞,会把慢开始门限减半,来降低网络发送速度。
(2)由于发送方现在认为网络很可能没有发送拥塞,因此和慢开始不同的是这里不执行慢开始算法,而是把拥塞窗口的值设置为已经减半后的慢开始门限的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢线性增大。

 

理解拓展:拥塞控制是如何判断网络拥塞情况的?

TCP拥塞控制是根据丢包事件、ACK延迟、重复确认来判断网络拥塞情况的。
丢包事件:TCP通过检测数据包是否被丢弃来判断是否发生了丢包事件,从而推断网络是否发送了拥塞。
ACK延迟:如果接收方的ack应答消息应答得很慢,那么可能意味着网络拥塞。
重复确认:TCP同接收到重复消息来判断是否发送了网络拥塞。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP滑动窗口和拥塞控制 的相关文章

  • 根据身份证号获取出生日期,年龄,性别

    java语言 根据身份证号获取出生日期 年龄 性别 测试程序 public class TestUtils public static void main String args String idcard xxxxxxxxxxxxxxxx
  • oracle 获取日期的毫秒_Oracle 毫秒时间戳

    其实很早以前就经常碰到这个问题 就是得到自1970年1月1日以来的秒数 这个问题很容易解决 SQL gt SELECT SYSDATE TO DATE 1970 1 1 8 YYYY MM DD HH24 86400 FROM DUAL S
  • Linux学习笔记-----缓冲区概念及git使用

    一 编译文件 编译器是如何知道我的生成软件需要被重新编译了 根据文件的修改时间来的 因为用户不可能同时修改多个问题 所以文件修改总是有先后顺序的 又因为 源文件和可执行程序时间总是交叉 二 缓冲区概念及理解 1 概念 就是一块内存 刷新策略
  • clickhouse导入数据 DBeaver大坑

    测试数据有一亿条需要导入数据库 使用DBeaver自带导入数据功能 结果放置一晚才导入一千万条 估计导入设置有问题 于是寻找合适方式 记录如下 首先将待导入的csv数据表45G 传输到clickhouse所在的服务器 在数据库中提前建好表
  • 魔方机器人之硬件篇

    待续 点击打开链接 思睿硬件设计博客

随机推荐

  • 面向组织分析的内容

    声明 本文是学习GB T 42859 2023 航天产品质量问题三个面向分析方法实施要求 而整理的学习笔记 分享出来希望更多人受益 如果存在侵权请及时联系我们 1 范围 本文件规定了航天产品质量问题三个面向分析方法实施的一般要求 程序和分析
  • 进制转换(C++)

    文章目录 一 任意2 36进制数转换为10进制数 1 1 c 代码实现 二 十进制转换为其他进制 2 1 方法一 2 2 c 代码实现 2 3 方法二 2 4 Demo 一 任意2 36进制数转换为10进制数 以二进制转换为十进制为例 基本
  • Vue2 vue-cropper裁剪图片-使用方法及注意事项

    记录vue croppe的使用及过程中遇到的问题 参考文章 Vue2中使用vue croper插件实现图片上传裁剪 超详细 效果图 安装 npm install vue cropper 或 yarn add vue cropper 封装vu
  • Linux之gdb的使用

    当我们能够在windows下 使用vs 2019等编译器去进行调试的时候 我们可以将在Linux下使用gdb调试这两者之间进行对比 调试这个操作 在方法上有区别吗 Linux和windows 其实 在调试思路上是一样的 在调试的操作方式上一
  • 超详细的移动Web知识树状图(flex、移动适配、响应式)

    前言 学习任何新知识 最重要的永远都是搭建属于自己的知识框架 随后学习的细碎知识点往框架里面填入 最后形成一棵属于自己的知识大树 本系列的博客专注更新总结好的思维导图 希望可以帮助大家快速理清知识结构 注意 本系列文章是拿来建立知识体系 没
  • 基于51单片机的热水器设计

    概述 本实例是基于51单片机的智能热水器控制系统 主要硬件由51单片机最小系统 LCD1602显示屏屏电路 水位传感器电路 ADC转换电路 DS18B20数字温度传感器 蜂鸣器报警电路 按键电路 加水继电器电路 加热继电器电路电路构成 功能
  • IPv6 ‘dadfailed‘异常问题:重复地址检测【已解决】

    ipv6地址显示异常 inet6 x x x x 1 64 scope global tentative dadfailed 无法使用命令ping6 这个地址 原因是当另一台主机关闭 但ipv6地址未被删除 并且新主机无法使用此地址时 为防
  • Kali开启ssh服务

    Kali开启ssh 尝试Powershell连接ssh服务 输入密码 发现被拒绝 ssh root kali的ip 一般出现这个问题大概率可能是ssh服务没有开启 开启一下即可 注 密码错误也会报该错误提示 这里是正确密码的情况下 第一步
  • 将网站打包成桌面程序并生成安装包(跨平台)

    一 Nativefier将网站打包成桌面程序 介绍 Nativefier 是一个命令行工具 仅仅通过一行代码就可以轻松地为任何的网站创建桌面应用程序 应用程序通过 Electron打包成系统可执行文件 app exe等 对应的可执行文件分别
  • spring mvc oracle 配制,Springmvc+mybatis配置动态切换数据源 并实现mybatis同时支持mysql和oracle数据库...

    注意 配置切换数据源和实现mybatis支持多种数据库为独立的配置 二者不相干 一 实现mybatis支持多种数据库 这里配置扫描不需要区分 扫描全部即可 classpath com mapper xml oracle mysql myba
  • 邮箱发送html php源码,php发送邮件函数,支持html和普通文本

    eol headers Reply To namefrom eol headers Return Path namefrom eol these two to set reply address headers Message ID eol
  • 分享一百多套开发视频教程的下载地址

    原文地址 http www cnblogs com dennisit p 3184225 html 北京圣思Java培训教学视频 资源共享网 2 Lucene WebService SVN Ant SpringMVC视频 学习资料库网 3
  • CMake入门教程:configure_file构建配置编程

    CMake入门教程 configure file构建配置编程 在进行软件开发过程中 配置文件的生成和管理是一个重要且常见的任务 为了简化这一过程 CMake提供了configure file函数 它可以帮助我们在构建过程中动态生成配置文件
  • Python----Python调用C语言方法

    原文链接 1 为什么要使用Python调用C语言 可以将一些耗时的操作的函数使用C语言编写 然后主题代码是python 这样使用python去调用C语言 就可以做既能有python语言的简单性 有可以利用C语言的高性能 从而达到整体既简单又
  • 萌梦聊天室16.9.23.77更新

    App名称 萌梦聊天室 App格式 apk 安卓适用 测试机型Android 4 4 红米2 exe Windows 10 App大小 18 2MB Android 27 7MB Windows 10 更新履历 1 修正Android等移动
  • pcre c语言,pcre函数详细解析

    PCRE是一个NFA正则引擎 不然不能提供完全与Perl一致的正则语法功能 但它同时也实现了DFA 只是满足数学意义上的正则 1 pcre compile 原型 include pcre pcre compile const char pa
  • Windows 2012 DHCP超级作用域的一个坑

    今天在将Cisco交换机DHCP服务改为Windows2012服务器DHCP服务的过程中 发现一个奇怪的现象 环境 Cisco2960S交换机上划分有多个VLAN interface Vlan3 ipaddress 10 86 24 1 2
  • (2021-8-16) QT5 信号与槽

    1 概念 信号 Signal 就是在特定情况下被发射的事件 如点击按钮会发送 click 事件 槽 Slot 就是对信号响应的函数 槽就是一个函数 与一般的 C 函数是一样的 可以 定义在类的任何部分 public private 或 pr
  • C语言中的结构体(struct)

    C语言中 结构体类型属于一种构造类型 其他的构造类型还有 数组类型 联合类型 本文主要介绍关于结构体以下几部分 1 概念 为什么要有结构体 因为在实际问题中 一组数据往往有很多种不同的数据类型 例如 登记学生的信息 可能需要用到 char型
  • TCP滑动窗口和拥塞控制

    目录 滑动窗口 什么是滑动窗口 为什么要使用滑动窗口 滑动窗口的工作原理 滑动窗口会出现的几种问题 数据包丢失怎么解决 ACK丢失怎么解决 拥塞控制 拥塞控制是什么 拥塞控制的实现 理解拓展 拥塞控制是如何判断网络拥塞情况的 滑动窗口 什么