У сокета Python UDP есть потеря пакетов каждые 65536 пакетов - PullRequest
0 голосов
/ 10 января 2019

Я использую сокет python для получения пакетов UDP, отправленных FPGA с определенным им счетчиком кадров, чтобы указать потерю пакетов. Моя проблема заключается в том, что полученные данные потеряли 4 пакета на каждые 65536 полученных пакетов. Есть ли в сокете 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)

1 Ответ

0 голосов
/ 10 января 2019

Я сомневаюсь, что это как-то связано с Windows, я ожидал бы, что он намеренно отбрасывает пакеты, потому что они искажены / не соответствуют спецификации (например, неправильно вычислена контрольная сумма, то есть 16-битное число)

чтобы выяснить, что происходит, я бы предложил использовать анализатор пакетов (например, Wireshark, tcpdump, Scapy) для записи того же трафика, который видит ваш скрипт Python. Если вам повезет, фильтрация «искаженных» пакетов найдет «пропущенные» пакеты. в противном случае, вы можете попытаться найти пакеты в перехваченном сетевом трафике, имея порядковый номер там, чтобы сделать это довольно легко. Вы также можете изменить свой код Python для записи временных меток, что может помочь немного сузить круг

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...