什么是滑动窗口?

滑动窗口机制是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. IO 的底层实现问题

    最近在看 JAVA NIO 的相关知识,了解一下IO的底层实现原理. IO涉及到的底层的概念大致如下: 1) 缓冲区操作.2) 内核空间与用户空间.3) 虚拟内存.4) 分页技术. 一,虚拟存储器 虚 ...

  2. 028_切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)

    mkdir /data/scriptsvim /data/scripts/nginx_log.sh #!/bin/bashlogs_path="/usr/local/nginx/logs/& ...

  3. 安裝開源BBS軟件YAF時碰到的問題

    1.下載 http://yetanotherforum.net/download.aspx 安裝說明 http://www.drreddys.com/quest/readme.htm 其實只要打開根目 ...

  4. [Luogu] 软件包管理器

    https://www.luogu.org/problemnew/show/P2146 几乎是一个裸题 #include<cstdio> #include<cstring> # ...

  5. 【线性代数】5-3:克莱姆法则,逆和体积(Cramer's Rule,Inverses,and Volumes)

    title: [线性代数]5-3:克莱姆法则,逆和体积(Cramer's Rule,Inverses,and Volumes) categories: Mathematic Linear Algebr ...

  6. 又见回文 (SDUT 2560)

    Problem Description "回文串"是一个正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.现在呢, ...

  7. web软件测试基础系统测试简化理论

    系统测试点主要如下 1.系统测试基础-2.测试对象与测试级别-3.系统测试类型-4.系统测试方法-5.系统测试之软件测试质量. 1.系统测试:是尽可能彻底地检查出程序中的错误,提高软件系统的可靠性. ...

  8. 【Linux】ssh命令行下多任务前后台切换

    原文:https://my.oschina.net/huxuanhui/blog/13844 我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让 ...

  9. 解决阿里云轻量级服务器mysql无法用数据库操作软件连接

    第一步:去阿里云购买一台轻量应用服务器Lamp然后登录到控制台点击应用详情 点击后你可以看到一些服务器的数据 首先是访问服务器的首页地址,默认会放一个html文件在网站根目录下(即/home/www/ ...

  10. 如何从社区的patchwork下载补丁并应用到当前内核源码?

    1. 下载 wget http://patchwork.ozlabs.org/series/111111/mbox 2. 打补丁 git am mbox