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

Nagle算法

Nagle算法简介

Nagle算法主要是避免发送小的数据包,要求TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他的小分组。

在默认的情况下,Nagle算法是默认开启的,Nagle算法比较适用于发送方发送大批量的小数据,并且接收方作出及时回应的场合,这样可以降低包的传输个数。

但是如果你的程序是 write-write-read 模式,在使用了Nagle算法后,第二个 write 就会被推后一个RRT发送而造成一个很长的ack等待,从而产生一个延迟。为了避免这种情况,一般建议在应用层做缓冲,将两个write合在一起,成为 write-read

代码分析

我们通过一个例子观察下Nagle算法的延迟

  • 服务器端代码:recipes/tpc/nodelay_server.cc
  • 客户端代码:recipes/tpc/nodelay.cc

客户端代码

// ...... 仅展示出部分代码if (tcpnodelay){// 设置tcp TCP_NODELAYstream->setTcpNoDelay(true);printf("connected, set TCP_NODELAY\n");}else{stream->setTcpNoDelay(false);printf("connected\n");}for (int n = 0; n < num; ++n){printf("Request no. %d, sending %d bytes\n", n, len);if (buffering){std::vector<char> message(len + sizeof len, 'S');memcpy(message.data(), &len, sizeof len);int nw = stream->sendAll(message.data(), message.size());printf("%.6f sent %d bytes\n", now(), nw);}else{// 先发送头 在发送数据 验证Nagel算法stream->sendAll(&len, sizeof len);printf("%.6f sent header\n", now());usleep(1000); // prevent kernel merging TCP segmentsstd::string payload(len, 'S');int nw = stream->sendAll(payload.data(), payload.size());printf("%.6f sent %d bytes\n", now(), nw);}}

上面可以看出,正常下我们开启Nagel,并发送header和data两个数据包,我们还可以合并header和data,将其合成一个包发送,此外,我们还可以设置TCP_NODELAY选项。

测试

环境:两台桥联的虚拟机
我们使用ping命令测试一下两台机器正常情况下的延迟

wang@localhost tpc]$ ping 192.168.1.104
PING 192.168.1.104 (192.168.1.104) 56(84) bytes of data.
64 bytes from 192.168.1.104: icmp_seq=1 ttl=64 time=4.30 ms
64 bytes from 192.168.1.104: icmp_seq=2 ttl=64 time=4.08 ms
64 bytes from 192.168.1.104: icmp_seq=3 ttl=64 time=4.26 ms
64 bytes from 192.168.1.104: icmp_seq=4 ttl=64 time=3.06 ms
64 bytes from 192.168.1.104: icmp_seq=5 ttl=64 time=3.77 ms
^C
--- 192.168.1.104 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4016ms
rtt min/avg/max/mdev = 3.064/3.900/4.307/0.459 ms

大概在4ms左右

开启Nagle发送两个数据包
[wang@localhost tpc]$ ./nodelay 192.168.1.104 3210
connecting to 192.168.1.104:3210
connected
Request no. 0, sending 3210 bytes
1715777496.470708 sent header
1715777496.478341 sent 3210 bytes
Sent all 1 requests, receiving responses.
1715777496.483114 received 4 bytes, ack = 3210
total 0.013132 seconds

大概在13ms左右

关闭Nagle发送两个数据包
[wang@localhost tpc]$ ./nodelay -D 192.168.1.104 3210
connecting to 192.168.1.104:3210
connected, set TCP_NODELAY
Request no. 0, sending 3210 bytes
1715777794.851212 sent header
1715777794.855121 sent 3210 bytes
Sent all 1 requests, receiving responses.
1715777794.856854 received 4 bytes, ack = 3210
total 0.006093 seconds

可以看见,关闭Nagel后,延迟大约6ms左右

开启Nagel合并发送一个数据包
[wang@localhost tpc]$ ./nodelay -b 192.168.1.104 3210
connecting to 192.168.1.104:3210
connected
Request no. 0, sending 3210 bytes
1715778177.438170 sent 3214 bytes
Sent all 1 requests, receiving responses.
1715778177.441433 received 4 bytes, ack = 3210
total 0.004178 seconds

因为只发送一个,延迟跟ping差不多,大概4ms左右

相关文章:

Nagle算法

Nagle算法简介 Nagle算法主要是避免发送小的数据包&#xff0c;要求TCP连接上最多只能有一个未被确认的小分组&#xff0c;在该分组的确认到达之前不能发送其他的小分组。 在默认的情况下,Nagle算法是默认开启的&#xff0c;Nagle算法比较适用于发送方发送大批量的小数据&…...

MPLS小实验

实验图&#xff1a; 实验要求&#xff1a; 要求使用MPLS技术&#xff0c;将实验通&#xff0c;并在实验结束后使用命令&#xff1a;tracert -v -a 看是否基于标签进行转发。 如上&#xff1a;在每台路由器上都有两个环回&#xff0c;一个用于模拟用户网段&#xff0c;一个用于M…...

MongoDB聚合运算符:$week

MongoDB聚合运算符&#xff1a;$week 文章目录 MongoDB聚合运算符&#xff1a;$week语法使用举例 $week聚合运算符返回指定日期日期为一年中第几周的数字值为0到53之间。周从周日开始&#xff0c;第1周从一年的第一个周日开始。一年中第一个星期日之前的日期为第0周。这和 str…...

【Linux】如何定位客户端程序的问题

