sr*() 方法不在 scapy 中剖析回答的数据包

sr*() method not dissecting the answered packets in scapy

我扩展了 Scapy 以支持新的测试协议。我看到 sniff() 命令能够在我使用 bind_layers() 将 2 层拼接在一起后自动分解数据包。我期望这应该足以进行解剖。每当我使用 sniff() 时,我都会看到解剖正在工作。

但是,当我使用 sr()sr1() 函数时,我发现未解析已回答的数据包,Scapy 将其报告为 Raw。我还看到它有一些额外的数据包作为回答的一部分。

有关正在添加的协议的更多详细信息:

我添加的协议是基于 tcp 的 PCEP 协议,在端口 4189 上运行。我创建了一个 python 套接字并使用 StreamSocket() 将其转换为 scapy 超级套接字。我们在 scapy 的超级套接字之上发送这些 PCEP 消息。

数据包将像这样分层:IP()/TCP()/PCEP()

connection, pcc_address = pce.accept() <---- This accepts a TCP connection from the client
pcc_client=StreamSocket(connection) <---- Here I convert the python socket into scapy super socket.

示例数据包:

如果我想发送保活消息,这就是我制作消息的方式。 pcc_client对象是发送数据包。

>>>>>> pkt.show2()
###[ PCEP common header ]###
  Version= 1L
  Flags= 0L
  Type= PCEPKeepaliveMsg
  Length= 4
>>>  pcc_client.send(pkt) 
>>> pcc_client
<scapy.supersocket.StreamSocket object at 0x115b890>

问题:

与我创建一条名为 PCInitiate 的消息并使用

发送的方式相同
>>>pcc_client.sr1(pccinit)

下面a[0][0]是我发送的数据包,接收到的数据包存储为Raw。我期待它被解剖。出于某种原因,我看到它没有被解剖。我还注意到一堆字符串 ' \x02\x00\x04' 附加到 UUT 的响应。我可以识别这些字符串,它们是 Keepalive 消息。这些不是对我发送的数据包的响应,但它以某种方式显示在此输出中。如何使 sr() 函数解析来自 UUT 的响应。我看到 hashret()answers() 方法在 sndrcv() 中使用。这些方法有什么用。有人可以帮我查询吗?

>>> a[0][0]
<PCEPCommonHeader  Type=PCInitiate |<PCInitiate  srp_object=<SRP_Object  srpIdNumber=0x10     path_setup_type=<path_setup_type_tlv  |> |> lsp_object=<LSP_Object  plspid=0x0 symbolic_path_name=    <symbolic_path_name_tlv  tlvValue='SERVICE-1418979625354-9F1166-10.126.147.23-10.126.147.1' |> |>     end_points_object=<End_Points_Object  SourceIPv4Address=10.0.0.1 DestinationIPv4Address=10.0.0.6 |>     ero_object=<ERO_Object  sr_eros=[<SR_ERO_SubObject  Fflag=F Mflag=M SID=2260992 |>, <SR_ERO_SubObject      Fflag=F Mflag=M SID=2674688 |>, <SR_ERO_SubObject  Fflag=F Mflag=M SID=3096576 |>] |> |>>
>>> a[0][1]
<Raw  load=' \n\x00x!\x10\x00\x14\x00\x00\x00\x00\x00\x00\x00\x10\x00\x1b\x00\x04\x00\x00\x00\x01 \x10\x00DT\x00`\x91\x00\x11\x007SERVICE-1418979625354-9F1166-10.126.147.23-10.126.147.1\x00\x07\x10\x00\x1c\x05\x08\x10\t\x00"\x80\x00\x05\x08\x10\t\x00(\xd0\x00\x05\x08\x10\t\x00/@\x00 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04' |>        

您必须告诉 StreamSocket 它将接收的数据包类型(Raw 是默认值)。您可以使用 basecls= 可选参数来做到这一点:

connection, pcc_address = pce.accept()
pcc_client = StreamSocket(connection, basecls=PCEPCommonHeader)

然后您将需要实施 hashret()answers。他们来自 Packet 的文档字符串解释得很好:

  • hashret()是"returns a string that has the same value for a request and its answer".
  • 的一种哈希函数
  • answers() 是 "true if self is an answer to other".

hashret() 不是强制性的,但如果实施得当会提高性能。