什么是滑动窗口?

滑动窗口机制是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. 024_统计/var/log 有多少个文件,并显示这些文件名

    #!/bin/bash#使用 ls 递归显示所有,再判断是否为文件,如果是文件则计数器加 1cd /var/logsum=0for i in `ls -r *`do     if [ -f $i ]; ...

  2. ckeditor不能粘贴word的问题如何解决

    自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...

  3. 3-2新建Photoshop图像

    http://www.missyuan.com/thread-350740-1-1.html   [CTRL N][文件 新建] 按住CTRL双击Photoshop的空白区(这个好像是打开文件){快捷 ...

  4. ORM SQLAlchemy - 建立一个关系 relationship

    relationship函数是sqlalchemy对关系之间提供的一种便利的调用方式, backref参数则对关系提供反向引用的声明 1 背景 如没有relationship,我们只能像下面这样调用关 ...

  5. Linux设备驱动程序 之 软中断

    软中断保留给系统中对时间要求严格以及最重要的下半部使用:目前,只有两个子系统(网络和SCSI)直接使用软中断:此外,内核定时器和tasklet都是建立在软中断上的:在使用软中断之前,要先确定为什么不能 ...

  6. Java-基于 Instrument 的 Agent

    Agent 为 JVMTI 的客户端. 这里记录的是基于Java Instrument 的 Agent 实现,还有直接基于 JVMTI 的 Agent 实现. 在 JDK1.5 以后,我们可以使用 A ...

  7. PC通过netsh获取wifi密码

    1.查看当前系统所有保存wifi的ssid netsh wlan show profiles 2.根据指定ssid查看wifi密码,密码就是关键内容 netsh wlan show profile n ...

  8. python包中__init__.py文件的作用

    python包中__init__.py文件的作用 __init__.py文件最常用的作用是标识一个文件夹是一个 python包. __init__.py文件的另一个作用是定义模糊导入时要导入的内容. ...

  9. Swiper轮播插件使用

    前文 Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端,能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果.                 归根到此,Swi ...

  10. Idea创建SpringBoot项目整合Hibernate

    然后next 依赖包选择,Web必须 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <pro ...