如何使用 scapy 收到一个数据包的两个答案?
How can I receive two answers to one packet using scapy?
我正在使用 scapy 在 Python 中开发类似 TCP 服务器的东西。
一个典型的 TCP 服务器应该是这样工作的。
- 首先,它通过调用
sniff
等待传入的 SYN 数据包。
- 其次,它在单个调用中发送 SYNACK 并等待 ACK 响应,这是通过
sr1
调用完成的。
- 第三,它通过调用
sniff
. 等待带有客户端请求的传入数据包
但问题是请求数据包可以在 sr1
和第二个 sniff
之间到达并因此丢失,因为 sniff
不会捕获在它被调用之前到达的数据包。
(我可以用 Wireshark 看到一个数据包正在到达)。
如何在一次调用中发送 SYNACK 并接收 ACK 和请求,'atomically'?
(在典型的TCP连接中,客户端会在超时后重新发送带有请求的数据包,但根据我的任务条件,没有重新发送数据包,数据包不会丢失)。
您可以创建一个 scapy 套接字并在其上调用 sr1
或 sniff
。例如
from scapy.config import conf
sock = conf.L3socket()
sock.sr1(....)
sock.sniff(...)
因为是同一个套接字,所以不会丢失任何数据包
我正在使用 scapy 在 Python 中开发类似 TCP 服务器的东西。 一个典型的 TCP 服务器应该是这样工作的。
- 首先,它通过调用
sniff
等待传入的 SYN 数据包。 - 其次,它在单个调用中发送 SYNACK 并等待 ACK 响应,这是通过
sr1
调用完成的。 - 第三,它通过调用
sniff
. 等待带有客户端请求的传入数据包
但问题是请求数据包可以在 sr1
和第二个 sniff
之间到达并因此丢失,因为 sniff
不会捕获在它被调用之前到达的数据包。
(我可以用 Wireshark 看到一个数据包正在到达)。
如何在一次调用中发送 SYNACK 并接收 ACK 和请求,'atomically'?
(在典型的TCP连接中,客户端会在超时后重新发送带有请求的数据包,但根据我的任务条件,没有重新发送数据包,数据包不会丢失)。
您可以创建一个 scapy 套接字并在其上调用 sr1
或 sniff
。例如
from scapy.config import conf
sock = conf.L3socket()
sock.sr1(....)
sock.sniff(...)
因为是同一个套接字,所以不会丢失任何数据包