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 ...
随机推荐
- 创建json对象
jQuery创建json对象 方法二: <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- 1 .net中自定义事件的步骤
1 申明一个自定义的类并且继承事件的基类 public class ClientSocketModelConnectedEvent:EventArgs { private string param; ...
- php扩展库解释
扩展库 说明 注解 php_bz2.dll bzip2 压缩函数库 无 php_calendar.dll 历法转换函数库 自 PHP 4.0.3 起内置 php_cpdf.dll ClibPDF 函数 ...
- 正确理解这四个重要且容易混乱的知识点:异步,同步,阻塞,非阻塞,5种IO模型
本文讨论的背景是Linux环境下的network IO,同步IO和异步IO,阻塞IO和非阻塞IO分别是什么 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进 ...
- linux重装docker-compose后无法执行docker-compose命令
背景 使用自动化脚本重装docker和docker-compose(但脚本中未对旧版本的docker-compose进行任何处理,比如卸载删除) 导致执行docker-compose命令时报了错,大多 ...
- 【Day1】3.数据类型
视频地址(全部) https://edu.csdn.net/course/detail/26057 课件地址(全部) https://download.csdn.net/download/gentl ...
- 怎么提高U盘传输文件的性能?
U盘使用时间久了,其传输复制文件速度就可能会变得有些慢.出现这个问题的原因有很多,除了U盘本身的问题外,也可能会有电脑设置方面的因素在影响.好系统下面就来告诉大家解决U盘传输复制文件速度慢的几个小技巧 ...
- Oracle笔记(二) SQLPlus命令
对于Oracle数据库操作主要使用的是命令行方式,而所有的命令都使用sqlplus完成,对于sqlplus有两种形式. 一种是dos风格的sqlplus:sqlplus.exe; 另一种是window ...
- 批量删除Zen Cart 无图片商品
<?php /** * * @ 批量删除Zen Cart 无图片商品 * @ 使用方法: 将本文件上传到网站根目录下运行 http://你的域名/zcdelpro.php * @ $status ...
- Python:类
概述:类的特点 作用域和命名空间. 类的详解:(python官方教程摘录) 概述特性 Python在oop方面思想和Ruby一样.同样包括数据封装,继承和多态三大特点. 类 Python的类提供了面向 ...