作者:Julia Evans
原文链接:Why you should understand (a little) about TCP


即使你的工作也许不需要对TCP了如指掌,也不需要去了解具体的TCP/IP实例。你也应该懂一些基本的TCP知识,本文会告诉你为什么。

我以前在Recurse Center工作的时候,曾经用Python写过一个TCP栈(还写了一篇博文用Python实现TCP栈可以学到什么)。这是很有意思的一课,也基本上是我对TCP的所有了解了。

一年之后,工作上遇到了困难。有同事在Slack上问到:“嘿,我向NSQ推消息总是会有40ms的延迟,不知道为什么。”这个问题我思来想去,过了一个周,还是毫无头绪。

这里解释一下: NSQ是一个用来发消息的队列。发送方式是向localhost发出一个HTTP请求,这个动作不可能花费40ms,一定是出了错。但是NSQ不具备很高的CPU优先级,也没有占用大量内存,所以问题不是出在垃圾回收那边。

后来,我想起来一周之前读过的一篇文章——我们是如何在每一个POST请求上省出200ms的(In search of performance - how we shaved 200ms off every POST request)。这篇文章讨论了一开始每一个POST都会多花200ms的原因,多少有些诡异。下面是这篇文章中的内容。

ACK延迟和TCP_NODELAY

Ruby的Bet::HTTP将POST请求分成两个TCP包——一个header,一个body.curl,相比之下,将它们组合成一个倒是更加合适。不过更糟的是,Net:HTTP没有给它打开的TCP socket设置TCP_NODELAY,所以发送第一个包之后,要等到确认才会发送第二个。归根结底,这是Nagle算法导致的。

连接的另一端,HAProxy要选择用何种方式确认这两个包。在1.4.18(正式我们使用的版本),它使用的是TCP延时确认,延时确认在Nagle算法中表现很糟糕,导致请求在这个地方暂停了,直至超时。

我来总结一下这段话:

  • TCP是将你要发送的数据打包的算法
  • 他们的HTTP需要用两个小包发送POST请求

整个过程就像下面这样:

application:嗨!给你第一个包
HAProxy:嘘……我们要等第二个包
HAProxy:对了,我们要给他个确认,不过没什么大不了的,等会再说
application:嘘……我们等到第一个包的确认再发第二个,也许网络堵车了,再等一会
HAProxy:烦死了,我们发第一个包的确认吧
application:收到确认,发第二个包!!!!
HAProxy:搞定!

这段时间内,HAProxy和application都在消极地等待,直到超过200ms。application等待是因为Nagle算法,HAProxy等待是因为延迟ACK。

据我所知,延迟的ACK在所有Linux系统都是默认打开的。所以这不是特例,只要你发送的数据多于一个TCP包,你也会碰上这种事。

终于搞定了问题

读了这篇文章之后,觉得没什么了不起的。但是在我们的神秘40ms挣扎了许久,我想起来这篇文章。

我想:这可能是我的问题吗?可能吗??可能吗?!我给团队发了一封邮件说“可能是我疯了,不过,有可能是TCP的问题。”

于是我将TCP_NODELAY打开,然后——BOOM!

所有的40ms延迟统统消失了,这个世界完美了。我真是个天才!

ACK延迟应该完全关闭吗

提一个小插曲,我在HN上看到了这条评论:

真正的问题处在ACK延迟上。200ms延时设定是糟糕的主意,1985年在伯克利搞BSD的那帮人,根本不理解这个问题。ACK延迟是赌应用层一定会在200ms之内收到回复。虽然几乎每次都输,但是ACK延迟依然在用。

他在评论中讨论了ACK是成本很低的,这中做法所导致的问题比它解决的问题要严重的多。

如果你不懂TCP,就搞不定这个问题

以前我总认为TCP是相当底层的东西,我永远不需要去了解它。虽然差不多是这样,但是实际生活中,你依然可能遇见和TCP算法相关的Bug,这时候懂一些TCP的知识就至关重要了。(本文也可以引申为,系统调用,操作系统这些都很重要,这个道理适用于很多东西。)

ACK延时/TCP_NODELAY很糟糕——它可能对任何写HTTP请求代码的人造成影响。但是你不必成为系统编程方面的天才,懂一点TCP就帮我搞定了这个问题,也让我意识到,出现这个问题我也有责任。我也在用strace,strace万岁!


译者:赖信涛,关注Python,喜欢编程和电子游戏,个人博客:http://www.kawabangga.com/

