Python套接字相互窃取';s包

Python套接字相互窃取';s包,python,python-3.x,sockets,multiprocessing,python-multithreading,Python,Python 3.x,Sockets,Multiprocessing,Python Multithreading,我正试图编写一个程序来测试不同大小数据包的并行数据传输速度。不过,我注意到一些奇怪的事情,根据我的程序,数据包的大小似乎对传输时间没有影响,而Unixping二进制文件会在我使用的一些数据包大小上超时。我发送了4个包含字符串“testquest”的数据包,其中一个数据包的大小仅为2000字节,设置为0。然而,当我打印结果时,它们都包含“testquest”(并且远小于2000字节)。我唯一能得出的结论是,这些套接字不知何故都在接收相同的数据包,这可以解释为什么它们都具有相同的rtt 我制作这个M

我正试图编写一个程序来测试不同大小数据包的并行数据传输速度。不过,我注意到一些奇怪的事情,根据我的程序,数据包的大小似乎对传输时间没有影响,而Unix
ping
二进制文件会在我使用的一些数据包大小上超时。我发送了4个包含字符串“testquest”的数据包,其中一个数据包的大小仅为2000字节,设置为0。然而,当我打印结果时,它们都包含“testquest”(并且远小于2000字节)。我唯一能得出的结论是,这些套接字不知何故都在接收相同的数据包,这可以解释为什么它们都具有相同的rtt

我制作这个MCVE是为了说明这个问题(您可以忽略“checksum”函数,它是为了完整性而包含的,但根据经验我知道它是有效的):

但现在请注意,当我尝试使用
ping
发送大小为2048的数据包时会发生什么:

user@mycomputer ~/src/connvitals $ time ping -c1 -s2048 $box
PING <hostname redacted> (<IP address redacted>): 2048 data bytes

--- <hostname redacted> ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss

real  0m11.018s
user  0m0.005s
sys   0m0.008s
user@mycomputer~/src/connvitals$time ping-c1-s2048$box
PING():2048个数据字节
---ping统计---
发送1个数据包,接收0个数据包,100.0%数据包丢失
实0m11.018s
用户0.005s
sys 0m0.008s
数据包不仅会被丢弃,而且需要11秒才能完成!那么,如果我的超时设置为100ms,那么为什么这个数据包只在~0.04ms的时间内从我的python脚本获得“成功”响应呢

提前感谢您提供的任何帮助

更新:
我刚刚再次检查,似乎是多个套接字造成了问题,线程似乎与此无关。当我按顺序ping每个套接字,然后立即关闭它时,我会遇到同样的问题

所有套接字都相同,并且都绑定到同一主机。数据包中根本没有任何信息让内核知道去哪个套接字,似乎暗示所有套接字都将接收它们


您可能会在所有线程中得到所有响应,这意味着每个线程得到的响应是您预期的12倍。

但这难道不意味着即使我不知道哪个套接字使用这些响应,它们也会被使用吗?如果是这样的话,它们中的一些仍然应该超时。有可能(可能,离开手册页)它将进入所有套接字,这意味着你得到的数据包是你预期的12倍,因此每个人都有足够的数据包。我将修改我的答案。我尝试在
0.0.0.0
上将每个端口绑定到不同的端口,但不起作用-相同的问题。一次只需要一个套接字监听一个地址吗?如果是这样,我不知道对远程主机执行线程ping的可能性有多大……ICMP(本身)没有端口。你必须在数据包中放入一些东西来区分它们,然后丢弃那些不相关的。这是数据段中标识符和序列号字段的常规用途。每个线程的套接字只侦听一个数据包,然后ping返回。这些时间太小,不可能被认为是重要的。您的ICMP数据包似乎缺少ICMP头的一部分,因此所有数据包都具有相同的ID和序列号(0)。因此,答复难以区分。因此,每个套接字都会看到第一个回复,并使所有套接字接收数据包并返回。我省略了id和sequence字段,因为我假设每个套接字将代表一个单独的连接,并且由于每个连接只发送一个数据包,因此无需区分sequence和id。如果不是这样,你是说套接字只会以某种方式使用它发送的具有相同标识符的数据包吗?因为我正在从头开始为原始套接字构建这些数据包,所以我不知道这是怎么可能的;我可以很容易地从同一个套接字发送多个标识符。您的SOCK_原始icmp数据包中没有“连接”信息。通过使用该API,您已经同意,无论您如何定义“连接”,都将实现“连接”背后的所有解复用逻辑。ICMP在标头中为标识符提供空间,但您必须实现在传输和接收时使用它们的逻辑。
0
0
(24, 15.784025192260742)
(28, 0.04601478576660156)
(28, 0.025033950805664062)
(28, 0.033855438232421875)
(28, 0.03528594970703125)
(28, 0.04887580871582031)
(28, 0.05316734313964844)
(28, 0.03790855407714844)
(28, 0.0209808349609375)
(28, 0.024080276489257812)
user@mycomputer ~/src/connvitals $ time ping -c1 -s2048 $box
PING <hostname redacted> (<IP address redacted>): 2048 data bytes

--- <hostname redacted> ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss

real  0m11.018s
user  0m0.005s
sys   0m0.008s