Python sr*()方法不解析scapy中的应答数据包

Python sr*()方法不解析scapy中的应答数据包,python,scapy,Python,Scapy,我扩展了Scapy以支持新的测试协议。我发现sniff()命令能够在我使用bind\u layers()将两层缝合在一起后自动解析数据包。我原以为这对解剖来说已经足够好了。每当我使用sniff()时,我都会看到解剖正在工作 但是,当我使用sr()或sr1()函数时,我发现应答的数据包没有被解析,并将其报告为Raw。我还看到它有一些额外的数据包作为应答的一部分 有关正在添加的协议的更多详细信息: 我添加的协议是基于tcp的PCEP协议,在端口4189上运行。我创建了一个python套接字,并使用S

我扩展了Scapy以支持新的测试协议。我发现
sniff()
命令能够在我使用
bind\u layers()
将两层缝合在一起后自动解析数据包。我原以为这对解剖来说已经足够好了。每当我使用
sniff()
时,我都会看到解剖正在工作

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

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

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

数据包将按如下方式分层:IP()/TCP()/PCEP()

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

>>> 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' |>        
>a[0][0]
>>>a[0][1]

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

connection, pcc_address = pce.accept()
pcc_client = StreamSocket(connection, basecls=PCEPCommonHeader)
然后您将需要实现
hashret()
答案
。他们的
数据包中的docstring很好地解释了这一点:

  • hashret()
    是一种哈希函数,它“返回一个字符串,该字符串对于请求及其答案具有相同的值”
  • answers()

hashret()
不是强制性的,但如果正确实施,它将提高性能。

您没有提供足够的有关您输入的命令(例如
sr()
调用参数)和您创建的协议的信息。感谢您的回复。这是否仅适用于与sr()相关的函数?另外,当我按照您的建议将basecls作为StreamSocket的一部分添加时,我发现现在sr()函数并没有返回它的值,我想这只是为了得到一个答案。。开始发射:完成发送1个数据包。。看起来我们需要重载answers()/hashret(),以便scapy检测发送数据包的应答。我不确定在这些函数中添加什么。你能帮我理解这两个函数的用法吗?我看到解析现在可以工作了,sr()没有被困在等待回复中。我确实遇到了一个小问题,我看到接收缓冲区被累积,从而导致解析问题。假设我使用pkt=pcc_client.recv(),我看到pkt有2到3条消息。相反,我希望能够在收到一条消息后立即解析它。我应该减少缓冲区大小吗?我看到sniff()工作得很好,它们使用recv(MTU)。请告诉我,我真的不理解你的问题。你应该问另一个问题,并用一些代码解释它。
>>>pcc_client.sr1(pccinit)
>>> 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' |>        
connection, pcc_address = pce.accept()
pcc_client = StreamSocket(connection, basecls=PCEPCommonHeader)