文章目录 1 客户端程序和服务端程序的差别2 问题类型2.1 崩溃(crash)2.2 CPU高2.3 内存高2.4 线程卡死 3 总结 1 客户端程序和服务端程序的差别 客户端程序是运行在终端上&#xff0c;通常都会与业务系统共存&#xff0c;而服务端程序通常会运行在单独的节点上&#xff0c;或者…...

AI学习指南数学工具篇-PCA基础知识

AI学习指南数学工具篇-PCA基础知识 1. PCA是什么&#xff1f; PCA&#xff0c;即主成分分析&#xff08;Principal Component Analysis&#xff09;&#xff0c;是一种常用的数据降维技术。它通过线性变换将原始数据投影到一个新的坐标系中&#xff0c;旨在找到数据中的“主成…...

《系统架构设计师教程(第2版)》第4章-信息安全技术基础知识-02-信息加密技术

文章目录 1. 信息加密技术1.1 数据加密1.2 对称密钥加密算法1&#xff09;数据加密标准&#xff08;DES)2&#xff09;三重DES&#xff08;Triple-DES&#xff09;3&#xff09;国际数据加密算法&#xff08;IDEA&#xff09;4&#xff09;高级加密标准&#xff08;AES&#xf…...

Leetcode 404:左叶子之和

给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 思路&#xff1a;遍历树&#xff0c;寻找左叶子节点&#xff1b; 如果判断是左叶子节点&#xff0c;就更新sum。 public static int sumOfLeftLeaves(TreeNode root){int sum0;sumcompute(root,sum);return sum;}/…...

Keil问题解决:结构体数组初始化,初始化后的值不是目标值

省流&#xff1a;使用的编译器为compiler version 6&#xff0c;切换为compiler version 5 如果缺少编译器&#xff0c;请参考&#xff1a;Keil手动安装编译器V5版本 结构体定义&#xff1a; typedef struct _TASK_COMPONENTS {uint8_t Run; // 程序运行标…...

C++set关联式容器

Cset 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器&#xff0c;其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身&#xff0c;这样的容器被统称为序列式容器。而map、set是一种关联式容器&#xff0c;关联式容器也是用来存储数据的&#xff0…...

Celery Redis 集群版连接和PyCharm启动配置

目录 使用Redis cluster版作为broker原因 PyCharm配置 使用Redis cluster版作为broker 在celery5及其之前版本&#xff0c;需要配置如下才可行 celery_app.conf.update( broker_transport_options{“global_keyprefix”: “{celery}:”}, ) 原因 https://github.com/celery/…...

「AIGC算法」readLink实现url识别pdf、网页标题和内容

本文主要介绍AIGC算法,readLink实现url识别pdf、html标题和内容 一、设计思路 识别url是pdf或者网页网页处理逻辑,使用cheerio解析网页PDF处理逻辑,使用pdf-parse解析PDF文件自定义的函数来提取标题和内容二、可执行核心代码 const express = require("express")…...

Vue3+ts(day06:路由)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…...

springboot集成dubbo实现微服务系统

目录 1.说明 2.示例 3.总结 1.说明 dubbo官网&#xff1a;https://cn.dubbo.apache.org/zh-cn/ Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;支持多种语言&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实…...

idea使用gitee基本操作流程

1.首先&#xff0c;每次要写代码前&#xff0c;先切换到自己负责的分支 点击签出。 然后拉取一次远程master分支&#xff0c;保证得到的是最新的代码。 写完代码后&#xff0c;在左侧栏有提交按钮。 点击后&#xff0c;选择更新的文件&#xff0c;输入描述内容&#xff08;必填…...

Docker容器里面有什么东西?

2024年5月15日&#xff0c;周三下午 Docker 容器内部包含了一个运行的应用程序及其依赖环境。当你创建一个 Docker 容器时&#xff0c;你可以指定容器应该运行哪个镜像。这个镜像是由一系列层组成的&#xff0c;每一层包含了一些文件和目录。当你运行这个镜像时&#xff0c;Doc…...

vue基础+高级用法

一、vue基础用法 mvvm的了解/认知 语义化模板mvc - model view controllermvvm - model view view-model vue是如何利用mvvm思想进行开发 双向数据绑定 花括号&#xff0c;构建了数据与视图的双向绑定通过视图绑定事件&#xff0c;来处理数据 生命周期-vue示例 建立&…...

鸿蒙应用布局ArkUI【基础运用案例】

布局基础运用案例 平级导航的复合网格视图 平级导航的复合网格视图常出现在同时展示多种不同内容的界面。 例如&#xff0c;市场类应用作为典型的平级导航&#xff0c;其首页不同板块采用了不同布局能力。 标题栏与搜索栏&#xff1a;因元素单一、位置固定在顶部&#xff0c…...

GD32F103RCT6/GD32F303RCT6-UCOSIII底层移植(1)工程建立

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布&#xff1a; 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转&#xff1a; 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…...

在本地设备上配置 Git 忽略特定文件

在本地设备上配置 Git 忽略特定文件 在日常的 Git 使用中&#xff0c;有时我们希望某些文件只在本地设备上被忽略&#xff0c;而不影响其他团队成员或设备。这篇博客将介绍如何在特定设备上配置 Git 忽略规则&#xff0c;使得一个文件不会被提交。 背景 通常&#xff0c;我们…...

cin.ignore()函数和stoll函数

cin.ignore()函数 cin.ignore() 是一个非常实用的函数&#xff0c;主要用于控制输入流 cin 的行为 cin.ignore(int n 1, char delimiter EOF); n&#xff1a;一个整数参数&#xff0c;表示要忽略的字符数量。默认值是1&#xff0c;意味着只忽略下一个字符。delimiter&#x…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...