高性能网络编程7--tcp连接的内存使用
2024-09-16 20:41:41
滑动窗口的工作方式
窗口通知:
发送端维护发送窗口大小(不在包中传输),接收端在ACK中告知接收窗口大小;
发送窗口初始是发送缓冲区大小,接收窗口初始是接收缓冲区大小;缓冲区决定窗口的最大值;
发送窗口一般包括3个部分,从左到右:
- 已发送但未收到ACK的数据
- 可以立即发送的数据
- 空闲空间;
接收窗口就是接收缓冲区还剩多少空间,接收端处理能力越强,从缓冲区提取数据的速度就越快,接收窗口就越大;
发送窗口大小由接收窗口决定,发送端收到ACK后:
- 丢弃缓存中对应的数据,左沿向右移动;(收缩)
- 根据ACK告知的接收窗口看是否需要移动右沿;已发送未 ACK 的数据 + 可立即发送数据 + 空闲 = 接收窗口;(扩张)
作用:
- 提高效率,可以同时发送多个数据;
- 流量控制,适配不同处理能力的发送端和接收端
最优窗口大小(即发送/接收缓冲区大小)的计算:
- 尽量将两端之间的信道填满;
- 填满时,在信道上传输的数据 = 带宽(数据传输速度) * RTT,两个缓冲区应至少为这个大小
问题1:零窗口
接收端接收缓冲区满时,ACK中接收窗口为0,阻止发送端发送数据。发送方需要在接收方缓冲区空出来时得到通知,因此在发现零窗口后会进行窗口探测,即定时发送含有1字节内容的segment,通过其ACK查询接收方的接收窗口。
问题2:糊涂窗口综合症 (silly window syndrome)
现象:大量的小segment被传输(payload太小),造成网络利用率低下
发送端和接收端都有可能引起这种情况:
- 发送端每次只发送少量数据;
- 接收端的处理能力不够或应用层没有即时从接收缓冲区中取数据,接收窗口一直很小,发送端只能发小segment。
解决:
* 发送端: nagle算法 *
- 只针对
小segment
的stop-wait
协议,大segment不受影响; - 在前一个 小segment(小于MSS)的ack未到来前,缓存并合并其他要发送的小segment;
- 如果ack回来的很快,合并不了多少数据;
- ack通常是delayed,会导致数据发送的延时;不适合实时性的应用(可以取消);
- 目的是减少segment数目。
* 接收端: *
在接收端,当接收窗口小于一定阈值(如MSS一半)时,无论是数据确认ACK,还是对窗口探测的回应ACK,都宣告接收窗口为0,阻止发送端发送小报文段。
参考:
最新文章
- 51Nod--1010 只包含235的数
- Java for LeetCode 237 Delete Node in a Linked List
- 【转】Struts1.x系列教程(2):简单的数据验证
- linux操作技巧
- hdu1157 快排
- 黄聪:wordpress/wp-admin目录文件
- WP-PostViews Plus停止计数
- SqlTransaction的解析
- icon-font自己探索得到的经验
- Rabbitmq集群安装配置
- ThinkPHP模板IF标签用法详解
- 错误代码: 1582 Incorrect parameter count in the call to native function 'str_to_date'
- string format的各类格式及用法
- 咸鱼入门到放弃10--javaweb的两种开发模式
- [PHP] pow指数运算函数与二进制
- Turtle库学习笔记
- VS.C#如何向数据数据库中存入和读取图片的
- C#线程、前后台线程
- Java使用UDP发送数据到InfluxDB
- BZOJ 1853: [Scoi2010]幸运数字(容斥原理)
热门文章
- r 随机数
- Secure backup
- python中,numeric(数字类型)和integer(整型)的区别
- [Algorithm] Polynomial and FFT
- asp.net mvc 3.0 知识点整理 ----- (3).HtmlHelper(Html 辅助方法)介绍
- CentOS 6.7 下 Squid 代理服务器 的 安装与配置
- Puppet主机、模块、类、资源、变量、参数、标签命名规范
- Puppet报错汇总
- Linux内核 设备树操作常用API
- vue 本地开发时使用localhost与ip访问