在节点 Js 中处理数据包



假设我正在Node Js中读取TCP或UDP流。这个问题基本上适用于任何语言或平台,但是如何为数据层创建标头呢?

我想我需要

  1. 用于标识标头的魔术字符集
  2. 表示数据包长度的数字
  3. ???

我想在未来证明它并遵循任何"典型"数据包标头结构(也许它们通常包括版本?协议?(,但终生无法在网上找到任何重要信息。

使用 pcapng 格式。如果您想更深入地查看标头字节,该规范应该包含您需要的一切。Pcap 是较旧的格式,但有局限性。

已经有一个可用的pcapng解析器,pcap-ng-parser可以通过npm获得。

如果你想要一个通用的协议分析仪,你应该看看Wireshark

生成 pcapng 文件

为了使用 pcapng,我们需要一个 pcapng 文件。幸运的是,tshark(Wireshark的一部分(使这变得容易。我们可以使用 tshark 生成 10 个数据包 (-c 10( 并保存为 pcapng 格式 (-F(。

tshark -w myfile.pcapng -F pcapng -c 10

JS pcapng 库

pcap-ng-parser

我们可以在关于页面上使用示例 js 文件:

# temp.js
const PCAPNGParser = require('pcap-ng-parser')
const pcapNgParser = new PCAPNGParser()
const myFileStream = require('fs').createReadStream('./myfile.pcapng')
myFileStream.pipe(pcapNgParser)
.on('data', parsedPacket => {
console.log(parsedPacket)
})
.on('interface', interfaceInfo => {
console.log(interfaceInfo)
})

从 pcapng 文件中获取信息

运行示例 JS

在我的系统上运行它,我们看到链接和接口信息。

$ node temp.js
{
linkType: 1,
snapLen: 524288,
name: 'en0u0003u0005Wi-Fitu0001u0006',
code_12: 'Mac OS X 10.14.6, build 18G103 (Darwin 18.7.0)u0000u0000u0000u0000u0000u0000hu0000u0000u0000'
}
{
interfaceId: 0,
timestampHigh: 367043,
timestampLow: 1954977647,
data: <Buffer a8 bd 27 c8 f2 fe 6c 96 cf d8 7f e7 08 00 45 00 00 28 87 c3 00 00 40 06 e4 ba ac 1f 63 c6 8c 52 72 1a fc 3c 01 bb 6c 24 4d 01 54 03 1b 06 50 10 08 00 ... 4 more bytes>
}
... <output truncated>

VS 鲨鱼

根据您的用例,tshark 可能更有意义

tshark -r myfile.pcapng -c 1 -T json
[
{
"_index": "packets-2019-12-15",
"_type": "pcap_file",
"_score": null,
"_source": {
"layers": {
"frame": {
"frame.interface_id": "0",
"frame.interface_id_tree": {
"frame.interface_name": "en0",
"frame.interface_description": "Wi-Fi"
},
"frame.encap_type": "1",
"frame.time": "Dec 15, 2019 12:04:14.932076000 PST",
"frame.offset_shift": "0.000000000",
"frame.time_epoch": "1576440254.932076000",
"frame.time_delta": "0.000000000",
"frame.time_delta_displayed": "0.000000000",
"frame.time_relative": "0.000000000",
"frame.number": "1",
"frame.len": "175",
"frame.cap_len": "175",
"frame.marked": "0",
"frame.ignored": "0",
"frame.protocols": "eth:ethertype:ip:udp:db-lsp-disc:json",
"frame.coloring_rule.name": "UDP",
"frame.coloring_rule.string": "udp"
},
"eth": {
"eth.dst": "ff:ff:ff:ff:ff:ff",
"eth.dst_tree": {
...

最新更新