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 ...
随机推荐
- mark ubuntu 16.04 64bit + cpu only install mtcnn
大神代码链接 称之为MTCNN人脸检测算法,同时有大神已经GitHub上开源了其基于caffe的C++ API 的源代码,https://github.com/DaFuCoding/MTCNN_Caf ...
- Pr PS 笔记
1. 保存窗口配置 窗口-新建工作区 2. 添加快捷键 编辑-自定义快捷键 3. 添加关键帧,需要下拉轨道 4. 关闭PR声音 5. 视频稳定器 选中素材,右键选择嵌套,嵌套后在子序列把视频画 ...
- win10上使用php与python实现与arduino串口通信
注意: php 需要php7,安装及开启php_dio.dll com口按照实际的进行设置,如果不知道可以打开arduino编辑器进行查看 可以与用户实现命令行交互,但是效率过慢,不清楚如何优化,使用 ...
- vue.js项目开发实战笔记001——准备工作
1,Vue.js 是一套构建用户界面的渐进式框架. 2,Vue.js 是由尤雨溪开发出的,最早发布于2014年2月. 3,引用vue.js地址一CDN: <script src="ht ...
- mysql8安装
1.先卸载当前系统中已安装的mariadb rpm -qa | grep mariadb rpm -e --nodeps 文件名 2.安装mysql依赖包 yum install gcc gcc-c+ ...
- 【转】bitbake 笔记
原文 http://blog.csdn.net/xiaofeng_yan/article/details/6757725 1 当你已经编完一个系统比如sato映像,在编一个meta-toolchain ...
- MySQL单表查询实例
数据表准备 ```mysql create table emp( id int not null unique auto_increment, name varchar(20) not null, ...
- Centos网卡名称命名
1. vim /etc/sysconfig/grub 编辑/etc/sysconfig/grub文件 添加 net.ifnames=0 biosname=0 GRUB_TIMEOUT= GR ...
- GMT、UTC、UNIX时间戳、时区
GMT.UTC.CTS: UTC时间:世界协调时间(UTC)是世界上不同国家用来调节时钟和时间的主要时间标准,也就是零时区的时间.UTC是以原子时秒长为基础,在时刻上尽量接近于GMT的一种时间计量系统 ...
- for(auto count:counts)
c++中for(auto count : counts) 这是C++11中的语法,即:Range-based for loop.其中counts应满足:begin(counts), end(count ...