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 ...
随机推荐
- opencv 模板匹配, 已解决模板过大程序不工作的bug
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv ...
- linux mint 安装微信
安装nodejs 到nodejs官网下载node js压缩包,然后解压到自己设置的目录.我的解压路径是 /home/congwiny/Develop/SoftWare/node-v6.10.3-lin ...
- 深入理解hadoop数据倾斜
深入理解hadoop之数据倾斜 1.什么是数据倾斜 我们在用map /reduce程序执行时,有时候会发现reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理 ...
- 1 .net 用事物提交执行存储过程
public static void delModelReturn(string performanceId,DateTime? effectiveDate=null) { using (SqlCon ...
- Hive的日志操作
想要看hive的日志,我们查看/home/hadoop/hive/conf/hive-log4j2.properties # list of properties property.hive.log. ...
- java(堆、栈、常量池)
参考链接: https://www.cnblogs.com/wanson/articles/10819189.html
- Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误
今天因为想要用OpenCV做图像识别,小白一个,在网上找到一个教程,但是需要配置OpenCV3.3.0的环境,于是又在网上找OpenCV3.3.0+VS2013(因为我之前已经安过了VS2013),前 ...
- ARM cortex-version
cortex-M\A\R M microcontroller 微控制器 就是单片机 A application 应用及处理器 就是手机平板电脑等 R realtime 实时处理器 响应 ...
- B+(B)树和B-树
转载自 http://www.cnblogs.com/nullzx/ 1.B树 定义:B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点 ...
- Linux安装apidoc
一.安装apidoc所需环境(nodejs) 1. 查看系统是32位还是64位 uname -r 可以看出我这台linux的是64位的 2. 到node官网下载node的包并上传linux https ...