【问题标题】:The correct time to set TCP_NODELAY?设置 TCP_NODELAY 的正确时间?
【发布时间】:2021-03-26 23:29:35
【问题描述】:

我正在编写一个 TCP 代理,并希望通过设置 TCP_NODELAY 来禁用 Nagle 算法。

有两种socket:

  1. 来自accept() 调用的套接字。 (客户端 -> 代理)
  2. 来自socket() 调用的套接字。 (代理 -> 服务器)

所以我想知道为这两种socket设置TCP_NODELAY的正确时间是什么时候?

我可以在accept()socket() 调用之后立即设置 TCP_NODELAY 吗?

我检查了man 7 tcp,但没有答案:(

【问题讨论】:

  • 当然,为什么不呢?你试过了吗?我看不出有任何等待的理由。一旦您接受或连接,就和任何时候一样好。如果你需要它,大概你需要它的持续时间。
  • 好吧,考虑到你需要一个套接字描述符来设置TCP_NODELAY,所以你不能在调用accept()/@之前设置它之前 987654328@,所以显然你必须在调用它们之后设置它。一旦有了套接字描述符,您就可以在任何时间对其设置TCP_NODELAY
  • @Remy:如果您在发送后设置 TCP_NODELAY,堆栈 (A) 是否会立即注意到 (a) 更改和 (b) 某些内容已被缓冲,因此 (B) 传输已发送的内容积累?
  • @user15972 我想这是实现定义的行为。但我怀疑它要到下一次发送才会生效。

标签: c linux sockets tcp network-programming


【解决方案1】:

您可以在 accept() 或 socket() 调用后立即设置 TCP_NODELAY。 Nagle 只是 TCP 源码中的一个标志,一旦设置,就会产生影响。

【讨论】:

  • 这意味着:{(A) Nagle 只是 TCP 源代码中的一个标志,一旦你设置它,它将影响未来的 SEND。 (B) Nagle 只是 TCP 源代码中的一个标志,一旦你设置它,它会影响并触发任何已经缓冲的动作。} 我怀疑答案是 (A)。
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2012-12-27
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
相关资源
最近更新 更多