tcp数据包的重新组装
reassembly of tcp packet
我正在解析一个文件,其中包含许多需要解析的tcp数据包。问题是它们被分割了,我找不到任何指示它们何时何地进行分割。没有标志或任何其他指示,表明当前数据包的中间可能包含下一个数据包的开头。tcp上面的协议是FIX(用于在线交易),但我希望我的代码能够与任何协议一起工作(或者至少了解它是哪个协议)。我正在用C++编写代码,不能使用任何其他库。那么,我该如何弄清楚tcp之上的协议是什么,以及它在哪里被分割?
你不能。TCP/IP在概念上是一个流,而不是一个消息序列(它最终被实现为一个数据包序列这一事实无关紧要)。当您将字节序列写入TCP/IP流时,该序列将添加到流中;它不被视为应该保持其自身身份的消息。消息开始/结束的概念不会随流一起传输,除非您自己在自己的协议中这样做。
如果你觉得这很难相信,请考虑一下它对文件的作用:如果你向文件写入一个字节序列,那么这个序列不会以某种方式成为你以后可以识别和检索的记录。如果你想要那种结构,你必须自己添加。TCP/IP也是如此。
用于实现TCP/IP的传输数据包与您使用API调用指定的数据块无关;它们仅仅是实现TCP/IP流的一种方式。对于某些用例,可能会出现映射,但这是偶然的。
将TCP/IP流拆分回单独消息的唯一方法是使用运行在TCP/IP之上的协议知识。在您的情况下,这是FIX。我想你知道这是怎么回事;您可以使用这些知识将FIX数据正确地拆分回其原始消息。无法制作通用TCP/IP消息拆分器。
正如我所看到的,您的问题是分离TCP数据包。要解决这个问题,您可以中继有效载荷的长度(这个答案)和校验和。如果具有指定长度的数据的校验和是正确的,则数据包是正确的;如果不是,则需要在数据包的前一部分中查找数据包的开头,或者丢弃这部分数据。至少这种方法可以帮助你们找到dada被分割的地方。
要得到更精确的答案,最好只看到一小部分数据。
但你们的主要问题是数据包的分割。为了获得更好的性能,您应该尝试排除此问题(可能将网卡更改为Intel)。
- 模板元编程:如何将参数包组合成新的参数包
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 导致ESP32随机停止并触发看门狗计时器重新启动的串行数据包
- tcp数据包的重新组装