滑动窗口的发送窗口示意图如下,其中由对端通告的窗口窗口大小为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的更多相关文章

  1. LeetCode编程训练 - 滑动窗口(Sliding Window)

    滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...

  2. 算法与数据结构基础 - 滑动窗口(Sliding Window)

    滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...

  3. [POJ2823][洛谷P1886]滑动窗口 Sliding Window

    题目大意:有一列数,和一个窗口,一次能框连续的s个数,初始时窗口在左端,不断往右移动,移到最右端为止,求每次被框住的s个数中的最小数和最大数. 解题思路:这道题是一道区间查询问题,可以用线段树做.每个 ...

  4. TCP 滑动窗口和 拥塞窗口

    转http://coolshell.cn/articles/11609.html 滑动窗口 -- 表征发送端和接收端的接收能力 拥塞窗口-- 表征中间设备的传输能力 TCP滑动窗口 需要说明一下,如果 ...

  5. [转]TCP滑动窗口详解

    TCP滑动窗口详解  http://lyjdamzwf.blog.163.com/blog/static/75206837201193373226/ TCP滑动窗口(Sliding Window)   ...

  6. TCP滑动窗口(发送窗口和接受窗口)

    TCP窗口机制 TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口.用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的. 其实TCP在整个发送过程中, ...

  7. TCP 滑动窗口的简介

    TCP 滑动窗口的简介 POSTED BY ADMIN ON AUG 1, 2012 IN FLOWS34ARTICLES | 0 COMMENTS TCP的滑动窗口主要有两个作用,一是提供TCP的可 ...

  8. 传输层-Transport Layer(下):UDP与TCP报头解析、TCP滑动窗口、TCP拥塞控制详解

    第六章 传输层-Transport Layer(下) 上一篇文章对传输层的寻址方式.功能.以及流量控制方法做了简短的介绍,这一部分将介绍传输层最重要的两个实例:TCP协议和UDP协议,看一看之前描述的 ...

  9. TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

    一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...

随机推荐

  1. webpack中使用html-webpack-plugin生成HTML文件并主动插入css和js引入标签

    html-webpack-plugin clean-webpack-plugin 一.html-webpack-plugin 由于打包时生成的css样式文件和js脚本文件会采用hash值作为文件命名的 ...

  2. 巧用Map缓存提升"翻译"速度

    在业务编码中,很多情况都需要用到code2Name或者id2Name之间的"翻译",在我的过往经历中发现不少开发人员都是直接双重循环实现这种"翻译".如果一次& ...

  3. SQLplus命令中删除键和翻页键不能用的问题

    问题现象: 在进入连接数据库后,如何写错命令,删除键不好使,总是出现^H^H [oracle@master2 ~]$ sqlplus / as sysdba SQL*Plus: Release 12. ...

  4. 线程----code

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. Linux下安装opencv with-ffmpeg解决无法读取视频的问题

    1. 编译安装ffmpeg 下载源码,执行 ./configure --disable-yasm --enbale-shared --prefix=/usr/local/ffmpeg 即可. 2. 下 ...

  6. Delphi MSComm控件事件的介绍

  7. linux 启动tomcat

    操作步骤: 第一步:进入tomcat的bin目录 cd /usr/local/tomcat/bin 第二步:使用tomcat关闭命令 ./shutdown.sh 第三步:查看tomcat是否关闭 ps ...

  8. 论文笔记:Learning Region Features for Object Detection

    中心思想 继Relation Network实现可学习的nms之后,MSRA的大佬们觉得目标检测器依然不够fully learnable,这篇文章类似之前的Deformable ROI Pooling ...

  9. JMeter 控件整理

    一个线程组里多个请求的情况下,添加用户参数.如添加random函数,若不勾选“每次迭代更新一次”则每发送一个请求调用一次random函数,勾选上之后,整个线程组运行过程只调用一次random函数.

  10. less 分页显示文件内容

    1.命令功能 less 是more的增强版,可以分页显示文件内容,而且less打开文件的速度要比vi,more更快.less支持搜索功能,显示行号. 2.语法格式 less  option  file ...