【问题标题】:TCP - Sending and Receiving TCP/IP DataTCP - 发送和接收 TCP/IP 数据
【发布时间】:2011-09-13 15:47:44
【问题描述】:

我有一个客户端和一个服务器通过标准 TCP 连接相互通信。

服务器配置为以大小一致的 x 字节块发送数据。客户端还配置为以 x 字节为单位接收数据(即客户端期望调用 TCP 堆栈以接收 x 字节将成功,除非与远程端的连接失败)。

可以将我的基于 TCP 的协议建立在上述假设之上吗?

【问题讨论】:

    标签: sockets tcp network-programming ip


    【解决方案1】:

    没有。 TCP 是一种基于流的协议。除非您自己在应用程序级别处理分块,否则您不能保证“分块”。 TCP 作为一种协议不会为您保证这一点。

    【讨论】:

      【解决方案2】:

      似曾相识Will TCPStream read block until all data is received.

      我意识到这看起来有点不同,但本质上它们是非常相似的问题。

      不要对数据包大小做出假设。

      【讨论】:

      • 我不确定对该问题的回答是否完整。 “适当的形式”放在一边。 TCP 有严格的规则来管理可靠性和流量控制。如果发送方在“一次命中”中发送 20 个字节,那么接收方是否不应该被允许读取这 20 个字节中的任何一个,直到所有字节都被接收并以正确的顺序重建?和;因此,基于预先协商的块大小的协议合约应该可以假设不应该吗?
      • 没有。它是一条溪流。我可能会写 100 个字节,这可以转化为 100 个 1 字节读取。或 2 次 50 字节读取。或任何其他组合。它不是基于数据包的。更多讨论请参见this
      • 同一篇文章指出:“解决 TCP 消息问题的最简单但成本最高的方法是创建一个始终传输固定大小消息的协议。通过将所有消息设置为相同大小,接收 TCP 程序可以毫无疑问地知道何时从远程设备接收到整个消息。”因此,只要通信双方都遵循它,就可以对数据包大小进行假设。记住我的协议不使用可变长度的数据块——它总是一样的。
      • 这意味着如果一条消息总是大小为 X,那么当接收者有 X 时,它就知道它有一个完整的消息。但这并不意味着接收者将在一次读取中获得 X。接收方可能需要进行 X 次 1 字节读取才能获得整个消息。看到不同?基本上,如果大小是固定的,则接收者只知道它何时收到完整的消息,而无需在消息中包含消息长度或在流中使用特殊数据标记来指示消息结束。
      • 我没有读到任何东西表明你所说的是真的。如果 A 发送了 20 个字节,而 B 在 B 的 TCP 缓冲区中可用之前接收了所有 20 个字节,那么调用 recv(20 bytes) 应该永远不会失败,除非发生通信问题?抱歉,关于我对这个问题的固执,我试图找到规范的任何部分,它肯定会同时以一种或另一种方式回答这个问题。
      猜你喜欢
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 2016-05-09
      • 2019-11-27
      • 2012-12-17
      • 2012-03-10
      相关资源
      最近更新 更多