首页 > 解决方案 > TCP 是否区分发送几条小消息和一条大消息?

问题描述

使用伪 C# 只是因为它是我正在使用的,并假设 C# 只是包装 TCP 协议:

一个

Socket s = ...; //a valid open socket that is receiving
string str = "abcdefghijklmnopqrstuvwxyz";
for(int i=0; i<10;++i)
{
 byte[] buf = ASCII.GetBytes(str);
 s.Send(buf)
}

Socket s = ...; //a valid open socket that is receiving
string str = "abcdefghijklmnopqrstuvwxyz";
string str2 = "";
for(int i=0; i<10;++i)
{
 str2 += str;
}
byte[] buf = ASCII.GetBytes(str2);
s.Send(buf)

这些在 TCP 级别实际上有何不同,具体来说,接收者有什么方法可以知道第一个是 10 个单独的消息,第二个是单个消息?TCP 是否将每个发送调用视为具有某些数据包或结束标识符,还是只是将字节推入流中,我必须定义一种方法来确定基于内容本身发送的内容?

标签: c#.netnetworkingtcp

解决方案


它只是将字节推入流中,我必须定义一种方法来确定基于内容本身发送的内容?

是的,它只是将字节推送到流中,然后将其传递到线路上。它们可以以任意数量的数据包大小通过网络。您可以发送一个带有 1 字节有效负载的 TCP 数据包或一个带有接近 9k 字节有效负载的 TCP 数据包(在巨型帧的情况下)。如果 Wire 是“虚拟的”,例如同一主机上的两个客户之间的虚拟交换机,则“数据包”可能是 60K 或更大,具体取决于实现。

作为实施者,您可以自行决定“数据框架”,这可以像换行符(在 http 的情况下)一样简单,也可以是具有不同位和字节的复杂结构,表示不同的消息边界。


推荐阅读