我们可以将srp()函数用于第3层ICMP数据包吗?我看到当我们制作ICMP echo-request数据包并使用sr()发送/接收时,我们看不到它被发送出接口,因此没有来自目的地的响应.但是如果我们使用srp()函数,我们会看到相同的数据包响应.什么时候应该使用sr()和srp()?在文档中,它声明sr()将用于L3数据包,而srp()将用于L2?但在我的情况下,我不确定为什么sr()不适用于ICMP数据包?有些专家可以帮我理解吗?
如果总是需要"iface"论证,也有人可以告诉我.没有它,scapy将如何知道它应该发送数据包的接口?
情况1:使用iface作为参数的sr()函数:
sr(icmp,iface="eth0")
Run Code Online (Sandbox Code Playgroud)
开始排放:
WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
^C
Received 0 packets, got 0 answers, remaining 1 packets
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>)
Run Code Online (Sandbox Code Playgroud)
上面我没有看到来自IP 192.168.25.1的任何ICMP响应
案例2:没有iface的sr()函数:
sr(icmp)
.Begin emission:
......WARNING: Mac address to reach destination not found. Using broadcast.
.Finished to send 1 packets.
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C
Received 887 packets, got 0 answers, remaining 1 packets
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 …Run Code Online (Sandbox Code Playgroud) 我是scapy的新手,我正在尝试使用sr和sr1函数来理解他们的工作.
我试图制作以下数据包,我发现它已经发送了1个数据包,但它说它收到了581个数据包.有人可以帮助我理解为什么它显示了这么多收到的数据包.
收到1373个数据包,得到0个答案,剩下1个数据包
>>> p=sr(IP(dst="192.168.25.1")/TCP(dport=23))
.Begin emission:
.....Finished to send 1 packets.
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C
Received 581 packets, got 0 answers, remaining 1 packets
>>> p
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:1 UDP:0 ICMP:0 Other:0>)
Run Code Online (Sandbox Code Playgroud)
我的TCPDump输出没有显示它收到这么多数据包.
我试图了解类方法.根据我的阅读,我们必须在定义时将cls作为第一个参数传递给类方法(类似于我们将self作为第一个参数传递的实例方法).但是我看到即使我将self作为类方法的第一个参数传递它也能工作.谁能解释一下这是如何工作的?
我已经看到他们将类定义为类方法的一些用法,但他们仍然将self作为第一个参数而不是cls.我想了解用法.
#!/usr/bin/python
class A(object):
def foo(self,x):
print "executing foo(%s,%s)"%(self,x)
@classmethod
def class_foo(self,x):
print "executing class_foo(%s,%s)"%(self,x)
>>> A.class_foo(2)
executing class_foo(<class '__main__.A'>,2)
>>>
Run Code Online (Sandbox Code Playgroud) 我是python日志记录模块的新手.我正在尝试以html格式写入日志.我想将所有日志写入同一个文件.所有INFO日志都没有时间戳,所有其他严重性级别将在日志中包含时间戳.我该怎么做呢?我已经在python日志记录中看到了一些示例,但它显示了在多个目的地中如何做到这一点.我想知道是否有一种方法可以根据严重性级别指定不同的格式化程序.
https://docs.python.org/2/howto/logging-cookbook.html#logging-to-multiple-destinations
我试图理解 PacketListField 和 FieldListField 之间的区别。有人可以让我知道在添加新协议时如何使用它们吗?
我也不清楚StrLenField、FieldLenField和PacketLenField。我正在尝试制作一条 BGP 更新消息,以便我能够了解它是如何工作的。我看到这就是 BGPUpdate 消息的定义方式。当我尝试制作 BGP 数据包时,我不确定如何传递“撤回路由”字段和 nlri 字段的值。我也不确定如何传递路径属性的值。
>>> pkt=BGPUpdate()
>>> pkt.show()
###[ BGP Update fields ]###
withdrawn_len= None
withdrawn= []
tp_len= None
\total_path\
nlri= []
>>>
class BGPPathAttribute(Packet):
"the attribute of total path"
name = "BGP Attribute fields"
fields_desc = [
FlagsField("flags", 0x40, 8, ["NA0","NA1","NA2","NA3","Extended-Length","Partial","Transitive","Optional"]), #Extened leght may not work
ByteEnumField("type", 1, {1:"ORIGIN", 2:"AS_PATH", 3:"NEXT_HOP", 4:"MULTI_EXIT_DISC", 5:"LOCAL_PREF", 6:"ATOMIC_AGGREGATE", 7:"AGGREGATOR"}),
ByteField("attr_len", None),
StrLenField("value", "", length_from = lambda p: p.attr_len),
]
def post_build(self, p, pay): …Run Code Online (Sandbox Code Playgroud)