C#如何处理TCP数据包/段

时间:2012-11-04 20:12:07

标签: c# networking tcp packet

关于TCP的几个问题。

我知道如果数据包遇到MTU等较低的网络设备,它将被“拆分”或碎片化。但我遇到的问题是如何在应用程序中“重建”我的有效负载。 (我现在已经尝试了2-3个小时,但似乎无法做到正确)

首先要做的事情。发送数据包时,以下两个选项的优缺点是什么;

NetworkStream ns = client.GetStream();
ns.Write(BitConverter.GetBytes(100));
ns.Write(BitConverter.GetBytes("Test"));

NetworkStream ns = client.GetStream();
byte[] payload = BitConverter.GetBytes(100).Concat(BitConverter.GetBytes("Test"));
ns.Write(payload); //, 0, payload.Length);

如何在recv重建有效载荷。部分如果已被拆分?我会喜欢在这个上用勺子喂食,因为我似乎错过了一些非常重要的,但不是那么明显,在我目前的申请中。

1 个答案:

答案 0 :(得分:5)

你完全不关心MTU或碎片。操作系统的TCP / IP堆栈负责重新组装碎片包。

你必须记住,它是一个TCP“ stream ”,所以你如何阅读或写它并不重要;它只是一个连续的数据流。这取决于您的数据包定义,以提供通过该流传递的数据结构。

在许多结构化协议中,有一个用户定义的头,第一个字段指定数据包的长度。所以你首先读取X字节,其中X是标题的大小。您解释该标头,以便知道数据包的其余部分有多大。然后,您读取适当数量的字节以获取数据包的其余部分。

所以,在你的两个例子中,它并不重要。选择最简单的东西(在这种情况下,第一个。)