《TCP/IP详解 卷一》第15章 TCP数据流与窗口管理

目录

15.1 引言

15.2 交互式通信

15.3 延时确认

15.4 Nagle 算法

15.4.1 延时ACK与Nagle算法结合

15.4.2 禁用Nagle算法

15.5 流量控制与窗口管理

15.5.1 滑动窗口

15.5.2 零窗口与TCP持续计时器

15.5.3 糊涂窗口综合征

15.5.4 大容量缓存与自动调优

15.6 紧急机制

15.7与窗口管理相关的攻击

15.8总结


15.1 引言

两类TCP传输:

        交互式传输:

                单个报文小,如ssh,网络游戏中账号信息,鼠标操作等信息。

        批量传输:

                即大量数据传输。如文件共享下载,web访问。

                需流量控制,防止接收端溢出。

15.2 交互式通信

网络中大部分是大批量传输,少部分是交互式传输。

ssh是典型交互式数据。

        特点:小包。

ssh每个输入一个字符会生成4个TCP数据段:

        1. 客户端指令输入

        2. 服务器ACK

        3. 服务器执行结果

        4. 客户端ACK

其中2,3可合并一起发送,即ACK报文携带回显数据,这叫延迟ACK。

TCP段PSH标志含义:

        表示发送端没有其他数据需要传输。而接收端收到数据后应立即传递给应用层。

因为SSH客户端产生的都是短小信息,通常SSH TCP报文都带PSH标志。

15.3 延时确认

延迟ACK:

        TCP不会对收到的每个数据都回复一个ACK,而是通过累积ACK后将延迟的ACK和后续需要传的数据结合发送。

        常用于批量数据传输中。

好处:减少ACK数目,减轻网络负载。

而快速ACK,即每个报文都会回复一个ACK。

15.4 Nagle 算法

SSH客户端一个单击动作会产生四个TCP报文,其中包含TCP头,IP头等开销,代价很高,会加重广域网阻塞。

        解决方法:Nagle算法

Nagle翻译:突然

Nagle原理:

        若发送端没有收到所有数据的ACK时,不发送小报文。直到所有在传数据收到ACK,在这个等待期间会整合多个小数据,通过一个更大报文发送。

        所以ACK返回越快,数据发送越快。

优点:在高延迟网络中可整合小数据,减少小包数目。

缺点:增加了时延。

Nagle算法适用场景:

        频繁传输小数据块,并延迟不敏感。

15.4.1 延时ACK与Nagle算法结合

延时ACK:延迟发送ACK,用于减少ACK包的数量,降低网络开销。

Nagle算法:等待收到所有已发送数据的ACK后,期间合并小包成大包再发送数据。

所以可知,两者结合使用导致短暂死锁。

所以如果SSH服务器开启了延迟ACK功能,客户端最好禁用Nagle。

15.4.2 禁用Nagle算法

Nagle算法增加了时延,对实时应用不适合。

        如SSH,实时网络游戏。

内核协议栈禁用Nagle:

        net.ipv4.tcp_no_delay = 1

应用程序禁用:

        设置socket TCP_NODELAY选项

        setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(int))

15.5 流量控制与窗口管理

每个TCP报文段包含:序列号,ACK号,窗口大小。

        ACK号:下一次期待收到的报文序列号,说明之前的数据已全部接收。

        窗口大小:向对方指示,自己的接收缓冲区还剩多少空间。

15.5.1 滑动窗口

每对TCP连接的两端都维护一个发送窗口和接收窗口。

        其中发送窗口大小由对端的接收窗口通告。

在没收到数据的ACK情况下,最多可发送的数据量就是发送窗口大小。

滑动窗口作用:

        优化网络利用率:

                滑动窗口允许发送方连续发送多个数据段而不必等待每个数据段ACK。提高网络利用率。

        避免拥塞:

                发送方根据接收方通告的窗口大小来控制发送量,避免发送过快而引起拥塞。

发送窗口:

一旦收到已发送数据的ACK后,就移动窗口,可继续发送更多数据。

接收窗口:

把接收窗口值给通告给发送方。

        收到数据的序列号小于左边界RCV.NXT,就是重复报文,丢弃数据。

        收到数据的序列号大于右左边界RCV.NXT+RCV.WND,超出处理范围,丢弃数据。

15.5.2 零窗口与TCP持续计时器

TCP通过接收端的窗口通告实现流量控制。指示接收端缓冲区可接收数量。

通告的接收窗口为0时,可阻止对方发送。

接收端缓冲区重新有可用空间时,可传输一个窗口更新给发送端。该窗口更新是一个纯ACK,不包含数据。

问题:

        如果接收端的窗口更新报文丢失,而发送方需要等到窗口更新报文才可继续发送。造成死锁。

解决方法:

        周期向接收端查询窗口值,即发送窗口探测,接收端回复一个ACK报文,其中包含窗口大小。

