导读:有很多文章出于各种“性能调优”或“安全性”原因,建议禁用 TCP 扩展,本文提供了这些扩展功能的背景,为什么会默认启用,它们之间是如何关联的,以及为什么通常情况下将它们关闭是个坏主意。本文字数:10601,阅读时长大约:16分钟https://linux.cn/article-12710-1.html作者:Florian Westphal译者:XianLei Gao

Linux TCP 协议栈具有无数个可以更改其行为的 sysctl 旋钮。这包括可用于接收或发送操作的内存量、套接字的最大数量、可选的特性和协议扩展。

有很多文章出于各种“性能调优”或“安全性”原因,建议禁用 TCP 扩展,比如时间戳或选择性确认(Selective ACKnowledgments)(SACK)。

本文提供了这些扩展功能的背景,为什么会默认启用,它们之间是如何关联的,以及为什么通常情况下将它们关闭是个坏主意。

TCP 窗口缩放

TCP 可以承受的数据传输速率受到几个因素的限制。其中包括:

◈ 往返时间(Round trip time)(RTT)。

这是数据包到达目的地并返回回复所花费的时间。越低越好。

◈ 所涉及的网络路径的最低链路速度。◈ 丢包频率。◈ 新数据可用于传输的速度。

例如,CPU 需要能够以足够快的速度将数据传递到网络适配器。如果 CPU 需要首先加密数据,则适配器可能必须等待新数据。同样地,如果磁盘存储不能足够快地读取数据,则磁盘存储可能会成为瓶颈。

◈ TCP 接收窗口的最大可能大小。

接收窗口决定了 TCP 在必须等待接收方报告接收到该数据之前可以传输多少数据(以字节为单位)。这是由接收方宣布的。接收方将在读取并确认接收到传入数据时不断更新此值。接收窗口的当前值包含在 TCP 报头 中,它是 TCP 发送的每个数据段的一部分。因此,只要发送方接收到来自对等方的确认,它就知道当前的接收窗口。这意味着往返时间(RTT)越长,发送方获得接收窗口更新所需的时间就越长。

TCP 的未确认(正在传输)数据被限制为最多 64KB。在大多数网络场景中,这甚至还不足以维持一个像样的数据速率。让我们看看一些例子。

理论数据速率

在往返时间(RTT)为 100 毫秒的情况下,TCP 每秒最多可以传输 640KB。在延迟为 1 秒的情况下,最大理论数据速率降至只有 64KB/s。

这是因为接收窗口的原因。一旦发送了 64KB 的数据,接收窗口就已经满了。发送方必须等待,直到对等方通知它应用程序已经读取了至少一部分数据。

发送的第一个段会把 TCP 窗口缩减去该段的大小。在接收窗口值的更新信息可用之前,需要往返一次。当更新以 1 秒的延迟到达时,即使链路有足够的可用带宽,也会导致 64KB 的限制。

为了充分利用一个具有几毫秒延迟的快速网络,必须有一个比传统 TCP 支持的窗口更大的窗口。“64KB 限制”是协议规范的产物:TCP 头只为接收窗口大小保留了 16 个位。这允许接收窗口最大为 64KB。在 TCP 协议最初设计时,这个大小并没有被视为一个限制。

不幸的是,想通过仅仅更改 TCP 头来支持更大的最大窗口值是不可能的。如果这样做就意味着 TCP 的所有实现都必须同时更新,否则它们将无法相互理解。为了解决这个问题,我们改变了对接收窗口值的解释。

“窗口缩放选项”允许你改变这个解释,同时保持与现有实现的兼容性。

TCP 选项:向后兼容的协议扩展

TCP 支持可选扩展。这允许使用新特性增强协议,而无需立即更新所有实现。当 TCP 发起方连接到对等方时,它还会发送一个支持的扩展列表。所有扩展都遵循相同的格式:一个唯一的选项号,后跟选项的长度以及选项数据本身。

TCP 响应方检查连接请求中包含的所有选项号。如果它遇到一个不能理解的选项号,则会跳过 该选项号附带的“长度”字节的数据,并检查下一个选项号。响应方忽略了从答复中无法理解的内容。这使发送方和接收方都够理解所支持的公共选项集。

使用窗口缩放时,选项数据总是由单个数字组成。

窗口缩放选项

Window Scale option (WSopt): Kind: 3, Length: 3    +---------+---------+---------+    | Kind=3  |Length=3 |shift.cnt|    +---------+---------+---------+         1         1         1

窗口缩放 选项告诉对等方,应该使用给定的数字缩放 TCP 标头中的接收窗口值,以获取实际大小。

