写点什么

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

评论

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

知识图谱与古希腊人物关系

数新网络官方账号

知识图谱

NGINX 开源社区捉虫征集令

NGINX开源社区

打造五层轻量监控体系

穿过生命散发芬芳

监控体系 12月月更

BSN-DDC基础网络DDC SDK详细设计(八):示例

BSN研习社

BSN-DDC

LinkedIn创始人对话 OpenAI CEO :创业公司的机会—价值中间层

B Impact

网络安全之反序列化漏洞分析

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

《媒体大数据分类分级指南》团体标准正式发布,易观分析参与编制

易观分析

大数据 媒体

SeaweedFS 高可用方案最佳实践

冰心的小屋

分布式文件系统 SeaweedFS

【零代码】6步轻松完成 Kafka 实时数据接入 MatrixDB

YMatrix 超融合数据库

json kafka 零代码 超融合数据库 YMatrix

以Amazon Braket SDK和QuTrunk为例介绍量子编程框架

启科量子开发者官方号

量子计算

有奖征文 | 当我们谈操作系统时,我们在谈什么?

腾源会

开源 操作系统 opencloudOS

设计原则 — S 单一职责原则

Lemoon Can

面向对象设计原则 设计原则

Verilog 数据类型

智趣匠

Verilog Verilog数据类型 Verilog语法

如何打造用户“上瘾”的产品?

产品海豚湾

产品经理 用户体验 产品运营 用户思维 12月月更

AWS AMAZON BRAKET与量子计算

启科量子开发者官方号

Spark RDD分区数与分区器源码解析

数新网络官方账号

spark

2022年双碳背景下汽车行业发展洞察

易观分析

汽车 双碳

FLStudio21水果体验版更新下载及功能介绍

茶色酒

flstudio FLStudio21

Renderbus瑞云渲染正式支持UE云渲染!离线渲染+实时渲染=渲染起飞!

Renderbus瑞云渲染农场

UE5 Renderbus瑞云渲染 3D制作软件

高效!启科量子线路模拟器QuSprout与AWS HPC集成,赋能量子计算

启科量子开发者官方号

量子计算

建立数据地图,让数据资产“活”起来

数造万象

架构实战 模块一:作业

Geek_6c89ef

一块钱能做什么?

白洞计划

读者回信:为什么畅捷通可能会迎来戴维斯双杀?

B Impact

金融行业业财融合实践:5A全面预算管理,赋能金融企业高质量发展

B Impact

谁能通俗的解释下,什么是云服务器?

Finovy Cloud

服务器 云服务器 云渲染 云渲染农场

Spring AOP在项目中的典型应用场景

江南一点雨

Java spring aop springboot

ArkUI开发趣味体验,快来抽取限量HarmonyOS专属头像!

HarmonyOS开发者

HarmonyOS

精准管控 | AIRIOT数字油库智能化解决方案

AIRIOT

物联网 数字油库

数据治理:数据访问也需要治理!

用友BIP

行话|入局「软件定义汽车」,你真的准备好了吗?

极狐GitLab

DevOps 汽车软件安全 软件定义汽车 极狐GitLab 汽车软件开发

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