[TCP/IP] 滑动窗口
什么是滑动窗口?
滑动窗口机制是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] 滑动窗口的更多相关文章
- TCP/IP滑动窗口
T C P使用一种窗口(w i n d o w)机制来控制数据流.当一个连接建立时,连接的每一端分配一个缓冲区来保存输入的数据,并将缓冲区的尺寸发送给另一端.当数据到达时,接收方发送确认,其中包含了自 ...
- 面试连环炮系列(二十):TCP的滑动窗口协议是什么
TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以 ...
- 计算机网络(八),TCP的滑动窗口
目录 1.RTT和RTO 2.TCP使用滑动窗口做流量控制与乱序重排 3.滑动窗口的基本原理 八.TCP的滑动窗口 TCP头部中的窗口字段:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端 ...
- TCP的滑动窗口机制【转】
原文链接:http://www.cnblogs.com/luoquan/p/4886345.html TCP这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议.既然是一个可靠的 ...
- 一篇带你读懂TCP之“滑动窗口”协议
前言 你现在的努力,是为了以后有更多的选择. 在上一篇文章通过"表白"方式,让我们快速了解网络七层协议了解了网络七层协议. 接下来我们要把重心放在网络传输的可靠性上面.一起来看TC ...
- TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗
tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击. 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的. 限流可以控制本软件或者应用的流量大小 ...
- TCP的滑动窗口与拥塞窗口
一.滑动窗口 滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的. 对ACK的再认识,ack ...
- TCP的滑动窗口
TCP发送方的窗口可以划分成四个部分: 1.已经发送并且确认的TCP段: 2.已经发送但是没有确认的TCP段: 3.未发送但是接收方准备接收的TCP段, 4.未发送并且接收方也为准备接受的TCP段. ...
- TCP协议滑动窗口(一)——控制数据传输速率
窗口大小:TCP头中一个16位的域,表示当前可用接受缓冲区大小.在每个TCP对等段连接初始化时,告诉对方自己的窗口大小(不一定是满额,假如满额65201字节,可能暂时通告5840字节).若客户端接受数 ...
随机推荐
- 牛客练习赛53 (E 老瞎眼 pk 小鲜肉) 线段树+离线
考试的时候切的,类似HH的项链~ code: #include <bits/stdc++.h> #define ll long long #define M 500003 #define ...
- 网络流24题 P2766 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- Luogu5339 [TJOI2019]唱、跳、rap和篮球 【生成函数,NTT】
当时看到这道题的时候我的脑子可能是这样的: My left brain has nothing right, and my right brain has nothing left. 总之,看到&qu ...
- bash基础之三配置文件
一.shell的两种登录方式: 1.交互式登录:(1)直接通过终端输入账号密码登录(2)使用“su - UserName” 或“su -l Username”切换的用户执行顺序:/etc/profil ...
- JavaScript Call函数原理
call原理分析,一定要看最后的例子. 1.call使用例子 function add(c, d) { return this.a + this.b + c + d; } , b: }; consol ...
- django中安装pillow ValueError: zlib is required unless explicitly disabled using --disable-zlib, aborting
在windows系统上,使用 pip install pillow安装pillow时 报错 在使用 easy_install Pillow 方式安装成功,默认是最高版本 如果需要在安装时,指定安装版 ...
- 访问项目时报错org.apache.jasper.JasperException: java.lang.NullPointerException
错误信息:org.apache.jasper.JasperException: java.lang.NullPointerException 原因:项目依赖的jar包和tomcat容器的依赖jar包有 ...
- suduku
github地址 PSP: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 30 Estimate 估 ...
- git仓库与项目源码分离
在服务器上初始化git仓库 cd mkdir gitrepo cd gitrepo git init --bare runoob.git 本地 若是已经有git项目了,直接添加一个仓库地址就行了 gi ...
- Flink简介
Flink简介 Flink的核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布,数据通信以及容错机制等功能.基于流执行引擎,Flink提供了诸多更高抽象层的API以方便用户编写分布 ...