【问题标题】:How can i get CRC from received data by TCP?如何从 TCP 接收到的数据中获取 CRC?
【发布时间】:2020-04-10 16:50:04
【问题描述】:

我需要通过以太网协议将以太网数据包从一台设备发送到另一台设备。经过一番研究,我决定使用 TCP\IP 协议。我创建了相互通信的 TCP 服务器和 TCP 客户端。我为此使用了 TcpClient 和 TcpListener 类。它工作正常,但我有一些问题:

  1. 我需要从收到的消息中检查 CRC,并以某种方式将其与在侦听器端手动计算的结果进行比较。我怎样才能做到这一点?如何从收到的消息中获取此 CRC?我得到的只是我从客户端发送的确切消息。
  2. 以这种数据包格式查看我的消息有什么共同点?我在监听器端看到的都是“数据”字段,但我想看到带有标题、CRC(FCS)等的“原始”, like at that picture.

【问题讨论】:

  • “我需要将以太网数据包从一台设备发送到另一台设备”和“我决定使用 TCP\IP”并没有叠加。协议位于不同的层。 (以太网 PDU 最好称为帧,而不是数据包。)
  • 您可以使用数据包分析工具,例如 tcpdump 或 Wireshark
  • @stickybit 对不起,我还是新手。实际上这是真的,我完全对这些层感到困惑。你能推荐一些东西来澄清一下吗?不像书,而是像快速阅读。在那种情况下你能推荐我什么?我怎样才能以这种原始形式发送这些以太网帧并同时读取它们?
  • @mangusta 谢谢!我会尝试搜索它。但这意味着我无法通过原生 .NET 工具获得 TCP/IP 协议的 CRC?
  • 我认为这些都嵌入在 TCP 客户端中并且不可见。它使用它来确保正确接收数据(没有错误)。如果您担心安全性(例如有人拦截和更改数据)而不是错误检查,您需要将自己的校验和与传输的数据一起发送。

标签: c# tcp ethernet


【解决方案1】:

Svemir,您可以查看SO question here 关于在 C# 中使用套接字的原始通信。

Here is a good SuperUser explanation of the various layers。如果你使用 Sockets 的原始方法,那么你会遇到一些困难

如果你以这种方式实现你的套接字,你将不得不处理 TCP 的细节。

来自关于 SocketType.Raw 的 Microsoft 文档

支持访问底层传输协议。使用 Raw,您可以使用 Internet 控制消息协议 (ProtocolType.Icmp) 和 Internet 组管理协议 (ProtocolType.Igmp) 等协议进行通信。您的应用程序在发送时必须提供完整的 IP 标头。接收到的数据报返回完整的 IP 标头和选项

来自关于 SocketType.Stream 的 Microsoft 文档

支持可靠的、双向的、基于连接的字节流,无需重复数据,也无需保留边界。这种类型的 Socket 与单个对等方通信,并且需要远程主机连接才能开始通信。 Stream 使用传输控制协议 (ProtocolType.Tcp) 和 AddressFamily.InterNetwork 地址族。

这基本上意味着一切都为您处理,您只能访问超级用户链接所指的信件内容。

【讨论】:

  • 非常感谢您,Athanasios!您的回答非常有帮助,现在我对这个协议有了更多的了解,并且知道它是如何工作的。但我认为,就目前而言,我会选择@TroyMac1ure 建议的路径。因为这个原始套接字对我来说似乎还很难。但对于未来,我知道如何处理。谢谢!
猜你喜欢
  • 2012-09-10
  • 2017-11-08
  • 2013-03-03
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多