You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux中提取IPv6报头负载长度问题:脚本无法输出负载长度

问题分析与修复方案

原脚本核心问题

  1. Payload Length 提取位置错误:IPv6报头中Payload Length仅占2字节(对应4个十六进制字符),但原脚本错误截取了8个字符(4字节),导致数值完全错误。
  2. 无意义的对比逻辑:原脚本试图从负载数据的前4字节提取长度做对比,这不符合IPv6协议规范——Payload Length是IPv6报头的固定字段,无需与负载内容做此类对比。
  3. 地址截取偏移错误:源地址和目的地址的字符截取位置偏移,导致提取的IPv6地址不完整或错位。

修复后的脚本

#!/bin/bash

if [ $# -ne 1 ]; then
    echo "Usage: $0 <packet_file>"
    exit 1
fi

packet_file="$1"

# 提取IPv6报头40字节,转为无空格十六进制字符串
header_hex=$(xxd -p -l 40 "$packet_file")

# 提取Payload Length:对应IPv6报头第5-6字节,十六进制字符串第9-12位(4个字符)
payload_length_hex=$(echo "$header_hex" | cut -c 9-12)
payload_length_decimal=$((0x$payload_length_hex))

# 提取并格式化源地址:IPv6报头第8-23字节,转为标准IPv6格式
source_address_hex=$(echo "$header_hex" | cut -c 17-48)
source_address=$(echo "$source_address_hex" | sed 's/\(....\)/\1:/g; s/:$//')

# 提取并格式化目的地址:IPv6报头第24-39字节,转为标准IPv6格式
destination_address_hex=$(echo "$header_hex" | cut -c 49-80)
destination_address=$(echo "$destination_address_hex" | sed 's/\(....\)/\1:/g; s/:$//')

# 输出结果
echo "Payload Length: $payload_length_decimal"
echo "Source Address: $source_address"
echo "Destination Address: $destination_address"

修复说明

  • Payload Length 修正:严格按照IPv6报头规范,截取对应2字节的十六进制字符,转十进制时自动适配大端序。
  • 移除错误对比:删除了与负载内容的无意义长度对比逻辑,避免干扰正确结果输出。
  • 地址格式优化:将原始十六进制字符串转为标准IPv6地址格式(冒号分隔每4个十六进制字符),提升可读性。
  • 字段偏移对齐:所有字段的截取位置完全匹配IPv6报头官方结构:版本+流量类别+流标签(4字节)→ Payload Length(2字节)→ 下一个报头+跳数限制(2字节)→ 源地址(16字节)→ 目的地址(16字节)。

内容的提问来源于stack exchange,提问作者abcd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:37:38