人人都该懂点儿TCP相关推荐

  1. 为什么人人都应该玩儿点儿DIY?

    为什么人人都应该玩儿点儿DIY DIY是什么? 说到DIY,人们一般想到的就是折纸.手工这类靠动手能力的活动.实际上,上面提到的DIY只 是属于狭义上的DIY.广义上的DIY可远不止这些.DIY(Do ...

  2. 人人都能懂的图灵机原理

    人人都能懂的图灵机原理 图灵机是一个计算模型,最早用来解决判定一个问题到底可不可解,那么它是如何判定的呢? 在本篇文章开始之前,我们先来看一段视频: https://www.zhihu.com/zvi ...

  3. 这8个人人都该懂的电脑技巧,你都知道哪些?

    相信大家对电脑都特别感兴趣,其实玩电脑也是有很多技巧的,下面这8个人人都该懂的电脑技巧,你都知道哪些? 1.一键锁定屏幕 快捷键:[Win+L] 我们在使用电脑的时候,如果有事需要离开一会,但是又担心 ...

  4. 为什么人人都该懂点LLVM

    只要你和程序打交道,了解编译器架构就会令你受益无穷--无论是分析程序效率,还是模拟新的处理器和操作系统.通过本文介绍,即使你对编译器原本一知半解,也能开始用LLVM,来完成有意思的工作. LLVM是什 ...

  5. 为什么人人都需要懂一点高阶(中台)产品思维

    以下文章来源于三爷茶馆 ,作者三爷 小编说:当下的互联网产业已经进入了一个相对成熟的阶段,此时决定企业竞争力的关键因素已变成效率.因此如何用最低的成本完成最多的产出就成为互联网公司的新目标,而中台战略 ...

  6. 人人都能懂的量子力学

    源自: https://www.sohu.com/a/236628909_418353 你是否曾被量子物理里面那些稀奇古怪的思想搞得神经错乱? 首先,不要惊慌.神经错乱的不只你一个.正如具有传奇色彩的 ...

  7. 这么讲音频算法,真是人人都能懂

    这一章开始介绍一些算法相关的内容.前面有几章对播放强调较多,这期本来想写录音方面的内容.但是普通的麦克风电路主要是模拟电路,独立做一章来写觉得内容有点少,所以会在其他章节穿插介绍.至于MEMS麦克风, ...

  8. 图解机器学习:人人都能懂的算法原理(附链接)

    来源:机器之心 本文约2400字,建议阅读5分钟 本文整理了一篇博客文章的内容,读者可根据这些图理解看似高深的机器学习算法. 标签:机器学习 算法公式挺费神,机器学习太伤人.任何一个刚入门机器学习的人 ...

  9. 【图解机器学习】人人都能懂的算法原理

    简介: 算法公式挺费神,机器学习太伤人.任何一个刚入门机器学习的人都会被复杂的公式和晦涩难懂的术语吓到.但其实,如果有通俗易懂的图解,理解机器学习的原理就会非常容易.本文整理了一篇博客文章的内容,读者 ...

  10. 人人都能懂的贝叶斯统计:原理与实践

    (本文中打斜体的内容与理解正文无关,但感兴趣的话可以自查) 18世纪,有一位专业的神职人员,业余的数学家,也许是坐观天象,偶得天启,洞悉了所谓命运背后的数学规律.他不仅为后世留下了诸如"先验 ...

最新文章

  1. mysql插入的时候是否需要commit
  2. 致远互联“平台+生态”抢占数字化升级新赛
  3. java 位运算_java学习之运算符与表达式(四)
  4. 双目密集匹配的一般过程
  5. 属性面板 脚本_如何在组态王中实现同类型设备公用操作面板的调用---干货
  6. t-sql存储过程_使用T-SQL进行存储过程中ORDER BY的精确控制
  7. 区块链 Gossip Protocol是什么
  8. Hadoop I/O
  9. 什么是云计算管理平台
  10. 电路分析之《变压器》
  11. 多序列比对---ClustalX比对GeneDoc美化
  12. 惠普打印机USB安装成功,但断开USB重新连接时显示脱机无法打印问题(上一版本的驱动程序还在内存中,因此无法加载驱动程序)
  13. mybatis事务原理与集成spring的事务原理
  14. 以为精通Java 线程池,看到这些误区,还是年轻了
  15. Android内核层驱动程序UAF漏洞提权实例
  16. JS 手机端摇一摇 苹果IOS13.3高版本处理
  17. 【1.01】VBA基础
  18. PTA浙大版《C语言程序设计(第3版)》练习2-4 温度转换
  19. Pythton学习笔记1
  20. Flink的双流join介绍

热门文章

  1. Avalondock 技巧之如何隐藏浮动面板停靠器
  2. [含论文+答辩PPT+任务书+中期检查表+源码等]S2SH洋酒销售系统|商城
  3. Properties与ResourceBundle的基本使用以及区别
  4. 0x800700b7 linux,0x800700b7解决方法
  5. 密度泛函理论平面波基组展开
  6. 使用三边定位算法进行室内定位
  7. 阅读HashMap(1.6)源码所做的一些记录
  8. echart 迁徙图
  9. AutoCAD 2019 汉化包
  10. codeblock图形界面编程(二)