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:007609

评论

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

墨天轮国产数据库沙龙 | 四维纵横姚延栋 :MatrixDB,All-in-One高性能时序数据库

墨天轮

数据库 时序数据库 国产数据库 MatrixDB

做开发这么久了,还不会搭建服务器Maven私有仓库?这也太Low了吧

冰河

系统架构 程序开发 程序员进阶 编程基础 Maven仓库

Web安全渗透测试基本流程

学神来啦

网络安全 Web 渗透测试 WEB安全 kali

云原生中间件 -- Redis Operator 篇

Daocloud 道客

redis 云原生 中间件 云原生中间件

Docker Shim 被移除,K8s v1.24 升级该怎么办

Daocloud 道客

Docker Kubernetes CRI-Dockerd

详细解读PolarDB HTAP的功能特性和关键技术

阿里云数据库开源

数据库 阿里云 开源 postgre polarDB

一种小程序弱网离线优化的思路

阿里巴巴终端技术

小程序 弱网 体验优化

阿里云移动研发平台EMAS:2月产品动态

移动研发平台EMAS

阿里云 程序员 emas 移动端 研发工具

深入跨国互联网业务场景,看华为云数智融合元数据如何打破“数据墙”

华为云开发者联盟

大数据 数据仓库 华为云 元数据 数智融合

TypeScript 2.0开启空值的严格检查

华为云开发者联盟

typescript js 空指针 ts

坐标PCB公司,想做实时数仓、推生产线看板,和Tapdata Cloud的偶遇来得就是这么凑巧

tapdata

实时数据

由Figma封停大疆,看国产IDE如何应对与突围?

Baihai IDP

人工智能 ide AI 基础软件 国产化

iuap助力三花控股集团打造主数据管理平台

用友BIP

用友 用友iuap

技术平台&应用开发专题月 | 业务上云后的调试利器—云机一体

用友BIP

用友 用友iuap

技术平台&应用开发专题月 | 企业上云利器-YMS(Yon Middleware Service)

用友BIP

用友 用友iuap

阿里IM技术分享(七):闲鱼IM的在线、离线聊天数据同步机制优化实践

JackJiang

即时通讯 IM im开发

拥抱云原生 2.0 时代,Tapdata 入选阿里云首期云原生加速器!

tapdata

数据库 实时数据服务平台

WMS是什么?

源字节1号

开源 后端开发

java编程技术FastDFS 安装和配置

编程江湖

技术平台&应用开发专题月 | 如何保证业务服务稳定运行—用友云原生技术平台高可用能力介绍

用友BIP

用友 用友iuap

这是我见过最详细的Nginx 内存池分析

Linux服务器开发

nginx 线程池 Linux服务器开发 Linux后台开发 内存池

龙蜥开发者说来了,来看看社区一周动态还有什么? | 3.07-3.11

OpenAnolis小助手

开源 开发者 龙蜥社区 一周动态

OpenHarmony移植:XTS子系统之应用兼容性测试套件

华为云开发者联盟

OpenHarmony 移植 XTS子系统 acts 测试套件

Figma禁封中国企业,下一个会是Postman吗?国产软件势在必行

Liam

后端 Postman Apifox API swagger

Java有了synchronized,为什么还要提供Lock

华为云开发者联盟

Java synchronized 死锁 lock 同步代码块

推荐算法!基于隐语义模型的协同过滤推荐之商品相似度矩阵

编程江湖

大数据 算法

译文《Java并发编程之CAS》

潘大壮

乐观锁 并发编程 CAS 并发’ Java Concurrency

基于 EventBridge 构建 SaaS 应用集成方案

阿里巴巴云原生

云原生 SaaS

新一代对抗作战框架MITRE Engage V1版本正式发布

青藤云安全

网络安全 青藤 青藤云安全

为什么MySQL主键查询这么快?

蝉沐风

MySQL 索引 主键查询

在线JSON格式化美化

入门小站

工具

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