例如,一个宣告窗口缩放因子为 7 的 TCP 发起方试图指示响应方,任何将来携带接收窗口值为 512 的数据包实际上都会宣告 65536 字节的窗口。增加了 128 倍(2^7)。这将允许最大为 8MB 的 TCP 窗口。

不能理解此选项的 TCP 响应方将会忽略它,为响应连接请求而发送的 TCP 数据包(SYN-ACK)不会包含该窗口缩放选项。在这种情况下,双方只能使用 64k 的窗口大小。幸运的是,默认情况下,几乎每个 TCP 栈都支持并默认启用了此选项,包括 Linux。

响应方包括了它自己所需的缩放因子。两个对等方可以使用不同的因子。宣布缩放因子为 0 也是合法的。这意味着对等方应该如实处理它接收到的接收窗口值,但它允许应答方向上的缩放值,然后接收方可以使用更大的接收窗口。

与 SACK 或 TCP 时间戳不同,窗口缩放选项仅出现在 TCP 连接的前两个数据包中,之后无法更改。也不可能通过查看不包含初始连接三次握手的连接的数据包捕获来确定缩放因子。

支持的最大缩放因子为 14。这将允许 TCP 窗口的大小高达 1GB。

窗口缩放的缺点

在非常特殊的情况下,它可能导致数据损坏。但在你禁用该选项之前,要知道通常情况下是不可能损坏的。还有一种解决方案可以防止这种情况。不幸的是,有些人在没有意识到它与窗口缩放的关系的情况下禁用了该解决方案。首先,让我们看一下需要解决的实际问题。想象以下事件序列:

1. 发送方发送段:s_1、s_2、s_3、... s_n。2. 接收方看到:s_1、s_3、... s_n,并发送对 s_1 的确认。3. 发送方认为 s_2 丢失,然后再次发送。它还发送了段 s_n+1 中包含的新数据。4. 接收方然后看到:s_2、s_n+1,s_2:数据包 s_2 被接收两次。

当发送方过早触发重新传输时,可能会发生这种情况。在正常情况下,即使使用窗口缩放,这种错误的重传也绝不会成为问题。接收方将只丢弃重复项。

从旧数据到新数据

TCP 序列号最多可以为 4GB。如果它变得大于此值,则该序列会回绕到 0,然后再次增加。这本身不是问题,但是如果这种问题发生得足够快,则上述情况可能会造成歧义。

如果在正确的时刻发生回绕,则序列号 s_2(重新发送的数据包)可能已经大于 s_n+1。因此,在最后的步骤(4)中,接收方可以将其解释为:s_2、s_n+1、s_n+m,即它可以将 “旧” 数据包 s_2 视为包含新数据。

通常,这不会发生,因为即使在高带宽链接上,“回绕”也只会每隔几秒钟或几分钟发生一次。原始数据包和不需要的重传的数据包之间的间隔将小得多。

例如,对于 50MB/s 的传输速度,重复项要迟到一分钟以上才会成为问题。序列号的回绕速度没有快到让小的延迟会导致这个问题。

一旦 TCP 达到 “GB/s” 的吞吐率,序列号的回绕速度就会非常快,以至于即使只有几毫秒的延迟也可能会造成 TCP 无法检测出的重复项。通过解决接收窗口太小的问题,TCP 现在可以用于以前无法实现的网络速度,这会产生一个新的,尽管很少见的问题。为了在 RTT 非常低的环境中安全使用 GB/s 的速度,接收方必须能够检测到这些旧的重复项,而不必仅依赖序列号。

(待续)


via: https://fedoramagazine.org/tcp-window-scaling-timestamps-and-sack/

作者:Florian Westphal 选题:lujun9972 译者:gxlct008 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

