写点什么

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

评论

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

架构师训练营 -week07-作业

大刘

极客大学架构师训练营

干货 | 京东技术中台的Flutter实践之路

京东科技开发者

flutter

GitHub上超牛的Java进阶教程,汇总Java生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识

Java架构之路

Java 程序员 架构 面试 编程语言

6年Java开发经验,蚂蚁金服面试3+2次,最终有惊无险通过!(已拿offer)

Java架构之路

Java 程序员 架构 面试 编程语言

GrowingIO 响应式编程探索和实践

GrowingIO技术专栏

响应式编程

这可能是关于编程指南的最实用指南了

华为云开发者联盟

开发者 软件开发 语言

应用层软件开发教父教你如何重构,资深程序员必备专业技能

小Q

Java 学习 架构 面试 重构

从技术到应用实践 揭秘京东区块链布局全景

京东科技开发者

区块链 区块链方案 供应链

谈谈敏捷开发概念和迭代开发方案

Philips

敏捷开发 快速开发

《高效程序员的45个习惯:敏捷开发修炼之道》.pdf

田维常

电子书

解决大中型浏览器(Chrome)插件开发痛点:自定义热更新方案——1.原理分析及构建部署实现

梁龙先森

Java chrome 大前端 浏览器 技术方案

架构师训练营 第三周作业(手写单例模式)

springH₂O

架构训练营

低代码开发不靠谱?看低代码开发在物联网APP开发中的应用

华为云开发者联盟

技术 软件开发 代码

HTTP2协议及websocket协议总结

江龙

力扣解题:第三题(个人思路整理)

人语驿边桥

力扣

阿里P8大牛精心整理,GitHub上超火的《Java工程师成神之路》从基础,到高级、底层、架构、进阶、扩展,囊括了Java体系内的所有知识点。

Java架构之路

Java 程序员 架构 面试 编程语言

LeetCode题解:231. 2的幂,迭代,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

屏读时代,我们患上了注意力缺失候群症

脑极体

一周信创舆情观察(10.26~11.1)

统小信uos

1分钟带你解锁Angular

Leo

学习 大前端 angular

华为发布5GtoB核心网建设白皮书

华为云开发者联盟

5G 边缘技术

“软件教父”花费20年,教你如何在应用层混迹的风生水起

小Q

Java 学习 架构 面试 应用

快快使用ModelArts,零基础小白也能玩转AI!

华为云开发者联盟

人工智能 开发者 开发

TCP梳理总结

江龙

【得物技术】数据分析 - 生活品类社区内容精选池模型

得物技术

数据分析 得物技术部 得物技术 社区内容 精选池模型

架构师训练营第三周课后作业

天涯若海

啥是数据库范式

Simon

MySQL 数据库 数据库设计

MySQL中特别实用的几种SQL语句送给大家

陈哈哈

SQL优化 实用SQl语句 高性能SQL

LeetCode题解:231. 2的幂,递归,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

一道比较运算符相关的面试题把我虐的体无完肤

Gopher指北

从广西的新基建耕种,读懂一颗名为智能体的种子

脑极体

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