【问题标题】:Python UDP socket has packet loss every 65536 packetsPython UDP套接字每65536个数据包丢失一次
【发布时间】:2019-06-05 01:02:28
【问题描述】:

我正在使用python套接字接收FPGA发送的UDP数据包,并带有一个自定义的帧计数器来指示数据包丢失。我的问题是接收到的数据每收到 65536 个数据包丢失 4 个数据包。 Windows 套接字是否有 65536 个数据包限制? 我无法在我的帖子中嵌入图片。我将在下面输入运行结果:

start: 395070354
end: 395344794
Number of packets: 274441
Missing 4 packet from: 395115893 to: 395115898 distance from start: 45539
Missing 4 packet from: 395181429 to: 395181434 distance from start: 45539
Missing 4 packet from: 395246965 to: 395246970 distance from start: 45539
Missing 4 packet from: 395312501 to: 395312506 distance from start: 45539
Number of missing packets: 16

正如您从结果中看到的那样,它非常有规律。 395181434-395115898=65536。每 65536 个数据包丢失 4 个数据包。

我试过减慢传输速度。我认为这可能是缓冲区大小问题。我使用 setsockopt 函数更改了 RECVBUF 大小,但它不起作用。

import socket
import time
import threading

def receive():
    global data
    while not kill.is_set():
        data.append(fpga.recvfrom(512)[0])

fpga = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
fpga.bind(('192.168.253.8', 34))
miss=0
data=[]
kill=threading.Event()
p=threading.Thread(target=receive)
p.start()
time.sleep(10)
kill.set()
count=len(data)
start=int.from_bytes(data[0][0:4], byteorder='big')
end=int.from_bytes(data[count-1][0:4], byteorder='big')
print("start: ",start)
print("end: ",end)
print("Number of packets: ",end-start+1)
for i in range(0,count-1):
    current=int.from_bytes(data[i][0:4], byteorder='big')
    next=int.from_bytes(data[i+1][0:4], byteorder='big')
    if next < current:
        print("out of order detected!!!")
        break
    step=next-current
    miss=miss+step-1
    if step > 1:
        print("Missing ",step-1," packet form: ",current," to: ",next,"distance form start: ",current-start)
print("Number of missing packets: ",miss)

【问题讨论】:

  • 我注意到的第一件事:range(0,count-1) 将有 count-1 项目。所以我想知道您是否正在处理最后一项。
  • @KlausD。 OP 这样做是为了他们可以“成对”比较数据包(即currentnext 变量)。 “丢失的数据包”也在中间,而不仅仅是“最后一个”项目。
  • 你能绝对确认发送端正在发送所有数据包/正确构造它们吗?如果您使用不同的 UDP 客户端,它们是否成功/不同地接收?
  • Wireshark 可以正确捕获所有数据包。所以,我认为这个问题与我的 FPGA 设计无关。
  • 网络堆栈问题并非未知 - 下一步是确认数据包是否到达您的 python 代码。或者您可以使用其他客户端,看看它是否显示相同的差距?

标签: python sockets networking


【解决方案1】:

我怀疑这与 Windows 有什么关系,我希望它故意丢弃数据包,因为它们格式错误/不符合规范(例如校验和计算不正确,这是一个 16 位数字)

为了弄清楚发生了什么,我建议使用数据包嗅探器(例如 Wireshark、tcpdump、Scapy)来记录您的 Python 脚本看到的相同流量。如果幸运的话,过滤“格式错误”的数据包会发现“丢失的”数据包。否则,您可以尝试在捕获的网络流量中查找数据包,其中有一个序列号应该很容易。您还可以更改您的 Python 代码以记录时间戳,这可能有助于缩小范围

【讨论】:

  • 也许,我必须改用 pyshark。
  • 谢谢。这实际上是校验和问题。在校验和计算的最后一步,将高 16 位与低 16 位相加,得到 0xffff。
猜你喜欢
  • 2020-06-23
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2014-11-26
  • 1970-01-01
  • 2011-12-05
  • 2015-06-30
相关资源
最近更新 更多