TCP窗口机制

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

其实TCP在整个发送过程中,也在度量当前的网络状态,目的是为了维持一个健康稳定的发送过程,比如拥塞控制。因此,数据是在某些机制的控制下进行传输的,就是窗口机制。

窗口缩放因子(Window Scaling)

以前,window size最大为2的16次方,为65535,随着宽带不断提高,65535字节已经小了,为了突破限制,便有了Window Size Scaling选项,假设window scale为7,也就是要将Window Size的值左移七位,即乘以128。window scale最大为14.

在整个双方的交互过程中,发送方和接收方Window size scaling factor乘积因子必须保持不变,但是发送方的乘积因子和接收方的乘积因子可以不同,由各自决定。

在标志位中有SYN的消息,会在选项中通知接收方,本端具体的放大因子,该消息本身不放大

上图中的放大因子扩大了256倍,8212*256=2102272

发送窗口

窗口滑动发送数据

(1)已经发送并且对端确认(Sent/ACKed)---------------发送窗外 缓冲区外

(2)已经发送但未收到确认数据(Sent/UnACKed)----- --发送窗内 缓冲区内

(3)允许发送但尚未防的数据(Unsent/Inside)-----------发送窗内 缓冲区内

(4)未发送暂不允许(Unsent/Outside)-------------------发送窗外 缓冲区内

2,3两部分为发送窗口

接受窗口

对于TCP的接收方,在某一时刻在它的接收缓存内存在3种。“已接收”,“未接收准备接收”,“未接收并未准备接收”(由于ACK直接由TCP协议栈回复,默认无应用延迟,不存在“已接收未回复ACK”)。其中“未接收准备接收”称之为接收窗口。

发送窗口与接收窗口关系

TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的“发送窗口”则要求取决于对端通告的“接收窗口”,要求相同。

滑动窗口

TCP并不是每一个报文段都会回复ACK的,可能会对两个报文段发送一个ACK,也可能会对多个报文段发送1个ACK【累计ACK】,比如说发送方有1/2/3 3个报文段,先发送了2,3 两个报文段,但是接收方期望收到1报文段,这个时候2,3报文段就只能放在缓存中等待报文1的空洞被填上,如果报文1,一直不来,报文2/3也将被丢弃,如果报文1来了,那么会发送一个ACK对这3个报文进行一次确认。

滑动窗口实现面向流的可靠性

最基本的传输可靠性来源于“确认重传”机制。

TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。

发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。

接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。

滑动窗口的流控特性

TCP的滑动窗口是动态的,我们可以想象成小学常见的一个数学题,一个水池,体积V,每小时进水量V1,出水量V2。当水池满了就不允许再注入了,如果有个液压系统控制水池大小,那么就可以控制水的注入速率和量。这样的水池就类似TCP的窗口。应用根据自身的处理能力变化,通过本端TCP接收窗口大小控制来对对对端的发送窗口流量限制。

应用程序在需要(如内存不足)时,通过API通知TCP协议栈缩小TCP的接收窗口。然后TCP协议栈在下个段发送时包含新的窗口大小通知给对端,对端按通知的窗口来改变发送窗口,以此达到减缓发送速率的目的。

滑动窗口动态调整

主要是根据接收端的接收情况,动态去调整Window Size,然后来控制发送端的数据流量

客户端不断快速发送数据,服务器接收相对较慢,看下实验的结果

a. 包175,发送ACK携带WIN = 384,告知客户端,现在只能接收384个字节

b. 包176,客户端果真只发送了384个字节,Wireshark也比较智能,也宣告TCP Window Full

c. 包177,服务器回复一个ACK,并通告窗口为0,说明接收方已经收到所有数据,并保存到缓冲区,但是这个时候应用程序并没有接收这些数据,导致缓冲区没有更多的空间,故通告窗口为0, 这也就是所谓的零窗口,零窗口期间,发送方停止发送数据

d. 客户端察觉到窗口为0,则不再发送数据给接收方

e. 包178,接收方发送一个窗口通告,告知发送方已经有接收数据的能力了,可以发送数据包了

f. 包179,收到窗口通告之后,就发送缓冲区内的数据了.

总结一点,就是接收端可以根据自己的状况通告窗口大小,从而控制发送端的接收,进行流量控制

参考:

TCP 滑动窗口(发送窗口和接收窗口)

解析TCP之滑动窗口(动画演示)

TCP-IP详解:滑动窗口(Sliding Window)

转载于:https://www.cnblogs.com/hongdada/p/11171068.html

