TCP滑动窗口Sliding Window
滑动窗口的发送窗口示意图如下,其中由对端通告的窗口窗口大小为6,窗口中和窗口外的数据分别表示为:1-3发送并已经被确认的数据段,4-6发送但尚未被确认的数据段,7-9能够发送尚未发送的数据段,10-…位于窗口外不能够被发送的数据;

窗口边沿的移动示意图如下,当接收方确认数据后,这个滑动窗口不时的向右移动。窗口的两个边沿的相对运动增加或者减少了窗口的大小。我们使用三个术语来描述左右边沿的运动:
(1) 称窗口的左边沿向右边沿靠近称为窗口合拢。这种现象发生在数据被发送和确认时;
(2) 当窗口的右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时。
(3) 当右边沿向左移动时,我们称之为窗口收缩。RFC强烈不建议使用这种方式;

如果左边沿到达右边沿,则称其为一个零窗口,此时发送方不能发送任何数据;
实例:数据交互和滑动窗口对应变化;


关于发送窗口和接收窗口在两台设备之间的交互如下图(图片来自tcpipguide),其中服务器的数据读取速度<客户端的发送速度,因此有零窗口产生;

(0) 开始时客户端与服务器的窗口大小都为WND=360;的SND.UNA与SND.NXT均指向窗口的左边沿,服务的RCV.NXT指向接收窗口的左边沿;
(1) 客户端发送140字节数据,其SND.NXT指向下一个发送位置,在SND.UNA与SND.NXT之间的数据为已发送尚未得到服务器确认的140字节;
(2) 服务器收到140字节数据,RCV.NXT下一个接收位置,窗口左侧边沿收缩140字节,数据被读取40字节,窗口右侧边沿张开40字节,实际窗口减少了100字节,于是在在回复ACK中包含窗口大小window=260字节;
(3) 客户端收到服务器的ack,SND.UNA指向未确认位置,即窗口左侧边沿收缩140字节,此时窗口大小为服务器通告的260字节,SND.WND=260;
(4) 客户端发送180字节,SND.NXT指向下一个未发送位置,在SND.UNA与SND.NXT之间的数据为已发送尚未得到服务器确认的180字节;
(5) 服务器收到180字节数据,RCV.NXT下一个接收位置,窗口左侧边沿收缩180字节,窗口减少了180字节,于是在在回复ACK中包含窗口大小window=80字节;
(6) 客户端收到服务器的ack,SND.UNA指向未确认位置,即窗口左侧边沿收缩180字节,此时窗口大小为服务器通告的80字节,SND.WND=80;
(7) 客户端发送80字节,SND.NXT指向下一个未发送位置,在SND.UNA与SND.NXT之间的数据为已发送尚未得到服务器确认的80字节;
(8) 服务器收到80字节数据,RCV.NXT下一个接收位置,窗口左侧边沿收缩80字节,窗口减少了80字节,于是在在回复ACK中包含窗口大小window=0字节;此时接收端产生了0窗口通告;
(9) 客户端收到服务器的ack,SND.UNA指向未确认位置,即窗口左侧边沿收缩80字节,此时窗口大小为服务器通告的0字节,SND.WND=0;窗口为0不再继续发送数据,客户端启动定时器探测0窗口是否恢复;
TCP滑动窗口Sliding Window的更多相关文章
- LeetCode编程训练 - 滑动窗口(Sliding Window)
滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...
- 算法与数据结构基础 - 滑动窗口(Sliding Window)
滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...
- [POJ2823][洛谷P1886]滑动窗口 Sliding Window
题目大意:有一列数,和一个窗口,一次能框连续的s个数,初始时窗口在左端,不断往右移动,移到最右端为止,求每次被框住的s个数中的最小数和最大数. 解题思路:这道题是一道区间查询问题,可以用线段树做.每个 ...
- TCP 滑动窗口和 拥塞窗口
转http://coolshell.cn/articles/11609.html 滑动窗口 -- 表征发送端和接收端的接收能力 拥塞窗口-- 表征中间设备的传输能力 TCP滑动窗口 需要说明一下,如果 ...
- [转]TCP滑动窗口详解
TCP滑动窗口详解 http://lyjdamzwf.blog.163.com/blog/static/75206837201193373226/ TCP滑动窗口(Sliding Window) ...
- TCP滑动窗口(发送窗口和接受窗口)
TCP窗口机制 TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口.用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的. 其实TCP在整个发送过程中, ...
- TCP 滑动窗口的简介
TCP 滑动窗口的简介 POSTED BY ADMIN ON AUG 1, 2012 IN FLOWS34ARTICLES | 0 COMMENTS TCP的滑动窗口主要有两个作用,一是提供TCP的可 ...
- 传输层-Transport Layer(下):UDP与TCP报头解析、TCP滑动窗口、TCP拥塞控制详解
第六章 传输层-Transport Layer(下) 上一篇文章对传输层的寻址方式.功能.以及流量控制方法做了简短的介绍,这一部分将介绍传输层最重要的两个实例:TCP协议和UDP协议,看一看之前描述的 ...
- TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释
一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...
随机推荐
- PHP扩展之 Imagick安装
最近的PHP项目中,需要用到切图和缩图的效果,在本地windows开发环境,安装过程遇到好多问题,在此与大家分享. php官网里,一大群老外也看不懂这玩意怎么装,主要原因在于,php版本庞杂,还有x8 ...
- 什么是IOC和什么是AOP,依赖注入(DI)和Ninject,Ninject
我们所需要的是,在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种“需要”,就称为DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,I ...
- linux获取保留yum源、并获取安装位置
linux使用yum安装之后保留yum源 linux在使用yum安装之后默认会删除rpm包,那么如何保留呢? vim /etc/yum.conf 将这里的0改成1即可 linux安装的yum源在什么地 ...
- deep_learning_Softmax()
该节课中提到了一种叫作softmax的函数,因为之前对这个概念不了解,所以本篇就这个函数进行整理,如下: 维基给出的解释:softmax函数,也称指数归一化函数,它是一种logistic函数的归一化形 ...
- pytest的使用
一.python安装 1.windows(server): 双击python-3.6.7-amd64.exe执行安装流程,使用默认安装方式即可. 安装完成后查看是否安装成功: C:\Users\Adm ...
- python面向编程;类的绑定与非绑定方法、反射、内置方法
一.类的绑定与非绑定方法 ''' 类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何 ...
- manjaro开机出现grub 解决办法
# 第一步:输入ls出现(hd0,msods1),(hd0,msdos5),(hd0,msods7)# 不同的电脑不一样,这是我电脑中的磁盘分区,和系统中的表示方法不一样,# linux中一般是/de ...
- QTP(4)
一.常见回放错误 1.The "XXX" XXX object was not found in the Object Repository.(在对象库中未找到对象) ...... ...
- hive单机部署
hadoop,hbase,zookeeper安装好了,现在来安装hive hadoop 版本:2.8.4 hbase 版本:2.1.3 hive 版本:2.3.4 zookeeper 版本:3.4.1 ...
- 使用jmeter发送put请求的三种方式
之前在前公司使用jmeter调试接口时,由于都是get和post请求,所以一直是顺风顺水的,毫无阻拦在短时间内调试完所有接口. 但是呢,在换到新公司后,发现接口请求是多式多样的,get.post必须有 ...