1、什么是TCP 糊涂窗口综合症?

TCP 报文首部就占 20 字节了,如果每次接收方只允许发送方发送两三个字节,那就为了传输这么几个有效的字节,还得附加上 20 字节的数据,这就是很浪费资源性能的。 这就是所谓的“TCP 糊涂窗口综合症”。
所以 TCP 糊涂窗口综合症(Silly Window Syndrome, SWS)简单来说,其实就是接收方接收能力变差,窗口变小,导致发送方犯傻,其发送的数据只有一个大大的头部,真正携带的数据很少。

2、如何解决TCP 糊涂窗口综合症?

从接收方维度解决

接收方的策略很简单,目的就是防止发送方发送小数据嘛

  • 那只要窗口大小 < 某个值(内核缓冲区大小的一半,也称为 最大段长度 MSS)的时候,就直接将窗口大小设置为 0,防止发送方发送小数据(注意这里区分下内核缓冲区(buffer)和 CPU 缓存(cache)的概念 窗口的大小的本质是内核缓冲区的大小
  • •然后等到窗口大小 >= 内核缓冲区大小的一半 的时候,才打开窗口,通告发送方,告知其可以发送数据。

这样就阻止了发送方发送小报文了。

还有一种方法,称为 “延迟确认应答

我们知道接收方窗口大小的变化过程是下面这样的

  • 接收方根据缓冲区空闲的空间大小,计算出后续能够接收多少字节的报文(即接收窗口的大小)

  • 当内核接收到报文时,将其存放在缓冲区中,这样缓冲区中空闲的空间就变小了,接收窗口也就随之变小了

  • 当进程调用 read 函数后(将数据从内核缓冲区复制到用户/进程缓冲区),报文数据被读入了用户空间,内核缓冲区就被清空,这意味着主机可以接收更多的报文,接收窗口就会变大

如果接受数据的主机在接收到报文的时候(第二步)就立刻返回 ACK 应答,这时候返回的窗口可能比较小。为什么这么说呢,举个例子:

  • 假设接受方主机的内核缓冲区大小为 1M,一次性收到了 500K 的数据,如果在第二步就立刻回复应答,那么返回的窗口大小就是 500K

  • 但实际上可能第三步处理得速度很快,很快就把 500K 数据从缓冲区消费掉了

  • 所以,如果接收方稍微等一会再应答,那么这个时候返回的窗口大小就是 1M,这样,发送方能够发送的数据是不是更多了呢~ ,这就是延迟确认应答。

这表示当一个报文段到达时并不立即发送确认。接收端在确认收到的报文段之前一直等待,直到入缓存有足够的空间为止。延迟的确认防止了发送端的TCP滑动其窗口。当发送端的TCP发送完其数据后,它就停下来了。这样就防止了这种症状。迟延的确认还有另一个优点:它减少了通信量。接收端不需要确认每一个报文段。但它也有一个缺点,就是迟延的确认有可能迫使发送端重传其未被确认的报文段。可以用协议来平衡这个优点和缺点,例如定义了确认的延迟不能超过500毫秒

也确实没有必要对每一个数据段都进行确认应答,毕竟用的滑动窗口(累计应答),应答少一些也无妨。在 TCP 文件传输中,绝大多数都是每两个报文段返回一次确认应答:

从发送方维度解决

发送方的目的也很简单,就是不要犯傻去发送小报文就行了

常用的策略是 Nagle 算法

该算法是指发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送的一种处理机制。

具体来说,就是仅在下列任意一种条件下才能发送数据

  • 已发送的数据都已经收到确认应答时

  • 可以发送的数据大小 >= MSS(最大报文长度)

如果两个条件都不满足,那么发送方就是囤积数据,等待一段时间后再进行数据发送。

TCP 糊涂窗口综合症相关推荐

  1. TCP 糊涂窗口综合症(silly window syndrome)与 rate-based 流控

    昨天同事给我看了一个有趣的 case,接收端抓包: 现象就是这样,但结论也很明显: ack 渐长,win 渐缩,有数据陆续到达 rcvbuff,但 app 尚未读取. ack 不变,win 渐长,没有 ...

  2. 糊涂窗口综合症和Nagle算法

    本篇文章转载自:http://www.cnblogs.com/zhaoyl/archive/2012/09/20/2695799.html,用于记录自己对于TCP网络中糊涂窗口综合症和Nagle算法的 ...

  3. tcp欢动窗口机制_TCP协议中的窗口机制------滑动窗口详解

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

  4. 传输层协议TCP—滑动窗口(6)

    1 传输控制 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.在前面的章节中,我们介绍了 TCP 连接的相关概念 ...

  5. TCP滑动窗口,流量控制,拥塞控制详解

    引言 我们知道TCP是每发送一个数据,都要进行一次确认应答报文的.当上一个收到应答时,才会继续发送下一个.这种方式很显然效率比较低 滑动窗口 窗口大小就是无需等待应答,而可以继续发送数据的最大值 滑动 ...

  6. tcp下载窗口太小的问题_图解 TCP 重传、滑动窗口、流量控制、拥塞控制

    相信大家都知道 TCP 是一个可靠传输的协议,那如何它是如何保证可靠的呢? 为了实现可靠性传输,需要考虑很多事情,例如数据的破坏.丢包.重复以及分片顺序混乱等问题.如不能解决这些问题,也就无从谈起可靠 ...

  7. TCP三次握手、糊涂窗口、粘包问题

    这是在学习中的总结,若有错误请大家不吝指正(^.^) 关于TCP/IP的三次握手: 当服务端的状态为LISTEN,客户端的状态为CLOSED时,客户端发起连接 客户端发送有SYN字段报文,此时状态为S ...

  8. 浅谈TCP的窗口字段

    该掸掸这里的灰尘了,写一篇关于TCP的文章吧.今天的主题是TCP的滑动窗口.在开始这个话题之前,我想先提几个关于TCP协议的常见误区. 误区1:TCP协议三次握手过程中后两个包都是[ACK]包. 解释 ...

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

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

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

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

最新文章

  1. DevicePass-through及网卡的直接分配在Xen里面的实现
  2. 分布式搜索ElasticSearch单机与服务器环境搭建
  3. CompletableFuture详解~supplyAsync
  4. android中返回刷新,Android intent 传递对象以及返回刷新
  5. java jtextarea清空_文本区 JTextArea 的使用
  6. commons-fileupload 上传图片路径到mysql_上传图片到服务器并将图片路径保存到数据库...
  7. 普通人学python有意义吗-为什么那么多自学Python的后来都放弃了,总结起来就这些原因...
  8. scipy.misc.imresize
  9. java声明_Java继续声明
  10. 安装包被误删了可以用EasyRecovery恢复吗
  11. phpMyAdmin view_create.php 跨站脚本漏洞
  12. 卡巴斯基一年版 送序列号
  13. matlab代码 无标度网络 生成图,标准无标度网络matlab
  14. android图片颜色识别器,颜色识别器APP
  15. 数据结构物理存储方式
  16. 【Vue】“npm WARN ajv-keywords@3.2.0 requires a peer of ajv@^6.0.0 but none is installed.”
  17. Hdoj 2635 Dragon Balls
  18. 220413数据分析总结
  19. 前端实习生题库整理(一)
  20. vue实现简单的百度接口搜索框

热门文章

  1. 7-14 电话聊天狂人
  2. 阿里云ACP如何线上考试
  3. 西湖论剑2021杂项(misc)--YUSA的小秘密
  4. 如何使用Git上传本地项目到github?(mac版)
  5. RS编译码理论介绍与MATLAB性能仿真
  6. 新浪微博回调地址redirect_url(授权回调页)的设置格式
  7. 吃完饭后,到底是躺着、坐着、站着还是运动?看完终于不纠结了
  8. python爬虫、爬取百度图片保存到本地
  9. 用tushare数据自定义期货大宗商品指数(3)
  10. TI—CC3200【6】通过功放芯片的使能引脚消去POPO声