Сегменты большого TCP-пакета теряются во время связи - PullRequest
0 голосов
/ 10 июля 2020

Я работаю над приложениями, которые обмениваются данными через канал TCP через библиотеку windivert. Он отлично работает для небольших пакетов, но в случае больших пакетов TCP, то есть более 10000 байт, сегменты теряются во время передачи. Ниже приведен сценарий:

  • 11086 байтов данных, разделенных на 20 сегментов по 536 байтов
  • Я получаю случайные пакеты, т.е. иногда 18 или 19, а иногда все пакеты
  • В случае потери пакетов отправляется DUP ACK или происходит повторная передача
  • Иногда пакеты поступают не в порядке
  • Для каждого пакета, который получает приложение, отправляется ACK

Это связано с тайм-аутом ACK или чем-то еще?

1 Ответ

1 голос
/ 10 июля 2020

Windivert не пытается сохранить порядок пакетов. Как говорится в документации:

WinDivert может привести к неправильному порядку пакетов : простой запуск программы-примера passthru.exe может привести к неправильному порядку пакетов . Это не ошибка, поскольку для пакетов не требуется оставаться в порядке. Однако это может повлиять на другое программное обеспечение с ошибками (например, некоторые реализации NAT с ошибками), которые неправильно предполагают, что пакеты находятся в порядке. пакеты будут потеряны. Как сказано в документации:

Пакеты / события не ставятся в очередь на неопределенный срок, и если их не обработать своевременно, данные могут быть потеряны. Время, в течение которого пакет / событие находится в очереди, можно контролировать с помощью функции WinDivertSetParam () .

Вы не описываете никаких серьезных последствий или не указываете c проблемы, так что я бы сказал, что все, что вы описываете, вероятно, нормально.

И последнее: не существует такой вещи, как «большой TCP-пакет». Вы просто говорите о случаях, когда нужно отправить много данных или большое количество TCP-пакетов получено примерно в одно и то же время.

...