什么是滑动窗口?

滑动窗口机制是TCP协议的一种流量控制和防拥塞的机制。

滑动窗口的工作原理?

简单来讲,就是接收方和发送方分别保留一块缓冲区,作为接收和发送数据来使用,发送数据过程中,如果发送方发的快了,处理方处理不过来,缓冲区放不下了,接收方就会通过消息交互告诉发送方,慢点发,等接收方处理完,可接收了,又会通知发送方可以继续发送了,通过这种方式来防止由于双方能力不一致导致的拥塞和丢包。

工作原理举例,以发送方为例

老规矩,先上图,直观看一下

滑动窗口组成

可以看到,滑动窗口被分成了四部分,分别代表滑动窗口工作过程中数据的4种分类或者叫状态。从左到右依次为:

第一部分:已经被对方成功接收的数据;

第二部分:已经发送还没有收到ack的数据;

第三部分:可以发送但是尚未发送的数据;

第四部分:暂时不能发送的数据。

蓝色框里包含了第二和第三两部分数据,这部分实际上是正在被发送的数据,所以蓝框部分也被称为发送窗口;

下面我们以图示的第二部分数据为例,来说明一下滑窗的几种工作情形。为便于描述确认过程和滑窗移动,我们将第二部数据分成三小段,分别是32-39 40-45 46-51.

正常发送和接收

数据32-39已经被成功发送了,并且接收方也收到了对应的数据,这时候接收方会给发送方回复ack确认ack 40,告诉发送端数据已经收到,同时会携带剩余接收窗口的大小,比如是10个字节。此时发送窗口就会向右移动8个字节,将32-39放入第一部分数据,同时将52-59放入第三部分,准备发送;这就完成了一次数据的正常发送和确认过程。

流量控制,防止拥塞

之后发送端开始发送数据,我们看第三部分数据,46-59,共14个字节,但是上一步中接收方通告的报文中告诉发送方,当前接收窗口只剩10个字节,所以发送方本次最多只会发送10个字节,接收到这10个字节之后,接收端可能就会向发送端回复一个窗口为0的报文,告诉发送端先不要发送了,没有地方放了。通过这种方式来实现流量控制,防止接收端拥塞丢包。

那你可能会问,为啥接收端的窗口会变小或者为0呢?这是因为,tcp接收到数据之后,会存放到缓冲区,等待应用来读取,如果应用读取慢了,数据就可能在缓冲区存放一段时间,所以可能会出现占满缓冲区的情况,等把数据读走了,接收端会通知发送端窗口可用并告知大小,发送端就又可以开始发送数据了,周而复始。

报文丢失,超时重传

继续看,我们共发送了三部分数据:32-39 40-45 46-51。32-39已经被ack确认过了,但是后边的两组还没有确认,假如在传输过程中40-45丢失了, 接收方只收到了46-51,那会怎么处理呢?接收端接收到46-51之后,首先会将数据保存起来,等待40-45,但是由于这部分数据丢失,接收方一直不可能收到,所以也不能回复ack给发送方。发送方得不到ack,无法判断数据是否被正确收到,滑窗就不能向右移动,无法继续发送数据,如何解决这个问题呢?对了,答案就是定时器。发送方在发送数据之后会启动一个重传定时器,定时器超时之前如果收到ack,就把定时器停掉就可以了。定时器超时还没有收到ack,那么发送方就认为数据传送丢失,开始重新发送没有被ack确认过的数据,这就是超时重传机制。

这里注意一点:虽然46-51没有丢失,但是发送方无法判断具体是哪些数据丢失了,所以会把所有发出没有被确认的数据统一重传一遍。