TCP报文是纯ACK,则不会重传ACK。

TCP报文不是纯ACK,会重传ACK和数据。

15.5.3 糊涂窗口综合征

糊涂窗口综合征SWS

出现原因有:

        接收端没等到窗口变大就通告,导致通告的窗口小。

        发送端没等到将小数据合成更大报文就方法,导致发送数据小。

坏处:

        传输的TCP数据很小。传输效率低。

解决方法:

        接收端不通告小窗口值。

        发送端不发送小报文段,由Nagle控制如何发送。

15.5.4 大容量缓存与自动调优

不必提前设置一个过大发送/接收缓存。而是根据待传数据大小,不断估算缓存大小,不断通告窗口大小。

        即窗口自动调优。

如何设置窗口的自动调优范围:

        接收窗口:

                net.ipv4.tcp_rmem= 4096 87380 174760

        发送窗口:

        net.ipv4.tcp_wmem= 4096 87380 174760

上述三个值分别是最小值,默认值,最大值。

最小值:

        应用程序设置发送缓冲区小于最小值时,内核自动扩大到最小值,如4096。

默认值:

        应用程序未指定发送缓冲区大小时,内核会使用这个默认值。

最大值:

        应用程序不能设置发送缓冲区的大小超过最大值。

自动调优:

        当接收端根据接收缓存区剩余大小,动态发送窗口更新报文给发送端,控制发送端发送速率。

若TCP的接收缓存区太小,会严重限制TCP吞吐量。

小结:接收窗口和发送窗口值会根据网络环境和系统配置而动态调整,通常范围为几KB到几MB。

15.6 紧急机制

TCP URG标志:

        指示该TCP报文包含紧急数据。

MSG_OOB标志可发送接收带外数据。

        带外数据:使用带外(额外)通道来传输数据,可不受滑动窗口控制,实现传输紧急数据。

MSG_OOB使用方法如:

        send(socket_fd, buff, buff_len, MSG_OOB);

        recv(socket_fd, buffer, MAX_BUFFER_SIZE, MSG_OOB);

MSG_OOB数据比普通数据有更高优先级。

15.7与窗口管理相关的攻击

通告非常小的窗口,让发送方缓慢发送,并保持忙碌发送,耗尽资源。

15.8总结

延迟ACK:

        使用场景:交互式通信中,当接收方收到数据后,延迟回复ACK,等到有数据发送时再一起携带ACK发送。

        优点:减少包数量。

        缺点:延时增大。

Nagle算法:

        使用场景:广域网中RTT较大的环境中,采用Nagle算法,可以合并多个小数据包成一个,再发送。

        优点:减少包数量,降低传输开销。

        缺点:延时增大。

延迟ACK和Nagle算法会短暂死锁,有的会禁用Nagle算法。

        通常延时不敏感的交互式应用可使用Nagle。

当接收端的接收缓存为空,会通告窗口为0。此时发送端会停止发送,并周期发送窗口探测,直到通告不为0。

糊涂窗口综合症:

        接收端通告了小窗口,发送端立即发送小数据,导致网络太多小数据。

        解决方法:

                接收端不通告小窗口。

                发送端不发送小数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/437413.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有一点好看的wordpress外贸独立站模板

手机配件wordpress外贸网站模板 充电器、移动电源、手机膜、手机电池、手机壳、手机转接头等手机配件wordpress外贸网站模板。 https://www.jianzhanpress.com/?p3809 车载电器wordpress外贸网站模板 车载吸尘器、空气净化器、行车记录仪、车载充电器、车载影音导航等车载电…

设计模式—命令模式:探索【命令模式】的奥秘与应用实践!

命令模式 命令模式是一种行为设计模式,它的主要目的是将请求封装成一个对象,从而使得请求的发送者和接收者之间进行解耦。 在命令模式中,命令被封装为一个对象,包含了需要执行的操作以及执行这些操作所需的所有参数。 命令的发送者…

【异常处理】Vue报错 Component template should contain exactly one root element.

问题描述 启动VUE项目后控制台报错: Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.翻译为:组件模板应该只包含一个根元素 查看vue代码&#xff0…

Python实战小项目-骰子模拟器+Turtle绘图

Python实战小项目-骰子模拟器Turtle绘图 骰子模拟器Turtle绘图 骰子模拟器 导入了random模块,该模块提供了生成随机数的功能。 定义了两个变量min_val和max_val,分别表示骰子的最小值和最大值。在这个例子中,骰子的最小值为1,最大…

二维码门楼牌管理系统应用场景:数据管理的智慧新选择

文章目录 前言一、数据管理部门的智慧工具二、助力决策制定与优质服务提供三、二维码门楼牌管理系统的优势四、展望未来 前言 随着科技的飞速发展,二维码门楼牌管理系统正逐渐成为城市管理的智慧新选择。该系统不仅提升了数据管理效率,还为政府和企业提…

blast原理与使用技巧,最全最详细

