2

我的应用程序使用套接字小消息通过电线发送。每条消息大约是 200 字节的数据。我希望看到我的数据以 2 帧而不是 1 帧发送。我的问题是

  1. 如何做到这一点,即有没有办法让 TCP 自动将缓冲区分成 2 帧?
  2. 如果我在 2 次单独的写入中发送缓冲区,我会得到相同的结果吗?

我正在使用 Linux 和 C。

4

2 回答 2

5

如何做到这一点,即有没有办法让 TCP 自动将缓冲区分成 2 帧?

TCP是流式通信协议,所有数据都是连续的。您应该通过分隔符拆分数据。

例如,在 HTTP 协议中,每个单独的请求都被两个\n.

如果我在 2 次单独的写入中发送缓冲区,我会得到相同的结果吗?

不,您将收到它们作为一个连续的数据流。帧是没有意义的。

注意:在应用程序中接收任何数据 TCP 之前,数据包会被分离,但操作系统会收集并重新组装它们。这个过程对您的应用程序是透明的。

于 2013-03-22T10:52:31.330 回答
0

您可以考虑以下几点。

  1. TCP 确实有PSH 标志,您可以在数据包中设置它,这使得 TCP 推出任何缓冲的数据。但这会有点不可靠,因为理论上,数据可以在接收端再次组合。但在实践中,您会看到数据是分开交付的。
  2. 您不能真正使用“\n”作为分隔符,因为它可以自然地出现在您的数据中。您必须想出某种转义序列才能使用,并转义数据中所有出现的“\n”。这可能很痛苦。
  3. 如果您需要消息边界,请考虑支持它的协议。像UDP一样。但是使用 UDP,您将失去保证交付。您将不得不滚动自己的确认、重试等等。
  4. 最后是SCTP。较少使用的协议,但至少在 Linux 堆栈中可用。它为您提供两全其美的体验。消息边界、保证传递、保证顺序。
于 2013-03-22T12:42:58.037 回答