2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

懂一点 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:007637

评论

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

前沿成果 | 澳鹏Appen团队两篇研究论文被国际顶会收录

澳鹏Appen

人工智能 机器学习 计算机视觉 nlp 数据标注

容器化,让数据库如虎添翼

沃趣科技

MySQL 数据库 云原生 容器化

软件测试/测试开发丨玩游戏为什么会卡顿?

测试人

软件测试 游戏 自动化测试 卡顿 测试开发

开心档之MySQL WHERE 子句

对话阿里云致凡:社会视频化“狂飙”,倒逼视频云技术加速迭代

云布道师

平头哥

🎊这个 OpenTiny 开源项目的 CLI 可太牛了,两行命令创建一个美观大气的 Vue Admin 后台管理系统,有手就会,连我的设计师朋友都学会啦啦

Kagol

Vue3 cli 后台管理系统 vue admin

再立灯塔,我们为什么仍然期待魅族?

脑极体

魅族

数据库原理及MySQL应用 | 程序流程控制

TiAmo

数据库 sql

神奇,前端不用redis也能实现消息队列——indexedDB

吴脑的键客

前端 js indexedDB

产品思维:微信是如何一步步打磨出完美产品的

石云升

读书感悟 产品思维

华为云开源项目OpenTiny的TinyNG组件库应该如何使用?

英勇无比的消炎药

开源 前端 OpenTiny UI组件库

CNStack 服务网格:构建统一的服务治理和零信任安全能力

阿里巴巴云原生

阿里云 云原生 CNStack

使用 LifseaOS 体验 ACK 千节点分钟级扩容

阿里巴巴云原生

阿里云 云原生 ACK

再获权威认可!MIAOYUN入选中国信通院2022年度《云原生产品目录》

MIAOYUN

云计算 容器 云原生 容器云 容器云平台

Django笔记二之连接数据库、执行migrate数据结构更改操作

Hunter熊

Python django

精彩抢先看!OceanBase在「数据技术嘉年华 2023」现场等你

OceanBase 数据库

数据库 oceanbase

哪里有免费大文件传输平台?通过这4个网站免费来进行大文件传输

镭速

龙蜥开发者说:历时三周,记录如何从 0 到 1 构建龙蜥衍生版 | 第 18 期

OpenAnolis小助手

开源 操作系统 龙蜥社区 浪潮信息 衍生版

大数据公司如何结合AI技术

MobTech袤博科技

如何让ChatGPT充当细致入微的Java代码优化工? | 得物技术

得物技术

ChatGPT

“成年人”的数据库,既要又要也要!

OceanBase 数据库

数据库 oceanbase

Salesforce遇挑战:Marc Benioff的管理、代码老化、Slack后遗症

B Impact

用户画像设计:揭秘成功产品背后的关键环节

L3C老司机

产品设计 数字化转型 产品管理 用户画像 用户画像分析

【特别策划】2022年银行年报金融科技系列专题(一)

易观分析

金融科技 金融 银行

触手可及的 GPT —— LLaMA

Zilliz

Towhee ChatGPT LLM llama

BroadcastReceiver牛刀小试

芯动大师

广播 broadcast broadcastreceiver

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