写点什么

懂一点 TCP 是多么的必要

  • 2015-11-25
  • 本文字数:1207 字

    阅读完需:约 4 分钟

大部分开发者可能不会直接使用 TCP 协议进行网络开发,但是在分布式系统中,无可避免的需要接触到应用层协议,或是排查网络导致的问题。因此,对于 TCP 协议,不是每个开发者都需要熟读《TCP/IP 详解》 [1] [2] [3] ,但还是建议能够了解一些 TCP 协议有关的知识。

有了一些基础知识,可以帮助我们更快的排查网络问题,例如,在《性能探索——我们如何将每个 POST 请求削减 200ms》这篇博客中,作者介绍了他们对 POST 请求延迟问题的排查,为什么每个 POST 请求会多消耗 200ms,这里摘录一些最终排查到的核心原因:

Ruby 的 Net::HTTP 库,会将 HTTP 的 POST 请求拆分成两个 TCP 数据包:POST 请求头一个数据包,请求体一个数据包。而 curl 命令却相反,它会尽可能的将请求头和请求体塞入一个数据包中。更糟糕的是,Net::HTTP 在打开 TCP 套接字的时候,没有设置 TCP_NODELAY 选项,因此该套接字会等待第一个数据包的确认包(ack)之后,才会发送第二个数据包。该行为是 Nagle 算法的结果。

到连接的另一端,HAProxy 需要选择如何应答这两个包。在版本 1.4.15(我们曾经使用的版本)中,它选择使用 TCP 延迟应答。延迟应答和 Nagle 算法相互影响,引起了请求中断,直到服务端触发了延迟应答超时。

重要通知:接下来 InfoQ 将会选择性地将部分优秀内容首发在微信公众号中,欢迎关注 InfoQ 微信公众号第一时间阅读精品内容。

这时连接双方(Ruby Net::HTTP 和 HAProxy)的数据交互是这样的:

双方都在等待对方发送数据包,应用端等待 HAProxy 发送应答包(Nagle 算法),HAProxy 在等待应用端后续的数据包(延迟应答)。这就导致了中间的 200ms 延迟。

找到问题之后,解决就非常方便,在应用端设置 TCP_NODELAY 参数或者服务端取消延迟应答(TCP_QUICKACK 参数)。另一个问题又来了,设置了这两个参数之后,对于应用和服务端有什么影响呢?

应用端套接字设置了 TCP_NODELAY 参数之后,TCP 包将不会使用缓冲区而直接发送。如果应用端会发送大量小数据,可能会遇到缓冲区刷新的瓶颈,同时可能会有大量带宽浪费在了 TCP 头上。

服务端使用了 TCP_QUICKACK,将不会合并发送应答包,同样会增加数据包数量。但是相对来说,应答包的损耗相对于延迟应答来说可能更小。

上面这个示例说明了,虽然大部分情况下,开发者不需要了解 TCP 协议,但是如果遇到了诸如延迟应答 /TCP_NODELAY 的问题,了解一些 TCP 协议相关知识是非常有用的。如今,分布式计算、分布式存储、微服务等架构的兴起,越来越多的系统需要和外部系统交互,其中大部分最终是基于 TCP 协议,没事了解一些 TCP 协议,在遇到性能调优、问题诊断时,可能会有意想不到的收获。


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-11-25 18:007662

评论

发布
暂无评论
发现更多内容

荣耀开发者沙龙 · 北京站 活动精彩回顾

荣耀开发者服务平台

开发者 互联网技术 互联网生态 安卓 ios honor

数仓资源管控理论已掌握,是时候实战了

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号9月PK榜

时尚行业的前沿与挑战

百度开发者中心

人工智能 ChatGPT 生成式AI 文心一言

业务不想停机,就得这么实现MongoDB迁移

NineData

mongodb 数据迁移 NineData MongoDB迁移 全量数据迁移

腾讯专有云TCE高分通过信通院“一云多芯”标准测试

极客天地

龙智携手Atlassian和JFrog举办线下研讨会,探讨如何提升企业级开发效率与质量

龙智—DevSecOps解决方案

Atlassian JFrog

聚焦用户隐私安全,华为助力APP开发者守护个人信息安全

最新动态

夏天不开车?沃尔沃XC40纯电版为你带来清凉与健康

新消费日报

影响LED显示屏价格的因素

Dylan

软件 硬件 价格 LED显示屏 led显示屏厂家

入坑ThreadLocal,这一篇文章就够了

树上有只程序猿

Java ThreadLocal

细数2019-2023年CWE TOP 25 数据,看软件缺陷的防护

华为云开发者联盟

安全 后端 华为云 华为云开发者联盟 企业号9月PK榜

重新定义内容创作和教育的新范式

百度开发者中心

人工智能 文心一言 文心大模型‘

D&R IP-SoC China 2023 Day演讲预告 | 龙智Perforce专家解析芯片开发中的数字资产管理

龙智—DevSecOps解决方案

芯片 半导体

AI应用如何进行测试?

互联网工科生

人工智能 AI

ClickHouse在腾讯游戏营销效果分析中的探索实践

腾讯云大数据

Clickhouse

开箱即用!3个视频教你玩转华为云CodeArts Board!

云计算 软件开发 华为云

公众期待开放的自然语言处理神器

百度开发者中心

人工智能 ChatGPT 文心一言

文心一言 VS 讯飞星火 VS chatgpt (86)-- 算法导论8.2 3题

福大大架构师每日一题

福大大架构师每日一题

做等保测评的公司有多少家?哪里可以查到?

行云管家

网络安全 等级保护 等保测评 等保测评机构 行云堡垒

如何避免财务共享流程设计不够落地导致实施初期重新设计的问题

用友BIP

智能财务 财务共享

你应该知道的几个大数据平台相关术语

行云管家

数据中台 数据安全 大数据平台

引领未来,挑战与机遇并存

百度开发者中心

人工智能 图像识别 文心大模型

OpenHarmony使用ArkUI Inspector分析布局

OpenHarmony开发者

OpenHarmony

开发指导—利用CSS动画实现HarmonyOS动效(二)

HarmonyOS开发者

HarmonyOS

NFTScan | 08.28~09.03 NFT 市场热点汇总

NFT Research

NFT\

懂一点TCP是多么的必要_DevOps & 平台工程_金灵杰_InfoQ精选文章