AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 754073
Accepted
user3840019
user3840019
Asked: 2023-08-15 19:26:45 +0800 CST2023-08-15 19:26:45 +0800 CST 2023-08-15 19:26:45 +0800 CST

Linux 上的条件刷新 TCP 套接字

  • 772

每当我将数据写入 TCP 套接字时,它都会等到填充足够的数据,例如:64k(最大数据包大小),然后将数据发送到线路。这会错过另一端正确时间的数据。

当我设置 TCP_NODELAY 时,写入套接字的任何数据都会立即发送到线路。这会减少带宽,因为我们有很多带有 ACK 的小数据包。

我们可以为linux设置一个规则来有条件地清除套接字吗?前任:

if time gap between last sent packet and current data is greater than 100ms send immediately no matter how much data lendth is
else if current data length is bigger than 50kb send immediately no matter how much time gap is
else do nothing, wait some milliseconds for next decision

我不想减少 tcp 缓冲区大小,想修改 linux 刷新数据的方式。

我们可以通过修改linux配置文件来做到这一点吗?或者这必须在每个编写的软件中实现?

任何直接的答案、帮助、解决方案或文章链接都值得赞赏

tcp
  • 1 1 个回答
  • 21 Views

1 个回答

  • Voted
  1. Best Answer
    Marcus Müller
    2023-08-15T19:47:20+08:002023-08-15T19:47:20+08:00

    否则,如果当前数据长度大于 50kb,则无论时间间隔有多大,都立即发送

    无论如何,这种情况都会发生。Nagle 算法的传输缓冲窗口不会大于底层数据包(即 MTU),因为这没有任何好处,并且在所有实际应用中这些窗口不会大于 9 kB。所以,我感觉你遇到的问题与你想象的不同。

    如果最后发送的数据包与当前数据之间的时间间隔大于 100ms,则无论数据长度有多少,都立即发送

    这种情况确实会发生——无论如何,除非你明确使用TCP_CORK,而且即便如此,延迟也会被限制在 200 毫秒。

    我再次感觉到你遇到的问题与你想象的完全不同。

    否则什么也不做,等待几毫秒做出下一个决定

    请注意,对您的问题做出正确的“决定”需要应用程序级的数据流需求知识 - 因此,实际上,最简单且开销特别低的解决方案是相应地设计您的协议,并在传输小数据报之前积累它们您的应用程序,然后手动刷新(或使用TCP_NODELAY)。您还可以仔细阅读设置和取消设置,TCP_CORK让 Linux 内核为您进行存储。

    这可能意味着您需要放弃 TCP 并采用 SCTP,或者在极端情况下,采用具有您自己的流量控制逻辑的 UDP – 考虑到您最初的声明,您似乎确实想要这样做:

    这会错过另一端正确时间的数据。

    这听起来像是您使用了对 TCP 错误的假设来错误设计了网络协议?TCP 不保证 RX 和 TX 之间的数据包顺序;仅每个 RX 和 TX单独,数据顺序得到保证。

    • 1

相关问题

  • 创建套接字文件是否需要 AF_INET?

  • UDP 或 TCP 打孔以连接两个对等点(每个对等点位于路由器后面)

  • 通过 TCP 构建 Unix 套接字桥

  • 连接到 IP 0.0.0.0 成功。如何?为什么?

  • Linux中哪个进程负责TCP

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve