阅读更多

1顶
4踩

互联网

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

2015-11-26 17:26 by 副主编 mengyidan1988 评论(3) 有5616人浏览
作者: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 协议啊)的总和。 这部分,对于职业程序员而言是...

  • 网络攻防第一周作业

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

  • 西门子S7-200PLC与MCGS触摸屏联动控制步进伺服电机的技术解析及应用实例

    内容概要:本文详细介绍了利用西门子S7-200PLC与昆仑通泰MCGS触摸屏联合控制步进伺服电机的方法和技术要点。首先阐述了硬件接线的具体方式,包括PLC输出接口与伺服驱动器之间的正确连接以及必要的安全措施如急停开关的接入。接着深入探讨了PLC程序的核心代码片段,涵盖原点回归、手动正转触发、绝对位置计算等功能模块,并解释了关键指令如PLS的作用及其使用注意事项。此外,针对触摸屏的关键配置进行了说明,涉及数值输入框、指示灯、多状态按钮等组件的设置,强调了绝对定位逻辑的实现。文中还分享了一些常见的调试问题及解决方案,例如伺服电机抖动、数据刷新延迟等问题的处理办法。最后提到该方案已在实际生产环境中成功应用并表现出良好的性能指标。 适合人群:从事自动化控制领域的工程师和技术人员,特别是那些希望深入了解PLC与触摸屏协同工作的专业人士。 使用场景及目标:适用于需要高精度定位控制的小型自动化生产线或机械设备中,旨在帮助用户掌握如何构建稳定可靠的步进伺服控制系统,提高工作效率的同时降低成本。 其他说明:作者凭借丰富的实践经验提供了许多宝贵的建议和技巧,对于初学者而言是非常有价值的参考资料。

  • 光储并网直流微电网Simulink仿真模型:MPPT与混合储能系统的优化设计

    内容概要:本文详细介绍了光储并网直流微电网的Simulink仿真模型构建,涵盖多个关键技术点。首先讨论了光伏系统的最大功率点跟踪(MPPT)算法,特别是扰动观察法的具体实现及其优缺点。接着探讨了由蓄电池和超级电容组成的混合储能系统,强调了它们各自的特点以及如何通过控制算法进行有效的功率分配。此外,还讲解了二阶低通滤波法的应用,用于提高电能质量和优化不同频率范围内的功率管理。最后,文章深入解析了逆变器的双闭环控制系统,包括电压环和电流环的设计,以确保逆变器输出与大电网的良好匹配。 适合人群:从事新能源系统设计、电力电子技术研究的专业人士,尤其是对Simulink仿真工具有所了解的研发人员。 使用场景及目标:适用于希望深入了解光储并网直流微电网内部机制和技术细节的研究者和工程师。主要目标是帮助读者掌握如何利用Simulink工具箱搭建完整的光储并网直流微电网仿真平台,从而为实际工程应用提供理论支持和技术指导。 其他说明:文中提供了大量具体的Matlab/Simulink代码片段,便于读者理解和实践。同时,作者分享了许多宝贵的实战经验和调试技巧,有助于解决实际建模过程中可能遇到的问题。

  • 西门子1200 PLC轴运动控制程序模板:多轴伺服、电缸控制及PLC通信实战应用

    内容概要:本文详细介绍了一套成熟的西门子1200 PLC轴运动控制程序模板,涵盖多轴伺服控制、电缸控制、PLC通信、气缸报警、电路图、威纶通触摸屏程序和IO表等方面的内容。该模板已在多个项目中成功应用,特别是在海康威视的路由器外壳装配机项目中表现优异。文中不仅提供了具体的代码示例,还分享了许多实战经验和技巧,如轴控制块的参数设置、PUT/GET通讯的心跳检测、气缸报警的互锁逻辑、电路图中的电源保护措施等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要进行PLC编程和轴运动控制的从业者。 使用场景及目标:①快速掌握西门子1200 PLC轴运动控制的编程方法;②提高PLC程序的稳定性和可靠性;③优化设备性能,确保高效生产和故障预防。 其他说明:该模板不仅适用于新项目的开发,也可以作为现有系统的改进参考。通过学习和应用这些技术和经验,可以显著提升工作效率和产品质量。

  • 智能驾驶领域基于神经网络的驾驶员风格自适应ACC系统安全距离模型研究

    内容概要:本文探讨了基于神经网络训练的不同驾驶员风格自适应ACC(自适应巡航控制)系统,尤其是其安全距离模型的研究。传统ACC系统采用固定的参数设置,难以适应不同驾驶员的驾驶习惯。文中介绍了通过神经网络训练,使ACC系统能够学习并适应不同驾驶员的驾驶风格,从而动态调整安全距离的方法。具体实现了基于LSTM和物理模型融合的混合式神经网络结构,以及定制化的损失函数,确保系统在不同驾驶风格下的安全性和舒适度。实验结果显示,该系统能够在不同驾驶风格间灵活切换,提升应对复杂路况的能力。 适合人群:对智能驾驶技术和机器学习感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于智能汽车的研发和改进,旨在提高ACC系统的智能化水平,使其更加符合不同驾驶员的习惯,提升驾驶体验和安全性。 其他说明:文章还讨论了模型的实际应用挑战,如不同地区的驾驶文化差异,并提出了相应的解决方案。

  • 计算机三级网络机试考试试题及答案(下).pdf

    计算机三级网络机试考试试题及答案(下).pdf

  • UWB DW1000高精度3D定位系统:基于CH32F103C8T6与卡尔曼滤波的实现及应用

    内容概要:本文详细介绍了基于Decawave UWB DW1000定位模块和CH32F103C8T6控制器构建的高精度3D定位系统。系统分为定位模块和测距模块,前者负责接收并计算用户位置,后者提供测距数据。定位模块采用最小二乘法和扩展卡尔曼滤波相结合的方式,实现了静态和动态环境下的高精度定位。文中还提供了详细的硬件配置、SPI接口初始化、测距算法以及定位算法的代码示例,并通过实验验证了系统的性能。 适合人群:对超宽带(UWB)定位技术和嵌入式开发感兴趣的工程师和技术爱好者。 使用场景及目标:适用于需要高精度室内外定位的应用场景,如AGV调度、人员定位等。目标是帮助开发者理解和实现基于UWB的高精度定位系统。 其他说明:文中提到的关键技术点包括SPI接口配置、双边双向测距算法(DS-TWR)、天线延迟校准、最小二乘法和扩展卡尔曼滤波。此外,作者还分享了一些实用的经验和技巧,如SPI分频系数选择、光速值的精确度、状态方程的设计等。

  • 计算机实训总结.pdf

    计算机实训总结.pdf

  • 单片机课程设计-温度监控系统的设计

    单片机课程设计__温度监控系统的设计

Global site tag (gtag.js) - Google Analytics