一、前期准备

1.1 IP首部组成

IP首部位于IP数据报的前20个字节,每一行有32比特位,共计5行。
在这里插入图片描述
第一行包括 4位IP-version 4位IP头长度 8位服务类型 16位报文总长度
第二行包括 16位标识符 3位标记位 13位片偏移 (解析时不关注此行)
第三行包括 8位TTL 8位协议 16位头部校验和
第四行包括 32位源IP地址
第五行包括 32位目的IP地址

1.2 struct处理二进制报文数据

通过设置下面的格式可以将二进制数据按照不同字节大小进行解析

FORMAT C TYPE PYTHON TYPE STANDARD SIZE
B unsigned char integer 1字节
H unsigned short integer 2字节
L unsigned long integer 4字节
s char[] string ~

大端字节序表示高位在前,低位在后,是网络通信中常用的顺序;小段字节序则相反,低位在前,高位在后,因为计算机电路在处理低位字节效率较高,常用于主机存储中。
下面是struct包解析demo,其中>表示按照大端顺序进行解析。

import struct
bin_str = b'ABCDEFGH'
print(bin_str)
print(bin_str.decode())
res = struct.unpack('>8B', bin_str)
print(res)
res2 = struct.unpack('>4H', bin_str)
print(res2)
res3 = struct.unpack('>2L', bin_str)
print(res3)
res4 = struct.unpack('>8s', bin_str)
print(res4)

测试结果:
在这里插入图片描述

二、IP首部解析器的实现

       创建net包 新建parser.py文件
       在IPParser中分别对头部报文的每一行进行解析。

class IPParser:
    IP_HEADER_LENGTH = 20  # 报文前二十字节为ip头部
    @classmethod
    def parse_ip_header(cls, ip_header):
        IP报文格式
        1. 4位IP-version 4位IP头长度 8位服务类型 16位报文总长度
        2. 16位标识符 3位标记位 13位片偏移 暂时不关注此行
        3. 8位TTL 8位协议 16位头部校验和
        4. 32位源IP地址
        5. 32位目的IP地址
        :param ip_header:
        :return:
        line1 = struct.unpack('>BBH', ip_header[:4])  # 先按照8位、8位、16位解析
        ip_version = line1[0] >> 4  # 通过右移4位获取高四位
        # 报文头部长度的单位是32位 即四个字节
        iph_length = (line1[0] & 15) * 4  # 与1111与运算获取低四位
        packet_length = line1[2]
        line3 = struct.unpack('>BBH', ip_header[8: 12])
        TTL = line3[0]
        protocol = line3[1]
        iph_checksum = line3[2]
        line4 = struct.unpack('>4s', ip_header[12: 16])
        src_ip = socket.inet_ntoa(line4[0])
        line5 = struct.unpack('>4s', ip_header[16: 20])
        dst_ip = socket.inet_ntoa(line5[0])
        # 返回结果
        # ip_version ip版本
        # iph_length ip头部长度
        # packet_length 报文长度
        # TTL 报文寿命
        # protocol 协议号 1 ICMP协议 6 TCP协议 17 UDP协议
        # iph_checksum ip头部的校验和
        # src_ip 源ip
        # dst_ip 目的ip
        return {
            'ip_version': ip_version,
            'iph_length': iph_length,
            'packet_length': packet_length,
            'TTL': TTL,
            'protocol': protocol,
            'iph_checksum': iph_checksum,
            'src_ip': src_ip,
            'dst_ip': dst_ip
    @classmethod
    def parse(cls, packet):
        ip_header = packet[:cls.IP_HEADER_LENGTH]
        return cls.parse_ip_header(ip_header)

三、测试逻辑

       在ServerProcessTask中调用IPParser

def process(self):
    异步处理方法
    :return:
    headers = {
        'network_header': None,
        'transport_header': None
    ip_header = IPParser.parse(self.packet)
    headers['network_header'] = ip_header
    return headers

测试结果:
在这里插入图片描述

文章目录一、前期准备1.1 IP首部组成1.2 struct处理二进制报文数据二、IP首部解析器的实现三、测试逻辑       在上一节搭建基础框架后本节我们真正实现对IP报文的解析,首先通过下面这张图先了解一下数据报文组装的结构顺序,IP首部处于IP数据包的头部,每一行32位,共计5行,总长度为20字节。IP协议处于OSI七...
LLDP 发现脚本 用于在所有网络接口上捕获/解析 LLDP(低级发现协议)以太网帧的简单 Python 脚本。 纯套接字/python-stdlib 实现,这意味着您不需要任何第三方包/附加组件。
tcp.py 复制代码 代码如下:# -*- coding: cp936 -*-import socketfrom struct import *from time import ctime,sleepfrom os import system system(‘title tcp sniffer’)system(‘color 05’) # the public network interfaceHOST = socket.gethostbyname(socket.gethostname()) # create a raw socket and bind it to the public int
编号 1 45 00 05 dc 4a cb 20 00 40 01 4B 52 c0 a8 00 27 7c 7f cf 0f 08 00 45 2e 00 01 00 17 61 62 63 64 65 66 67 68 69 6a 6b 6c 编号 2 45 00 02 1c 4a cb 00 b9 40 01 4A 99 c0 a8 00 27 7c 7f cf 0f 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71
⑴ 写出所捕获的报文中,头部固定部分各个字段的名称和值(对照捕获到的报文,写上),并解释其含义。 版本(Version):占4位(bit),指IP协议的版本号。目前的主要版本为IPV4,即第4版本号,也有一些教育网和科研机构在使用IPV6。在进行通信时,通信双方的IP协议版本号必须一致,否则无法直接通信。 首部(报头)长度(...
在汽车CAN报文数据分析工作过程中,需要经常对总线报文进行解析,并生成曲线做数据分析,定位以及对比。本文以车速报文为例,在不依托vector及其他CAN分析上位机的条件下,基于python工具对CAN报文进行解析,最终回执信号折线图。 代码如下: # *-* coding:utf8 *-* from matplotlib import pyplot as plt import numpy as np import pandas as pd # 函数作用:将ASC数据中的时间戳和车速信...
       上一节解析了TCP报文首部后,本节继续解析同样位于传输层的UDP报文首部。UDP作为一种无连接,不可靠的协议,其存在数据丢失不可知和没有拥塞控制等缺点,但有失亦有得,UDP的效率相对于TCP较高,多应用于对准确性要求相对低的场景,比如网络直播,网络视频语音通话等。 一、UDP首部解析器的实现  &nbsp...