当前位置: 首页 > 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.rkmt.cn/news/1305195.html

相关文章:

  • 成都市场正大钢管镀锌钢管|2026年5月(上、中、下旬)出厂价格及政策|盛世钢联订货指导价 - 四川盛世钢联营销中心
  • 2026年5月宝珀官方售后网点避坑指南:实地走访与第三方佐证(含迁址/新开) - 亨得利官方服务中心
  • 威拓重型机械有限公司:深耕起重设备服务,覆盖全国一二三线城市 - 卓信营销
  • 2026年4月优质的沐浴露灌装机供应商推荐,润滑油灌装机/全自动灌装机/灌装机/洗衣液灌装机,沐浴露灌装机供应商推荐 - 品牌推荐师
  • 2026年知网降AI保姆级教程,亲测高效必收藏! - 降AI实验室
  • 这届毕业论文,先得让AI满意,应届生都在悄悄用它写论文、降重... - AI论文先行者
  • 2026年杭州沙发翻新厂家精选|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌实力对比、服务内容、覆盖区域与联系方式全解析 - 卓信营销
  • KDE Linux QQ 微信不能使用中文输入法
  • DolphinDB开发者评测:用多范式编程重新定义时序数据分析
  • 2026年武汉沙发翻新精选|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌全解析:服务内容、覆盖区域与联系方式 - 卓信营销
  • 雨和虹防水维修:杭州绿城蓝色钱江卫生间漏水维修真实案例|精装房免砸砖根治渗水发霉 - 雨和虹防水维修
  • 76.沧州报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 成都市场安泰集团热轧H型钢|2026年5月(上、中、下旬)出厂价格及政策|盛世钢联订货指导价 - 四川盛世钢联营销中心
  • 通知:知网维普更新AI检测算法,“易笔AI”已适配升级!这里免费体验,可降重降AI! - AI论文先行者
  • 绵阳上门黄金回收|免费上门高价结算无套路,涪城 / 游仙 / 安州 / 江油 / 三台全域可上门 - 金掌柜黄金回收
  • 自贡卖黄金不用出门!正规同城上门回收,价格公道办事靠谱不玩套路 - 金掌柜黄金回收
  • 26年5月最新北京朝阳门青少年配镜机构排行 实测专业度对比 - 奔跑123
  • 全行业标书制作通用指南:80%的废标都源于这6个低级错误 - 安华招标
  • 广州沙发翻新避坑必看:御匠沙发翻新、匠阁沙发翻新、锦修沙发翻新三大品牌电话、服务内容与覆盖区域全解析 - 卓信营销
  • 78.九江报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 89.株洲报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 成都市场攀钢集团热轧开平板|2026年5月(上、中、下旬)出厂价格及政策|盛世钢联订货指导价 - 四川盛世钢联营销中心
  • 77.宿迁报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 专业的盘州台球室哪家好 - GrowthUME
  • 开发工作流
  • 成都市场重钢集团热轧开平板|2026年5月(上、中、下旬)出厂价格及政策|盛世钢联订货指导价 - 四川盛世钢联营销中心
  • 康棒家是什么平台? - GrowthUME
  • 合肥家庭教育指导师报名入口怎么找?正规机构选择与口碑推荐指南 - 优选机构推荐
  • Web 服务器发现网页被篡改如何快速定位被入侵的文件路径?
  • Claude Code 和 Codex 哪个好用?2026 年深度对比