Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解原始套接字数据包头_Python_Python 3.x_Sockets - Fatal编程技术网

Python 理解原始套接字数据包头

Python 理解原始套接字数据包头,python,python-3.x,sockets,Python,Python 3.x,Sockets,我已经用Python编写了一个套接字包嗅探器 我知道我可以在数据变量(data[0])的索引0处找到接收方的IP地址,但在数据包中的哪里可以找到发送方的IP地址和端口号 头元组中的所有整数是什么意思?我知道头[6]是TCP/UDP协议,但其余的呢 标题:(69,0,61,1541,0,128,17,0,192,168,56,1,255,255,255) IP标头具有和。你决定用字节和短片来解包。一般来说,您希望将每个字段的大小与正确的数据类型相匹配。查看适当的标题大小,您可以看到各个细分:

我已经用Python编写了一个套接字包嗅探器

  • 我知道我可以在数据变量(data[0])的索引0处找到接收方的IP地址,但在数据包中的哪里可以找到发送方的IP地址和端口号
  • 头元组中的所有整数是什么意思?我知道头[6]是TCP/UDP协议,但其余的呢

    标题:(69,0,61,1541,0,128,17,0,192,168,56,1,255,255,255)

  • IP标头具有和。你决定用字节和短片来解包。一般来说,您希望将每个字段的大小与正确的数据类型相匹配。查看适当的标题大小,您可以看到各个细分:

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |Version|  IHL  |Type of Service|          Total Length         |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         Identification        |Flags|      Fragment Offset    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |  Time to Live |    Protocol   |         Header Checksum       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                       Source Address                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                    Destination Address                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                    Options                    |    Padding    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    这可以通过编程方式完成,如下所示:

    struct.unpack('!BBHHHBBHII')
    # alternatively:
    struct.unpack('!BBHHHBBH4s4s')
    
    我更喜欢后者,因为您可以相当轻松地将其转换为IP地址:

    以太网报头示例:

    0000   3c 4a 92 1f 04 00 74 c6 3b 8d 82 69 08 00 45 00  <J....t.;..i..E.
    0010   00 3c 0a 24 40 00 40 06 23 76 0a 14 01 0d 01 01  .<.$@.@.#v......
    0020   01 01 e7 7a 04 d2 a2 5e 0c d2 00 00 00 00 a0 02  ...z...^........
    0030   72 10 0d 51 00 00 02 04 05 b4 04 02 08 0a 9c d4  r..Q............
    0040   c0 c0 00 00 00 00 01 03 03 07                    ..........
    
    索引8和9分别是源IP和目标IP。因为它们是字节,我们可以将它们转换为
    int
    ,然后再转换为
    str
    ,以获取字符串格式的IP:

    # Note: Python 3 only
    >>> ip_src = '.'.join(map(str, header[8]))  # 10.20.1.13
    >>> ip_dst = '.'.join(map(str, header[9]))  # 1.1.1.1
    
    IP标头具有和。你决定用字节和短片来解包。一般来说,您希望将每个字段的大小与正确的数据类型相匹配。查看适当的标题大小,您可以看到各个细分:

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |Version|  IHL  |Type of Service|          Total Length         |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         Identification        |Flags|      Fragment Offset    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |  Time to Live |    Protocol   |         Header Checksum       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                       Source Address                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                    Destination Address                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                    Options                    |    Padding    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    这可以通过编程方式完成,如下所示:

    struct.unpack('!BBHHHBBHII')
    # alternatively:
    struct.unpack('!BBHHHBBH4s4s')
    
    我更喜欢后者,因为您可以相当轻松地将其转换为IP地址:

    以太网报头示例:

    0000   3c 4a 92 1f 04 00 74 c6 3b 8d 82 69 08 00 45 00  <J....t.;..i..E.
    0010   00 3c 0a 24 40 00 40 06 23 76 0a 14 01 0d 01 01  .<.$@.@.#v......
    0020   01 01 e7 7a 04 d2 a2 5e 0c d2 00 00 00 00 a0 02  ...z...^........
    0030   72 10 0d 51 00 00 02 04 05 b4 04 02 08 0a 9c d4  r..Q............
    0040   c0 c0 00 00 00 00 01 03 03 07                    ..........
    
    索引8和9分别是源IP和目标IP。因为它们是字节,我们可以将它们转换为
    int
    ,然后再转换为
    str
    ,以获取字符串格式的IP:

    # Note: Python 3 only
    >>> ip_src = '.'.join(map(str, header[8]))  # 10.20.1.13
    >>> ip_dst = '.'.join(map(str, header[9]))  # 1.1.1.1
    

    关于你的最后一段,到
    int
    的转换在哪里?我说错了。在Python3中,遍历字节字符串将自动将每个字节转换为
    int
    \n
    的值为0x0a或十进制的10<代码>映射(str,…)会将其转换为
    “10”
    ,而不是
    10
    。我假设他使用的是python3,因为我没有看到
    print\u函数
    importYeah,我使用的是python3。目标地址与
    ipconfig
    中我的计算机或路由器IP地址不匹配,当我
    ping
    cmd.exe中的源地址和目标地址时,我会收到“请求超时”。@Goodies-Grate-Answer,您说“您希望将每个字段的大小与正确的数据类型匹配。”在这里,我检查并获取此协议的正确类型其他协议,如以太网(“!6s6sH”)。关于最后一段,到
    int
    的转换在哪里?我说错了。在Python3中,遍历字节字符串将自动将每个字节转换为
    int
    \n
    的值为0x0a或十进制的10<代码>映射(str,…)会将其转换为
    “10”
    ,而不是
    10
    。我假设他使用的是python3,因为我没有看到
    print\u函数
    importYeah,我使用的是python3。目标地址与
    ipconfig
    中我的计算机或路由器IP地址不匹配,当我
    ping
    cmd.exe中的源地址和目标地址时,我会收到“请求超时”。@Goodies-Grate-Answer,您说“您希望将每个字段的大小与正确的数据类型匹配。”在这里,我检查并获取此协议的正确类型,其他协议如以太网(“!6s6sH”)。