当前位置: 首页 > news >正文

TCP 缓存与 Nagle 算法

TCP 缓存与 Nagle 算法

TCP 缓存与 Nagle 算法 笔记


一、TCP 缓存机制

1. 核心概念

系统为每个 TCP socket 维护两块缓冲区:

  • 发送缓冲区:应用进程调用 send()/write() 时,数据会先被拷贝到内核的发送缓冲区,而非直接发送到网络。
  • 接收缓冲区:应用进程调用 recv()/read() 时,数据从内核的接收缓冲区拷贝到用户进程。

2. 工作流程

  • 发送端:应用进程 → 发送缓冲区 → 网络 → 接收缓冲区 → 接收端应用进程
  • 关键:发送数据的本质是“写入发送缓冲区”,接收数据的本质是“读取接收缓冲区”。

3. 关键问题解析

  1. send() 函数会阻塞吗?
    • 当发送缓冲区已满,且对端的接收缓冲区也已满时,send() 会阻塞,直到缓冲区有空间或连接断开。
  2. 写入数据后关闭 socket,对端还能收到数据吗?
    • 可以。关闭 socket 时,内核会确保发送缓冲区中的数据全部发送并确认后,才会断开连接。

4. 查看 socket 缓存大小

#include <sys/socket.h>
#include <iostream>
using namespace std;int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);int bufsize = 0;socklen_t optlen = sizeof(bufsize);// 获取发送缓冲区大小getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &bufsize, &optlen);cout << "send bufsize = " << bufsize << endl;// 获取接收缓冲区大小getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &bufsize, &optlen);cout << "recv bufsize = " << bufsize << endl;close(sockfd);return 0;
}

二、Nagle 算法

1. 设计目的

TCP 协议为了减少网络中小数据包的数量,提升带宽利用率,引入了 Nagle 算法。它的核心目标是:尽量发送大块数据,避免网络中充斥大量小数据包

2. 算法定义

任意时刻,最多只能有一个未被确认的小段(小段指小于 MSS 的数据块)。也就是说:

  • 当有一个小数据块已发送但未收到 ACK 时,后续的小数据块会被暂存,直到收到 ACK 或数据累积到 MSS 大小后再发送。

3. 典型延迟场景(Nagle + ACK 延迟)

  • Nagle 算法:发送端必须等待上一个包的 ACK 才能发送下一个小包。
  • ACK 延迟机制:接收端收到数据后,会延迟约 40ms 再回复 ACK,希望能捎带在后续数据中一起发送。
  • 问题:两者叠加时,小包的发送会延迟约 40ms,对实时性要求高的场景(如游戏、即时通讯)影响极大。

4. 禁用 Nagle 算法

在对延迟敏感的场景中,可通过设置 TCP_NODELAY 选项禁用 Nagle 算法:

#include <netinet/tcp.h>  // 必须包含此头文件
#include <sys/socket.h>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);int opt = 1;// 禁用 Nagle 算法setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));// 后续 bind/connect/listen/accept...return 0;
}

三、核心对比与应用场景

场景 是否启用 Nagle 算法 原因
文件传输、批量数据 启用 减少小包数量,提升带宽利用率
联机游戏、即时通讯 禁用(TCP_NODELAY 避免 40ms 延迟,保证实时性

四、关键代码速记

1. 获取 socket 缓冲区大小

int bufsize = 0;
socklen_t optlen = sizeof(bufsize);
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &bufsize, &optlen);
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &bufsize, &optlen);

2. 禁用 Nagle 算法

int opt = 1;
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
http://www.jsqmd.com/news/834884/

相关文章:

  • F405飞控使用R-XSR接收机,F.Port 踩坑记
  • 2026年重庆沙发翻新优选|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌全解析:服务内容、覆盖区域与联系方式 - 卓信营销
  • 面向对象程序设计作业集1-3总结
  • 2026年九华山好吃徽菜馆推荐:九华山必吃美食、农家土菜、实惠餐饮选择指南 - 海棠依旧大
  • 基于STM32的音频播放系统,实现SD卡读取音频文件PWM输出播放
  • 鸿岳天车龙门吊设备有限公司:深耕起重设备服务,覆盖全国一二三线城市 - 卓信营销
  • 鸿岳天车龙门吊设备有限公司的市场竞争力如何? - 卓信营销
  • 2026年家装仿石漆服务商哪家好:合格服务商选型标准与主流实力解析 - 产业观察网
  • 成都市场华岐钢管镀锌钢管|2026年5月(上、中、下旬)出厂价格及政策|盛世钢联订货指导价 - 四川盛世钢联营销中心
  • 2026年5月宝珀官方售后网点避坑指南:实地走访与第三方佐证(含迁址/新开) - 亨得利官方服务中心
  • 2026年5月万国官方售后网点避坑指南(含真实体验与踩坑实录)——实地考察多方验证 - 亨得利官方服务中心
  • 2026年衢州黄金回收店靠谱推荐:四家主流机构分析 这样选更安心 - 天天生活分享日志
  • 2026厂家直供更划算广州晶石石英传感器,品质靠谱售后有保障 - 品牌速递
  • 威拓重型机械有限公司:深耕起重设备服务,覆盖全国一二三线城市 - 卓信营销
  • 2026年4月优质的沐浴露灌装机供应商推荐,润滑油灌装机/全自动灌装机/灌装机/洗衣液灌装机,沐浴露灌装机供应商推荐 - 品牌推荐师
  • 支付宝立减金回收靠谱平台推荐,闲置权益变现避坑指南 - 京顺回收
  • 南充卖黄金不用出门!正规同城上门回收,价格公道办事靠谱不玩套路 - 金掌柜黄金回收
  • 2026年金华黄金回收店靠谱推荐:四家主流机构分析 这样选更安心 - 生活测评君
  • 2026年家装仿石漆服务商选型指南:主流品牌实力分析与场景适配推荐 - 产业观察网
  • 雨和虹防水维修:武汉复地东湖国际卫生间瓷砖空鼓翘边维修真实案例|免砸砖微创修复全过程 - 雨和虹防水维修
  • 2026年知网降AI保姆级教程,亲测高效必收藏! - 降AI实验室
  • Palantir Ontology 数据结构分析,与ER/OOP/DDD有什么区别?
  • 成都市场津西集团热轧H型钢|2026年5月(上、中、下旬)出厂价格及政策|盛世钢联订货指导价 - 四川盛世钢联营销中心
  • 成都沙发翻新避坑必看:御匠沙发翻新、匠阁沙发翻新、锦修沙发翻新三大品牌电话、服务内容与覆盖区域全解析 - 卓信营销
  • 合并果子
  • 快速记忆网络分层模型口诀
  • 在AWS云上使用EC2 嵌套虚拟化实例部署Cube Sandbox的实践和问题
  • 这届毕业论文,先得让AI满意,应届生都在悄悄用它写论文、降重... - AI论文先行者
  • 2026年杭州沙发翻新厂家精选|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌实力对比、服务内容、覆盖区域与联系方式全解析 - 卓信营销
  • 【AI工具推荐】宝藏级!国内平台19款免费AI工具,教师人工智能素养提升必备工具! - AI论文先行者