在节点Js

时间:2019-12-15 19:23:33

标签: node.js tcp header packet

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

我想我需要

  1. 一组神奇的字符来标识标题
  2. 表示数据包长度的数字
  3. ???

我希望将来对其进行验证,并遵循任何“典型的”数据包报头结构(也许它们通常包括版本?协议?),但是我一生无法在网上找到任何重要信息。

1 个答案:

答案 0 :(得分:0)

使用pcapng格式。如果想更深入地查看标头字节,spec应该具有所需的一切。 Pcap是较旧的格式,但为has limitations

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

如果要使用通用协议分析器,则应查看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: 'en0\u0003\u0005Wi-Fi\t\u0001\u0006',
  code_12: 'Mac OS X 10.14.6, build 18G103 (Darwin 18.7.0)\u0000\u0000\u0000\u0000\u0000\u0000h\u0000\u0000\u0000'
}
{
  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>

与tshark

根据您的用例,反正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": {
...