阅读更多

1顶
4踩

互联网

原创新闻 人人都该懂点儿TCP

2015-11-26 17:26 by 副主编 mengyidan1988 评论(3) 有5543人浏览
作者: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/
1
4
评论 共 3 条 请登录后发表评论
3 楼 u012972794 2015-12-02 18:46
学习了!
2 楼 451914442 2015-11-27 14:50
后来,我想起来一周之前读过的一篇文章——我们是如何在每一个POST请求上省出200ms的(In search of performance - how we shaved 200ms off every POST request)。这篇文章讨论了一开始每一个POST都会多花200ms的原因,多少有些诡异。下面是这篇文章中的内容。

我想说为什么POST会多花200ms?我的POST请求就不到200ms。
还有你同事说请求多花了40ms,这事他是怎么知道的?
1 楼 mangguo 2015-11-27 09:28
握手还是很重要的。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 人人都该懂点儿TCP---ACK延缓(转)

    作者:Julia Evans 译者:赖信涛原文链接:Why you should understand (a little) about TCP ... 即使你的工作也许不需要对TCP了如指掌,也...你也应该懂一些基本的TCP知识,本文会告诉你为什么。 我以前在Recurs...

  • 这一年,这些书:2022年读书笔记

    飞向太空的人和一万年前躺在草地上数星星那个人并没有什么不同,他们一样要思索,一样要怀疑,自己为什么要降生于这个世间,这一生又该做些什么。当远古的人第一次不需要为了食物而奔波时,这个问题就产生了,并将...

  • IT学生解惑真经(转) (真的好经典!)

    都在为如何如何学习才能找到工作、融入社会而迷惑 我们需要的不是灵丹妙药 而是一本让你少走几年弯路的 IT学生解惑真经 肖舸 杨中科 左飞 著 这是一部写给在校计算机专业学生的书 如果...

  • 趣谈网络协议-第二模块-底层网络知识详解:3最常用的应用层1http与https

    如果好不容易建立了连接,然后就做了一点儿事情就结束了,有点儿浪费人力和物力。 (其实就是说,HTTP 请求的准备是:1、把域名发给DNS,得到IP地址;2、建立Socket[如果是http1.1及之后,开启了Keep-Alive,就会在...

  • 一波面经。。。

    美团2015校招面经-软件研发岗 (拿到offer) 一面 ...我一看题目心中暗喜,这个好做,好歹都写过求两个字符串的最长公共子串,求一个字符串的重复子串

  • 你是如何转行的?转行容易吗?

    但是什么都不会,于是读了个自考。 电子技术,老爸说,以后可以修计算机了。 后来又找了个朋友教我做PS。 专科考完以后,就想考研。 那得先考本科,于是本科读了一个计算机网络。 考研的时候报名计算机软件...

  • 快速搭建个人博客——保姆级教程

    网上大多数教程啊,都是一个大长篇,鼠标滑好几下都不带滑完的那种。会给刚入门的朋友一种:”哇,好难啊,这么多东西啊“的感觉,所以这里我对各部分的内容进行了分类,你只要按照顺序,一步步往下走就好啦 本地...

  • 如何成为一个优秀的程序员『转载』

    我们的老师每天都要应对...我一开始看什么书都看不懂,怎么才能理出一个学习顺序?诸如此类。这使我迫切地感觉到,应 该总结这样一份非具体技术问题的FAQ了。本文仅代表我个人观点,有问题欢迎mailto: songjinsha...

  • to be top。。。

    //在javaeye上找到的好文章,转了。。可惜大学已经过去两年了,继续lab,until top 我们的老师每天都要应对报名者和...我一开始看什么书都看不懂,怎么才能理出一个学习顺序?诸如此类。这使我迫切地感觉到,应该总

  • 教了一年少儿编程,说说感想和体验

    iii)工具 此处的工具是指那些在编程时要用到的工具(例如 debug 工具,各类资源监控工具等)、支持库、程序包以及和业务相关的知识(比如要写网卡 driver 总要懂 TCP/IP 协议啊)的总和。 这部分,对于职业程序员而言是...

  • 网络攻防第一周作业

    其实他的技术也许并不是黑客中最好的,甚至相当多的黑客们都反感他,认为他是只会用攻击、不懂技术的攻击狂,但是其黑客经历的传奇性足以让全世界为之震惊,也使得所有网络安全人员丢尽面子。 主要成就:他是第一...

  • 基于stm32f4系列单片机,ad7606的8通道16位的同步ADC例程。.zip

    基于stm32f4系列单片机,ad7606的8通道16位的同步ADC例程。

  • 六数码问题..._lan.zip

    六数码问题..._lan

  • ASP.NET旅游信息管理系统 asp.net(c#)+sql.zip

    ASP.NET旅游信息管理系统 asp.net(c#)+sql

  • ListView 中的item随意拖动.zip

    ListView 中的item随意拖动.zip

  • 图形化界面采用Easyx编写,实现对哈夫曼树的显示操作

    【作品名称】:图形化界面采用Easyx编写,实现对哈夫曼树的显示操作 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 数据结构课程设计(哈夫曼编码译码器) 本程序语言为c语言,内容包括: 哈夫曼编码 显示哈夫曼树 哈夫曼译码 图形化界面采用Easyx编写,实现对哈夫曼树的显示操作。

  • 致远OA V8.1 数据字典

    致远OA V8.1 数据字典

  • Python数据结构与算法分析的课件PPT和电子图书

    Python数据结构与算法分析的课件PPT和电子图书

  • FastStone Capture屏幕长截图软件包

    FastStone Capture屏幕长截图软件包

Global site tag (gtag.js) - Google Analytics