Как установить таймаут повторной сборки UDP-пакета в Windows 10
В настоящее время я разрабатываю приложение для получения изображений в Visual C++, которое получает данные изображения от аппаратного устройства UDP с ограниченными возможностями (т.е. без контрольной суммы UDP). Устройство имеет соединение GBit с выделенным коммутатором, а ПК использует выделенную сетевую карту и соединение 10 Гбит с этим коммутатором.
Переданные данные изображения состоят из пакетов размером от 6528 до 19680 байтов. Эти пакеты фрагментируются аппаратным устройством и восстанавливаются сетевым стеком на ПК.
Иногда пакет (назовите его package #4711) теряется, и сторона ПК пытается восстановить его в течение длительного времени. В течение этого промежутка времени аппаратным устройством отправляется новый пакет с таким же упакованным идентификатором из-за переполнения 16-битного идентификатора пакета. Теперь ПК получает новые фрагменты для (нового) пакета # 4711 и использует его для завершения старого, еще не разобранного пакета, и собирает поврежденный пакет. В довершение всего, оставшиеся фрагменты нового пакета # 4711 сохраняются и объединяются со следующим #4711 (который будет получен через несколько секунд). Таким образом, чем дольше работает система, тем больше идентификаторов пакетов будут скомпрометированы, пока связь не станет возможной.
Мы не можем вычислить контрольную сумму UDP на аппаратном устройстве из-за его ограниченных возможностей.
Мы не можем использовать IPv6 (который предлагал бы большие идентификаторы пакетов), потому что нет никакой поддержки для аппаратного устройства.
Нам придется реализовать наш собственный протокол поверх UDP и "вручную" фрагментировать и реконструировать данные, но мы могли бы избежать этого, если бы мы могли найти способ сократить время восстановления пакета в Windows до 500 мс или меньше.
Я искал информацию в Google и Stackru, но результатов не так много, и ни один из них не помог.
Отсюда вопрос: есть ли способ уменьшить время восстановления для фрагментов UDP IPv4 в Windows 10 через реестр, Windows API или любое другое волшебство, или у вас есть лучшее предложение?
1 ответ
Начиная с Windows 2000, она жестко запрограммирована, поэтому нет никакого официального способа изменить время ожидания повторной сборки ip-пакета из-за строгой совместимости с RFC 2460.
Подробности можно прочитать здесь: https://blogs.technet.microsoft.com/nettracer/2010/06/03/why-doesnt-ipreassemblytimeout-registry-key-take-effect-on-windows-2000-or-later-systems/
В настоящее время кажется, что единственная возможность использовать raw-сокеты, которые ограничены начиная с Windows 7 и доступны не для каждого поставщика сокетов. Это сделало бы приложение намного более сложным.
Мы изменим наш программный протокол так, чтобы никакие пакеты> 1400 байт вообще не отправлялись. Это заставляет нас заботиться о фрагментации в нашем программном обеспечении, но предотвращает фрагментацию IP-пакетов и все их ловушки. Возможно, это правильный способ справиться с такими проблемами.