【问题标题】:C# How to handle TCP packets/segmentsC#如何处理TCP数据包/段
【发布时间】:2012-11-04 20:12:07
【问题描述】:

关于 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 处重建有效负载。部分是否已拆分?我会喜欢用勺子喂这个,因为我似乎错过了我当前应用程序中一些非常重要但不那么明显的部分。

【问题讨论】:

    标签: c# networking tcp packet


    【解决方案1】:

    您根本不关心 MTU 或碎片。重新组装分段数据包是操作系统的 TCP/IP 堆栈的责任。

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

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

    所以,在你的两个例子中,这并不重要。选择最简单的方法(在本例中为第一个。)

    【讨论】:

    • 我现在的有效载荷结构是; OP code, size, data 但是如果我正确理解了我书中关于 TCP 的章节,我可能会遇到我得到 OP Code, Size, DataSplit[0] 并且在下一次阅读时我得到 DataSplit[1], OP Code, Size , 数据
    • 当然,但你想多了。如果您按照我上面的指示,您将始终确切地知道要读取多少字节。数据如何进来并不重要。记住,它是一个数据流
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2018-11-19
    • 2015-07-27
    • 1970-01-01
    • 2013-11-25
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多