Node.js 在NodeJS中处理数据包

Node.js 在NodeJS中处理数据包,node.js,tcp,header,packet,Node.js,Tcp,Header,Packet,假设我正在节点Js中读取TCP或UDP流。这个问题基本上适用于任何语言或平台,但是我如何为我的数据层创建一个头部呢 我想我需要 用于标识标题的一组神奇字符 表示数据包长度的数字 我想对其进行未来验证,并遵循任何“典型”数据包头结构(可能它们通常包括版本?协议?),但我一生都无法在网上找到任何有用的信息。使用该格式。如果希望更深入地查看头字节,则应该具有所需的所有内容。Pcap是较旧的格式,但是 已经有了一个pcapng解析器,可以通过npm获得 如果你想要一个通用协议分析器,你应该看看 生成p

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

我想我需要

  • 用于标识标题的一组神奇字符
  • 表示数据包长度的数字
  • 我想对其进行未来验证,并遵循任何“典型”数据包头结构(可能它们通常包括版本?协议?),但我一生都无法在网上找到任何有用的信息。

    使用该格式。如果希望更深入地查看头字节,则应该具有所需的所有内容。Pcap是较旧的格式,但是

    已经有了一个pcapng解析器,可以通过npm获得

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

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

    tshark-w myfile.pcapng-F pcapng-c 10
    
    JS pcapng库 pcap ng解析器 我们可以使用about页面上的示例js文件:

    #temp.js
    const PCAPNGParser=require('pcap-ng-parser')
    const pcapNgParser=新的pcapNgParser()
    const myFileStream=require('fs').createReadStream('./myfile.pcapng'))
    myFileStream.pipe(pcapNgParser)
    .on('data',parsedPacket=>{
    console.log(解析包)
    })
    .on('interface',interfaceInfo=>{
    控制台日志(interfaceInfo)
    })
    
    从pcapng文件获取信息 运行示例JS 在我的系统上运行它,我们可以看到链接和接口信息

    $node temp.js
    {
    链接类型:1,
    斯内普兰:524288,
    名称:“en0\u0003\u0005Wi-Fi\t\u0001\u0006”,
    代码_12:'Mac OS X 10.14.6,构建18G103(达尔文18.7.0)\u0000\u0000\u0000\u0000\u0000\u0000h\u0000\u0000\u0000\u0000'
    }
    {
    接口ID:0,
    最高:367043,
    时间流:1954977647,
    数据:
    }
    ... 
    
    Vs tshark 根据您的用例,tshark可能会更有意义

    tshark-rmyfile.pcapng-c1-tJSON
    [
    {
    “_索引”:“数据包-2019-12-15”,
    “\u类型”:“pcap\u文件”,
    “_分数”:空,
    “_来源”:{
    “层”:{
    “框架”:{
    “frame.interface_id”:“0”,
    “frame.interface\u id\u树”:{
    “帧接口名称”:“en0”,
    “帧接口描述”:“Wi-Fi”
    },
    “框架包装类型”:“1”,
    “帧时间”:“2019年12月15日12:04:14.932076000太平洋标准时间”,
    “帧偏移量_移位”:“0.000000000”,
    “帧时间”——“1576440254.932076000”,
    “帧时间增量”:“0.000000000”,
    “显示帧时间增量”:“0.000000000”,
    “相对帧时间”:“0.000000000”,
    “帧编号”:“1”,
    “frame.len”:“175”,
    “框架盖面”:“175”,
    “已标记帧”:“0”,
    “frame.ignored”:“0”,
    “frame.protocols”:“eth:ethertype:ip:udp:db lsp disc:json”,
    “frame.coloring_rule.name”:“UDP”,
    frame.coloring\u rule.string:“udp”
    },
    “eth”:{
    “eth.dst”:“ff:ff:ff:ff:ff”,
    “eth.dst_树”:{
    ...
    
    Shoot,对不起。我想我的问题不清楚。我正在尝试创建自己的数据协议(如FTP或HTTP,但用于其他内容)我想看看一些包头的基本示例。我想我可以使用Wireshark,调查其他软件是如何发送数据的,但可能无法识别它们的头。看看Wireshark中的,看看字段相对于的结构。看看或使用。如果你仍然有相同的提问前,请务必阅读相关内容,以及作为对他人的礼貌。