BLAST 序列比对 在生物信息学领域,序列比对是一项基础而关键的任务。它帮助研究人员识别基因、理解蛋白质功能,并揭示物种之间的进化关系。 本文旨在介绍BLAST(Basic Local Alignment Search Tool)的原理及其不同变体,…

买不到的数目c++

题目 输入样例: 4 7输出样例: 17 思路 一个字,猜。 一开始不知道怎么做的时候,想要暴力枚举对于特定的包装n, m,最大不能买到的数量maxValue是多少,然后观察性质做优化。那么怎么确定枚举结果是否正确呢…

「词令官网直达」网址导航分享5个最具权威的研究生考研信息平台官方网站

分享5个最具权威的研究生考研信息平台网站 1、中国研究生招生信息网 官网直达入口:打开「词令」关键词口令直达工具,输入词令「中国研究生招生信息网」搜索直达进入中国研究生招生信息网官方网站; 中国研究生招生信息网(简称研…

npm ERR! code ERR_INVALID_URL报错解决

这个报错是URL错误&#xff0c;要排除两个点 npm的registry有没有搞错&#xff0c;也就是npm源有没有搞错 打开文件C:/User/<用户名>/.npmrc查看npm设置查看registry的设置有没有格式错误正确设置格式&#xff1a;registry"https://registry.npmmirror.com"或…

搜维尔科技:动作捕捉与数字时尚:Wondar Studios欧莱雅项目

来自意大利的Wondar Studios工作室&#xff0c;是一家制作与动作捕捉技术相关软件和内容的公司&#xff0c;其出品的三维角色动画均由专业动捕系统真实录制制作。 我们很高兴与大家分享Wondar Studios最新的动捕项目&#xff0c;该项目带来了身临其境的虚拟现实体验。他们与巴…

【Spring高级】第2讲:容器实现类

目录 BeanFactory实现BeanDefinition后置处理器单例bean创建后置处理器顺序总结 ApplicationContext实现ClassPathXmlApplicationContextFileSystemXmlApplicationContextAnnotationConfigApplicationContextAnnotationConfigServletWebServerApplicationContext BeanFactory实…

stable diffusion的额外信息融入方式

conditioning怎么往sd中添加&#xff0c;一般有三种&#xff0c;一种是直接和latent拼一下&#xff0c;另外很多是在unet结构Spatialtransformers上加&#xff0c;和文本特征一样&#xff0c;通过cross-attention往unet上加&#xff0c;这里还需要注意一点&#xff0c;在文本嵌…

2024主流测试工具测评,总有一款适合你!

大家好&#xff01;我是测试元宝~ 在软件开发周期中&#xff0c;测试是确保产品质量的关键环节。随着企业对于软件质量的要求日益提升&#xff0c;测试人员面临着前所未有的挑战&#xff0c;“工欲善其事必先利其器”&#xff0c;选择一款高效、实用的软件测试工具&#xff0c…

Vue.js 修饰符:精准控制组件行为

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

《幸运的基督徒》Python

题目描述 有15个基督徒和15个非基督徒在海上遇险&#xff0c; 为了能让一部分人活下来不得不将其中15个人扔到海里面去&#xff0c; 有个人想了个办法就是大家围成一个圈&#xff0c;由某个人开始从1报数&#xff0c; 报到9的人就扔到海里面&#xff0c;他后面的人接着从1开始报…

★【完全二叉树】【层序遍历】判断是否是完全二叉树

【完全二叉树】【层序遍历】判断是否是完全二叉树 解法1 层序遍历 **判断是不是完全二叉树思路&#xff1a;**:star: ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法1 层序遍历 判断是不是完全二叉树思路&#xff1a…

day28【LeetCode力扣】383.赎金信

day28【LeetCode力扣】383.赎金信 以后我们每期附张图啦&#xff5e;&#xff5e;&#xff5e; 1.题目描述 附上题目链接&#xff1a;赎金信 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以…

一篇文章教会你Python+selenium自动化生成测试报告

前言 批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。 unittest里面是不能生成html格式报告的&#xff0c;需要导入一个第三方的模块&#xff1a;HTMLTestRunner 一、导…

python创建和上传自己的PyPI库

文章目录 创建和上传自己的PyPI库pypi准备文件制作PyPI包在上传前&#xff0c;先本地验证注册PyPI账户上传pypi判断python包质量之 SourceRankLibraries.io 参考 创建和上传自己的PyPI库 pypi 官方地址&#xff1a;https://pypi.org/ Python中我们经常会用到第三方的包&…

使用nginx输入端口号显示404

输入对应的端口号显示404 先检查当前nginx文件夹的路径是没有中文的查看是否没有开启nginx&#xff1a;ctrlaltdelete打开任务管理器&#xff0c;看看有没有nginx.exe进程&#xff08;一般是有两个进程&#xff09;如果没有进程说明没有打开nginx&#xff0c;查看端口号是否被…