如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

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

评论

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

Gitea Enterprise 23.8.0 发布 - 本地部署的企业级 Git 服务

sysin

Gitea

CodeBuddy编程神器上线!分享测评100%领福利,开发者专享通道

CodeBuddy

人工智能 编程

通义灵码编程智能体,上线!

阿里巴巴云原生

通义灵码

稳居第一!博睿数据持续领跑中国APMO应用性能监控与可观测性市场!

博睿数据

AI Agent工作流解析:软件测试开发领域的实践

测试人

人工智能

鸿蒙跨端实践-揭秘视图渲染流程

京东科技开发者

抖音视频列表API接口(附代码示例)

tbapi

抖音API 抖音视频列表接口 抖音视频接口

AI Agent 十问十答,降低认知摩擦

阿里巴巴云原生

阿里云 云原生

如何使用 websocket 完成 socks5 网络穿透

八苦-瞿昙

【客户案例】多层级计划 商品智能组货提升Jimmy Jazz正价销售

第七在线

剑指大规模 AI 可观测,阿里云 Prometheus 2.0 应运而生

阿里巴巴云原生

阿里云 云原生 Prometheus

AI对话魔法|Prompt Engineering 探索指南

京东科技开发者

区块链ETF系统的功能分解

北京木奇移动技术有限公司

区块链技术 软件外包公司 区块链ETF

三星Galaxy S25系列:极简美学×AI旗舰,重塑未来智能体验

新消费日报

AI智上 | 数智司库:某能源央企集团智慧司库建设领先实践

用友智能财务

信息化 用友 财务 数智化 司库

深度解析用户意图,让设备真正听懂需求

HarmonyOS SDK

harmoyos

京东零售联合易观发布《数智驱动营销升级,寻求确定性增长》白皮书

易观分析

数智化转型 数智驱动 京东零售

通义灵码编程智能体,上线!

阿里云云效

阿里云 云原生 通义灵码

MCP 教程:将 Figma 设计稿转化为前端代码

TRAE.ai

人工智能 编程 开发者 MCP Trae

数造科技携DataBuilder亮相安徽科交会,展现“DataOps +AI”双引擎魅力

数造万象

大数据 AI 行业资讯 Data 科技

一秒采集4万条数据,卷烟厂是如何实现实时决策的?

TDengine

数据库 tdengine 时序数据库

区块链ETF系统的优化

北京木奇移动技术有限公司

区块链技术 软件外包公司 区块链ETF

想提升SEO爬虫效率?一套完整SERP抓取解决方案给你!

kookeey代理严选

动态代理 SEO工具 关键词搜索 SEO 优化

云MES系统源码,支持 SaaS 多租户,支持二次开发

万界星空科技

开源 mes 开源mes mes源码 万界星空科技mes

Invicti v25.5.0 发布,新增功能简介

sysin

invicti

区块链RWA系统的功能分析

北京木奇移动技术有限公司

区块链技术 软件外包公司 RWA开发

AI大模型快速生成题库-助力业务人效提升10+倍

京东科技开发者

区块链RWA系统的运营

北京木奇移动技术有限公司

区块链技术 软件外包公司 RWA系统开发

抖音商品详情API接口(附代码示例)

tbapi

抖音API 抖音数据采集 抖音商品详情接口 抖音商品sku接口

从0到1带你搞定“微信广告转化归因”

Chris Zhang

归因分析 微信广告 广告归因

当 CEO 患上了 AI 焦虑症(之三):指标平台的逆袭?

Aloudata

数据分析 大模型 指标平台 noetl ChatBI

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