【问题标题】:Forcing a TCP stream to send buffer contents强制 TCP 流发送缓冲区内容
【发布时间】:2011-09-27 08:25:52
【问题描述】:

我正在使用 Csharp tcp 套接字在客户端和服务器之间发送数据。 现在我看到或认为的问题是 tcp 是一种流协议,除非它们的数量足够,否则不会推送(发送)数据。

例如说我想发送一些数据,不管它没有关系,让我们说它的 8 个字节长。我看到的行为是无论我等待多长时间它都不会发送该数据,除非我推得更多,大概直到我到达 tcp 缓冲区。

所以我的问题是。如果我想通过 tcp 发送少量数据,我是否需要在末尾附加垃圾以强制套接字发送。 (我不会对此感觉良好)或者是他们的另一种方式,我可以强制发送流的前段。

提前致谢。我还在学习tcp,请原谅我的无知。

【问题讨论】:

  • 在 .Net 中有几种使用套接字发送数据的方法。您使用的是哪一个,即您能否向我们展示您的代码的简短摘录?
  • 哦,是的,我正在使用 TcpClient 对象并在客户端和服务器上设置 NoDelay = true 并不能解决问题。
  • 我认为这与没有获取数据有关,而与我没有正确使用 NetworkStream.Read 有关。我将更多地研究 api 文档。感谢所有帮助。
  • “我看到的行为是无论我等待多长时间它都不会发送该数据,除非我在它后面推得更多,大概直到我到达 tcp 缓冲区。”我觉得那部分非常令人惊讶。它最终应该发送小数据,它只是稍等片刻,看看是否有新的东西到达。
  • 显示一些代码(客户端和服务器的),听起来你正在将流包装在一些其他缓冲流中,使用 TCP 发送 8 个字节没有问题,它不应该等待“永远”,一旦你将数据推送到 TCP,通常只需要很短的时间。

标签: c# sockets tcp client


【解决方案1】:

您可以设置NoDelay 属性(我认为这是禁用Nagle 的原因)。

【讨论】:

    【解决方案2】:

    不要设置NoDelay,除非您是 TCP/IP 专家并了解其全部后果。如果你没有读过史蒂文斯,那就别想了。

    这是一个示例问题:如果您建立一个套接字连接并在其上发送 8 个字节,是立即发送 8 个字节还是 Nagle 算法等待更多数据发送?答案是“立即发送 8 个字节” - 但在您完全理解为什么这就是答案之前,不要考虑弄乱 Nagle。

    还有一个问题:在标准命令/响应协议中,每个数据包应用了多少 Nagle 延迟?答案:没有。同样,您应该研究为什么 Nagle 在这种常见情况下会导致没有延迟。

    如果您在 250 毫秒内没有看到发送的数据(Nagle 在最坏的可能情况下造成的最大延迟),那么还有其他问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2010-11-26
      相关资源
      最近更新 更多