[TCP/IP] 滑动窗口的更多相关文章

  1. TCP/IP滑动窗口

    T C P使用一种窗口(w i n d o w)机制来控制数据流.当一个连接建立时,连接的每一端分配一个缓冲区来保存输入的数据,并将缓冲区的尺寸发送给另一端.当数据到达时,接收方发送确认,其中包含了自 ...

  2. 面试连环炮系列(二十):TCP的滑动窗口协议是什么

    TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以 ...

  3. 计算机网络(八),TCP的滑动窗口

    目录 1.RTT和RTO 2.TCP使用滑动窗口做流量控制与乱序重排 3.滑动窗口的基本原理 八.TCP的滑动窗口 TCP头部中的窗口字段:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端 ...

  4. TCP的滑动窗口机制【转】

    原文链接:http://www.cnblogs.com/luoquan/p/4886345.html      TCP这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议.既然是一个可靠的 ...

  5. 一篇带你读懂TCP之“滑动窗口”协议

    前言 你现在的努力,是为了以后有更多的选择. 在上一篇文章通过"表白"方式,让我们快速了解网络七层协议了解了网络七层协议. 接下来我们要把重心放在网络传输的可靠性上面.一起来看TC ...

  6. TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗

    tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击. 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的. 限流可以控制本软件或者应用的流量大小 ...

  7. TCP的滑动窗口与拥塞窗口

    一.滑动窗口 滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的.   对ACK的再认识,ack ...

  8. TCP的滑动窗口

    TCP发送方的窗口可以划分成四个部分: 1.已经发送并且确认的TCP段: 2.已经发送但是没有确认的TCP段: 3.未发送但是接收方准备接收的TCP段, 4.未发送并且接收方也为准备接受的TCP段. ...

  9. TCP协议滑动窗口(一)——控制数据传输速率

    窗口大小:TCP头中一个16位的域,表示当前可用接受缓冲区大小.在每个TCP对等段连接初始化时,告诉对方自己的窗口大小(不一定是满额,假如满额65201字节,可能暂时通告5840字节).若客户端接受数 ...

随机推荐

  1. 001_linuxC++之_类的引入

    (一) C++类的引入,图片的程序比较好看,文中程序不贴出来 (二) 知识点 1. 成员函数的存取权限:公有的(public),保护的(protectd),私有的(private) 2. 第27行th ...

  2. React事件处理和原生JS事件处理

    1.原生JS 事件触发调用有三种方式: 1. on[event]事件属性,手动触发  ❗️on[event]事件是Window对象上的方法. 2. on[event]事件属性,通过htmlElemen ...

  3. Mongodb账户管理

    Mongodb账户管理   介绍 Mongodb是一个schema free的非sql类分布式数据库,可以利用它做很多很灵活的存储和操作,最近了解了下它的账户机制,通过设置auth启动方式可以对所有登 ...

  4. 重新梳理一下adb操作app(golang版)

    主要参考我之前整理的内容https://www.cnblogs.com/pu369/p/10490668.html,梳理简化一下思路,以便于用最简单的代码来应对无聊人士的要求. 需求主要是:打开手机. ...

  5. [Luogu] 家族

    https://www.luogu.org/problemnew/show/1767 字符串的读入有点麻烦 #include <cstdio> #include <cstring&g ...

  6. 洛谷 P2251 质量检测(st表)

    P2251 质量检测 题目提供者ws_ly 标签 难度 普及/提高- 题目描述 为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的 ...

  7. PCIe - 那点点事

    各位看官,这是我拷贝过来的,作为学习笔记(本人对图比较感兴趣,你说我懒也行,上图,这个看着舒服易懂): 1. Wire, lane, link 啥关系 注: PCIe 每条lane有1个双向通道(一个 ...

  8. MySQL数据分析-(9)库操作补充:用户管理和权限管理

    大家好,我是jacky,很高兴继续跟大家学习MySQL数据分析实战,本节课的主题是用户管理和权限管理: 在分享之前,jacky在不厌其烦的强调一下:学习任何一门学科和技能,最重要的是捋清逻辑,我们要知 ...

  9. PHP 之验证码类封装

    一.效果图 二.类代码 <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/8/13 * Time: 10:51 */ clas ...

  10. puppeteer学习笔记合集

    官方英文版API入口(如果你英文好的话):https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md. 汉化版API入口(网上有 ...