animator时长缩放是什么_TCP 窗口缩放、时间戳和 SACK(1) | Linux 中国相关推荐

  1. imu与gps之间的时间戳_TCP 窗口缩放、时间戳和 SACK(2) | Linux 中国

    导读:有很多文章出于各种"性能调优"或"安全性"原因,建议禁用 TCP 扩展,本文提供了这些扩展功能的背景,为什么会默认启用,它们之间是如何关联的,以及为什么通 ...

  2. 【vue + echarts】图表自适应缩放(跟随浏览器的窗口缩放,项目侧边栏折叠后的窗口缩放),图表重绘

    效果图: 先清楚两个东西,浏览器窗口的缩放和项目侧边栏折叠后窗口的缩放,这两个是不一样的 第一种,浏览器窗口缩放后,当前窗口会放大了或者缩小了,这时会走浏览器缩放的代码部分,前几期有出过文章说明,参考 ...

  3. 没有run窗口_使用 Terminator 在一个窗口中运行多个终端 | Linux 中国

    Terminator 为在单窗口中运行多个 GNOME 终端提供了一个选择,让你可以灵活地调整工作空间来适应你的需求.-- Sandra Henry-stocker Terminator 为在单窗口中 ...

  4. 动画程序时长缩放是什么意思_Pr预设:2000种文字标题排版指示线图形动画无缝转场剪辑工具包...

    包含2000+文字标题排版的图形元素动画.指示线图形动画.图形转场动画.字幕条动画.视频遮罩转场素材.4K光效视频素材.视频无缝转场等种类多样的PR预设模板剪辑工具包.让视频效果丰富生动 [模板信息] ...

  5. Unity通过Animator获取动画clip时长

    ///获取动画状态机animator的动画clip的播放持续时长 public static float GetClipLength(Animator animator, string clipNam ...

  6. Unity 获得Animator下某个动画片段的时长

    调用这个方法可以获得动画时长 /// <summary>/// 获得animator下某个动画片段的时长方法/// </summary>/// <param animat ...

  7. 修改deepin20.4窗口特效魔灯的动画时长

    修改deepin20.4窗口特效魔灯的动画时长 1. 魔灯特效的使用 2. 延长特效时间 1) 下载安装`systemsettings` 设置接口 2) 设置 `systemsettings` 1. ...

  8. 安全模式或开发者模式动画程序关闭动画时长缩放,动画最好不要执行

    安全模式或开发者模式动画程序关闭动画时长缩放,动画最好不要执行. 执行动画的结果:循环动画会闪烁,缩放动画不会执行. 解决:在安全模式或开发者模式动画程序关闭动画时长缩放时,不要执行动画. 1.Pow ...

  9. 【Qt】实现在窗口缩放时控件维持相对位置

    文章目录 01. 背景 02. 解决方案 03. 位置和大小的计算 03.1. 控件宽度或高度始终与窗体一致 03.2. 控件左右居中 03.3. 控件上下居中 03.4. 控件位于窗体右上角 03. ...

  10. 华为可以看游戏时长吗_华为手机玩游戏太卡?这几个设置你肯定没打开

    最近有小伙伴跟我说他新买的荣耀畅玩7X玩吃鸡和王者荣耀有点卡,他问我是不是他手机配置不行,其实很多小伙伴可能都有这种疑惑,自己的手机玩游戏卡第一时间想到的就是手机的配置不行,其实除了配置问题也有可能是 ...

最新文章

  1. MVP遇到GMCT:不加入域更改密码有几种方法?
  2. 第十五届全国大学生智能汽车竞赛创意组比赛进入全国总决赛队伍名单
  3. linux php安装memcached扩展
  4. oracle cusor 定义
  5. android 表情识别,基于Android平台的人脸表情识别系统的设计与实现
  6. Apollo(阿波罗)是携程框架部门研发的分布式配置中心,ubuntu本机安装
  7. 某IT公司的面试题,难度系数“爆表”。。。
  8. 和吴昊一起玩推理 Round 10 (第一季完结篇) —— 终极推理 —— L与夜神月的对话...
  9. python下载豆丁文档_doc_downloader
  10. 微信小程序——定位(根据经纬度算距离)
  11. 世界著名激励大师约翰·库缇斯的传奇人生
  12. SpringBoot使用AOP记录接口操作日志
  13. 01.【设计模式】工厂模式
  14. c语言计算最大值与最小值的差,C语言 · 最大值与最小值计算
  15. 指标公式c语言源码下载,【通达信】九全指标-指标公式源码
  16. 国开计算机专业英语答案,2021国开河北《计算机专业英语阅读》形考任务1-4题库.docx...
  17. u盘图片损坏怎么恢复
  18. 百度地图setMapStyle
  19. 由于找不到VCRUNTIME140_1.dll,xxx解决方法
  20. 【译】数据库事务隔离级别

热门文章

  1. (result, consumed) = self._buffer_decode(data, self.errors, final)报错
  2. Unity3D面经以及我个人对游戏研发学习路径的一些理解
  3. 深入理解计算机系统_3e 第四章家庭作业(部分) CS:APP3e chapter 4 homework
  4. java截图+中文图片识别
  5. 【计算机网络】常见面试题总结
  6. 用talib实现基于emv的简易量化投资策略
  7. 最全HTTP协议详解
  8. 内存屏障(Memory Barrier)(一)什么是写屏障?
  9. MATLAB遇到问题:错误使用mex的解决办法
  10. Modelsim搭建具有各组件的UVM验证平台