HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

评论

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

硬核!阿里大佬都在内卷的SpringBoot从入门到实战笔记

Java你猿哥

Java Spring Boot ssm 实战 Spring全家桶

互联网工程师1000道Java面试题整理全集,助你一路绿灯

Java你猿哥

Java 面试 SSM框架 八股文 Java八股文

PyTorch 深度学习实战 | 基于YOLO V3的安全帽佩戴检测

TiAmo

数据采集 PyTorch

3D视觉特效剪辑合成: Flame 2023 激活版

真大的脸盆

Mac Mac 软件 视频特效合成 视频特效工具

面试造飞机?GitHub顶级“java面试手册2023”(统计通过率95%)

三十而立

Java GitHub 面试 java面试

TGO笔记-AIGC分享之投资视角(61/100)

hackstoic

AI ChatGPT 创业投资

腾讯架构师手撸这份标星过万的"计算机网络协议笔记"全网爆火

Java你猿哥

架构 网络安全 ssm 架构师 分布式架构

百度“文心一言”发布两天12家企业签约,申请测试企业破9万

科技热闻

树状数组模板与练习

timerring

算法

霸榜牛客!阿里P8大牛整理的Java面试核心知识点竟如此霸道

Java你猿哥

Java 面试 ssm 面经 java核心知识

《C++编程规范-101条规则 准则与最佳实践》读书笔记

老王同学

c++ 读书笔记

浅析三款大规模分布式文件系统架构设计

Java你猿哥

架构 分布式 架构设计 分布式架构 系统架构设计手册

三天吃透Spring Cloud面试八股文

程序员大彬

Java 面试 SpringCloud

战损版JavaAgent方法耗时统计工具实现

Java你猿哥

Java Spring Boot Java Agent ssm

SpringBoot 集成 Druid 数据源

Java你猿哥

Java Spring Boot 后端 ssm Druid

Photoshop 2023 (版本 24.2)的新增功能和增强功能

互联网搬砖工作者

手把手教你Mac重装系统不再难:苹果电脑重装系统教程

互联网搬砖工作者

如何学习分布式系统,分布式是什么,这里有很好的解释,很全

三十而立

Java 分布式

这六种目前最常见分布式事务解决方案!请拿走不谢

三十而立

Java 程序员 分布式 IT

爆火!阿里新版23年面试突击进阶手册,Github标星51k!

Java你猿哥

Java 面试 ssm 面经 八股文

马士兵教育2023年全新Java架构师学习路线「首发版」

Java你猿哥

Java 学习 架构 面试 后端

DUIN开源的镜像更新通知工具

mengzyou

container DevOps image

SpringBoot启动之准备系统环境environmentPrepared

石臻臻的杂货铺

spring springboot

Jetpack-Compose 学习笔记(二)—— Compose 布局你学会了么?

修之竹

android 前端 android jetpack

简单的文件同步工具:SyncTime激活版

真大的脸盆

Mac Mac 软件 同步文件工具 同步工具

强大的ai技术图像编辑器:Luminar Neo 激活版

真大的脸盆

图像编辑 编辑图像 图像处理工具

如何重装mac系统,u盘安装苹果macos系统教程

互联网搬砖工作者

凭借这份阿里2023版Java架构师面试指南,我一周时间斩获了5个Offer!

Java永远的神

程序员 程序人生 后端 架构师 java面试

2023金三银四Java高级工程师面试 1000 题+答案(全)

架构师之道

编程 程序员 java面试

SpringBoot 实现 MySQL 百万级数据量导出并避免 OOM 的解决方案

Java你猿哥

Java MySQL spring Spring Boot ssm

Golden Gate 发布项目白皮书,测试网络即将上线

股市老人

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