TCP滑动窗口(发送窗口和接受窗口)相关推荐

  1. qt 子窗口与父窗口数据通信_Qt实例--主窗口和子窗口互发信号

    准备工作: 需要首先添加一个Qt设计师界面类,这里使用默认类名Form. 实例一:主窗口向子窗口发送信号 在主窗口添加一个按钮QPushButton,在子窗口添加一个标签QLabel. 主窗口添加一个 ...

  2. tcp 协议中发送窗口的大小应该是_面试必备--TCP协议中的窗口机制滑动窗口详解...

    窗口机制分类 在TCP协议当中窗口机制分为两种: 1.固定的窗口大小 2.滑动窗口 固定窗口存在的问题 我们假设这个固定窗口的大小为1,也就是每次只能发送一个数据,只有接收方对这个数据进行了确认后才能 ...

  3. TCP滑动窗口(Sliding Window)原理

    ---------------- 版权声明:本文为CSDN博主「CQ小子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csd ...

  4. 计算机网络:TCP滑动窗口的流量控制和拥塞控制

    1. 前言 最近在研究网络通信底层通信原理,所以不得不复习一波计算机网络传输控制协议.那么对于程序开发人员,了解底层网络通信原理,对于我们理解BIO.NIO网络通信十分重要.所以对于程序开发人员来说, ...

  5. TCP 滑动窗口协议

    什么是滑动窗口协议?      一图胜千言,看下面的图.简单解释下,发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口.发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大 ...

  6. TCP滑动窗口和拥塞控制机制

    滑动窗口协议 滑动窗口协议(Sliding Window Protocol)属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组 ...

  7. 计算机网络 HTTP工作机制 TCP三次握手四次挥手 TCP滑动窗口

    1.HTTP定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器.从层次的角度看,HTTP是面向事务的应用层协议.它规定了在浏览器之间的请求和响应的格式与规 ...

  8. 网络协议:TCP滑动窗口

    一 什么是窗口以及窗口作用 1.1 什么是窗口 在TCP协议里,窗口是面向字节流的,一个窗口表示一定长度的字节数据, 窗口就可以用来收发一组连续的数据.TCP连接的两端都是可以收发数据的,收发两端都维 ...

  9. TCP 滑动窗口(已经发出等待对方确认的队列)协议

    滑动窗口协议是TCP使用的一种流量控制方法,该协议允许发送方在停止并等待确认前可以连续发送多个分组.TCP是如何通过滑动窗口协议实现流量控制的?本博文将为您详细介绍该协议及其工作原理. 什么是滑动窗口 ...

最新文章

  1. Windows Server 8 Beta 初体验之三 Active Directory
  2. BZOJ 2257: [Jsoi2009]瓶子和燃料
  3. python基本语法语句-Python基本语法,python,基础
  4. R中基本命名(未完)
  5. DB2存储过程语法规则
  6. [Linux] 020 RPM 包的命名原则与其依赖性
  7. ASP.NET Web Pages 和 WebMatrix (Razor Syntax、Forms、Data、Grid、Chart、Files、Images、Video)的学习资源...
  8. 【mybatis】学习笔记之conf.xml与mapper.xml配置
  9. Linux在终端启动程序关闭终端不退出的方法
  10. ISO/IEC 27000 信息安全管理体系认证培训及所有标准资料
  11. Pr:基本图形(文本)
  12. c语言寻找完全平方数,菜鸟求助,要怎么求完全平方数?
  13. 虹科AR智能眼镜是什么?好用吗?
  14. 山东理工ACM【1239】水仙花数
  15. 聊天机器人php源码,(2)聊天机器人API
  16. 电脑硬件升级完全解决方案2
  17. Catlike Coding Unity教程系列 中文翻译 Basics篇(一)Game Objects and Scripts
  18. 河北工程大学计算机科学与技术分数线,2019年河北工程大学优势专业排名及分数线...
  19. geohash redis mysql_geohash
  20. 【图像检测】基于 AlexNet 和 SVM 实现异常螺母检测附matlab代码

热门文章

  1. js的nextSibling,属性兼容IE和FF等浏览器
  2. java学习与总结:计算机网络
  3. 人工智能、大数据、云计算、机器学习和深度学习,主要有什么关系?
  4. 用996打败员工,用“奋斗”替代生活
  5. java挖矿算法_Scrypt 不止是加密算法,也是莱特币的挖矿算法
  6. 32位数型计算机什么意思,展示32位是什么意思
  7. 计算机硬件的组装实践,毕业论文-计算机硬件组装实践.doc
  8. 017_Jedis的String数据类型
  9. 079_用户屏幕的信息
  10. php curl ob start,curl - php中开启缓冲压缩 ob_start('ob_gzhandler') 之后是在什么时候开始的压缩?...