当前位置: 首页 > news >正文

《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。

糊涂窗口综合症:

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

        解决方法:

                接收端不通告小窗口。

                发送端不发送小数据。

相关文章:

《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 紧急机制…...

ContentType类型总结

ContentType类型总结 Content-Type是一个HTTP头部字段,用于指示资源的媒体类型(MIME类型),以及可选的字符集和编码方式。它告诉浏览器或其他客户端如何解释接收到的数据。以下是一些常见的Content-Type类型及其用途: t…...

基于脚手架创建vue工程

环境要求: node.js:前端项目的运行环境 npm:javascript的包管理器 vue cli:项目脚手架 忘了自己有没有安装可以通过在黑窗口输入命令看一下 node -v npm -v 这里出现版本号就说明已经安装了 安装脚手架的命令:npm i vue/cli -g 创建vue基础工程 1.在一个没…...

【Http】OSI 和 TCP/IP,OSI,TCP/IP为什么网络要分层?

目录 OSI 和 TCP/IP OSI TCP/IP 为什么网络要分层? OSI 和 TCP/IP OSI ![image-20231205101106040](.assets/image-20231205101106040.pn OSI 的七层体系结构概念清楚,理论也很完整,但是它比较复杂而且不实用,而且有些功能在…...

STM32(5) GPIO(2)输出

1.点亮LED 1.1 推挽接法和开漏接法 要想点亮LED,有两种接法 推挽接法: 向寄存器写1,引脚输出高电平,LED点亮;向寄存器写0,引脚输出低电平,LED熄灭。 开漏接法: 向寄存器写0&…...

shell脚本一键部署docker

Docker介绍 Docker 是一个开源的平台,用于开发、交付和运行应用程序。它利用容器化技术,可以帮助开发人员更轻松地打包应用程序及其依赖项,并将其部署到任何环境中,无论是开发工作站、数据中心还是云中。以下是 Docker 的一些关键…...

vue2实现拖拽排序效果

1、首先下载 vuedraggable 插件 npm i -S vuedraggable2、使用方法 <template><div><div style"display: flex; justify-content: center; align-items: center"><div style"width: 120px; height: 60px; line-height: 60px; text-align…...

数据结构实验:二叉排序树

题目描述 对应给定的一个序列可以唯一确定一棵二叉排序树。然而&#xff0c;一棵给定的二叉排序树却可以由多种不同的序列得到。例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树&#xff0c;都得到一样的结果。你的任务书对于输入的各种序列&#xff0c;判断它们是否…...

Java类加载流程?

Java类加载过程是指将.class文件中的字节码数据加载到内存中&#xff0c;并生成对应的Class对象的过程。Java类加载器&#xff08;ClassLoader&#xff09;负责执行这个任务。Java类加载过程主要包括以下几个步骤&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;…...

Docker从0到1的开始【入门篇】

Docker是一种流行的容器化平台&#xff0c;它允许开发人员将应用程序及其所有依赖项打包到一个标准化的单元中&#xff0c;从而实现快速部署和可移植性。在本文中&#xff0c;我们将列出一些常用的Docker命令&#xff0c;以帮助您更好地了解和使用Docker。 1. 安装Docker 要安…...

@ResponseStatus

目录 概述&#xff1a; 用途&#xff1a; 参数&#xff1a; 注意事项&#xff1a; 自定义异常类&#xff1a; 底层原理&#xff1a; 概述&#xff1a; 在 Spring MVC 中&#xff0c;我们有很多方法来设置 HTTP 响应的状态码其中最直接的方法&#xff1a;使用 ResponseSt…...

高效加载大文件(pandas+dask)

一、仅用pd加载大文件(iterator、chunksize) 要使用Pandas进行高效加载超大文件&#xff0c;我们通常会利用其内置的分块&#xff08;chunk&#xff09;处理功能。不过&#xff0c;请注意&#xff0c;Pandas本身并不支持多线程读取文件&#xff1b;它更倾向于单线程中进行块处理…...

游戏引擎分层简介

游戏引擎分层架构&#xff08;自上而下&#xff09; 工具层&#xff08;Tool Layer&#xff09; 在一个现代游戏引擎中&#xff0c;我们最先看到的可能不是复杂的代码&#xff0c;而是各种各样的编辑器&#xff0c;利用这些编辑器&#xff0c;我们可以制作设计关卡、角色、动画…...

向爬虫而生---Redis 探究篇6<Redis的Bigkey问题介绍>

前言: 随着数据规模的增长,Redis的BigKey问题也开始显现。 BigKey问题主要指的是存储了大量数据的key,这可能给Redis的性能和可用性带来负面影响。当一个key的数据量过大时,会占用宝贵的内存资源,拖慢Redis的响应速度。此外,存储和恢复这些BigKey也会变得困难和耗时,增…...

【开源物联网平台】FastBee认证方式和MQTT主题设计

&#x1f308; 个人主页&#xff1a;帐篷Li &#x1f525; 系列专栏&#xff1a;FastBee物联网开源项目 &#x1f4aa;&#x1f3fb; 专注于简单&#xff0c;易用&#xff0c;可拓展&#xff0c;低成本商业化的AIOT物联网解决方案 目录 一、接入步骤 1.1 设备认证 1.2 设备交…...

Ubuntu Qt控制终端运行ros

文章目录 gnome-terminalQt 通过QProcess类Qt 通过system gnome-terminal 在Ubuntu中可以使用man gnome-terminal命令查看gnome-terminal的使用指南&#xff0c;也可在ubuntu manuals查看&#xff1a; NAMEgnome-terminal — 一个终端仿真应用.概要gnome-terminal [-e, --c…...

mysql 性能调优参数配置文件

########################################################################### ## my.cnf for MySQL 8.0.x # ## 本配置参考 https://imysql.com/my-cnf-wizard.html # ## 注意&#xff1a; …...

windows右键新建文件没有txt文本文档怎么办?

我碰到此问题&#xff0c;按照以下方法改了注册表&#xff0c; 重启之后就正常了&#xff08;没有注销&#xff0c;只是单纯重启&#xff09;。以下方法来自AI&#xff1a; 如果在注册表的 .txt 路径下没有找到 ShellNew 键&#xff0c;你可以尝试手动创建这个键和所需的值来恢…...

已读不回,我又玻璃心了

最近有点上火&#xff0c;3个询盘给我整我无语了&#xff0c;难道我还没修炼到家&#xff1f;玻璃心又出来作祟了&#xff1f; 客户A急火火的发我一个文件&#xff0c;需求内容ios客户端调整&#xff0c;让我按照需求给找个人处理下&#xff0c;我收到后抓紧时间摇人&#xff0…...

面试经典150题(105-107)

leetcode 150道题 计划花两个月时候刷完之未完成后转&#xff0c;今天&#xff08;第2天&#xff09;完成了3道(105-107)150 105.&#xff08;191. 位1的个数&#xff09;题目描述&#xff1a; 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&am…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...