写点什么

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

评论

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

深入理解vue2.x双向数据绑定原理

不叫猫先生

Vue vue响应式 三周年连更

产品质量管理利器,华为云发布CodeArts Defect缺陷管理服务

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

华为阅读联手20余家头部内容平台,共建数字化阅读

最新动态

《详谈·张勇》

石云升

读书笔记 三周年连更

【直播回顾】3月银行APP用户体验评测+中国金融业财富管理AI应用分析

易观分析

金融 银行

Bitmap引起的OOM问题

芯动大师

App 三周年连更 Out Of Memory

基于STM32+华为云设计的智慧烟感系统

DS小龙哥

三周年连更

程序员失业:现实还是幻想?| 社区征文

断墨寻径

人工智能 三周年征文

探秘!第四代北斗芯片

江湖老铁

2023移动端技术探索

轻口味

android 移动端 行业趋势 三周年连更

iOS MachineLearning 系列(9)—— 人物蒙版图生成

珲少

Java 中的 null 到底是什么?

Java架构历程

Java 三周年连更

《一文带你读懂:云原生时代业务监控》

后台技术汇

三周年连更

大数据集群的部署实例

TiAmo

大数据 集群 三周年连更 开发实例

多维评测指标解读2022MSU世界编码器大赛结果

阿里云CloudImagine

云计算 编码 编码器 视频云 MSU

一键生成rpc网关服务项目代码,让你轻松实现跨语言、跨平台的服务调用

vison

微服务 Go 语言 gin 代码自动生成 rpc gateway

什么是软件开发领域的 disruptive innovation

汪子熙

软件工程 软件开发 三周年连更

Spring Boot之根据数据库连接信息指定分页查询表结构信息

bug菌

Spring Boot 2 spring-boot 三周年连更

【Linux】之Jumpserver堡垒机的部署_搭建

A-刘晨阳

Linux 跳板机 三周年连更

2023 年要避免的 17 个致命的网站设计错误

海拥(haiyong.site)

三周年连更

挑战 30 天学完 Python:Day13 列表推导式和Lambda

MegaQi

挑战30天学完Python 三周年连更

Go的内存模型:如何保证并发读写的顺序性?

Jack

Selenium操作已经打开的浏览器

IT蜗壳-Tango

三周年连更

从软件哲学角度谈 Amazon SageMaker

亚马逊云科技 (Amazon Web Services)

Amazon SageMaker

Git 速查表:初学者必备的 12 个 Git 命令

Se7en

【Python实战】Python采集图书信息

BROKEN

三周年连更

Qz学算法-数据结构篇(非线性结构、树)

浅辄

数据结构 三周年连更

ChatGPT-4!又双叒叕写了一本量化交易的书(附下载)

量化投资与机器学习

机器学习 量化投资 ChatGPT4 对冲基金 Quant

如何在 Linux 中查看正在运行的进程?这三个命令轻松实现!

wljslmz

Linux 三周年连更

干货|SpringBoot JMS(ActiveMQ)API实践应用详解

浅羽技术

Apache 中间件 ​ActiveMQ 消息列队 三周年连更

sdn网络

乌龟哥哥

三周年连更

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