Стек протоколов LWIP, блокировка интерфейса отправки

Вопрос или проблема

Используя стек протоколов LWIP для TCP-связи, устройство работало как TCP-сервер в течение некоторого времени и застряло в интерфейсе отправки: send (socket_num, (const void *) msg, len, 0). Кроме того, после повторных тестов это легко воспроизвести, когда устройство общается с ПК через внутреннюю сеть компании (возможно, через сложные сетевые обмены, в течение 1 часа); если устройство подключено напрямую к ПК, может потребоваться много времени для воспроизведения. Какова может быть причина этого? Сообщение в случае исключения выглядит следующим образом, но полезной информации не видно:(192.168.1.114 является сервером)

21190   153.099232  192.168.2.114   192.168.2.36    TCP 79  8080 → 11549 [PSH, ACK] Seq=38152 Ack=10695 Win=2062 Len=25 [TCP сегмент собранного PDU]
21191   153.099397  192.168.2.36    192.168.2.114   TCP 60  11549 → 8080 [PSH, ACK] Seq=10695 Ack=38177 Win=64010 Len=6
21192   153.105834  192.168.2.114   192.168.2.36    TCP 60  8080 → 11549 [ACK] Seq=38177 Ack=10701 Win=2056 Len=0
21193   153.106100  192.168.2.114   192.168.2.36    TCP 79  8080 → 11549 [PSH, ACK] Seq=38177 Ack=10701 Win=2056 Len=25 [TCP сегмент собранного PDU]
21194   153.106194  192.168.2.36    192.168.2.114   TCP 60  11549 → 8080 [PSH, ACK] Seq=10701 Ack=38202 Win=63985 Len=6
21201   153.319122  192.168.2.36    192.168.2.114   TCP 60  [TCP повторная передача] 11549 → 8080 [PSH, ACK] Seq=10701 Ack=38202 Win=63985 Len=6
21211   153.620255  192.168.2.36    192.168.2.114   TCP 60  [TCP повторная передача] 11549 → 8080 [PSH, ACK] Seq=10701 Ack=38202 Win=63985 Len=6

Ответ или решение

Анализ проблемы блокировки интерфейса отправки в стеке протоколов LWIP

В данной ситуации мы сталкиваемся с проблемой блокировки интерфейса отправки при использовании стека протоколов LWIP для TCP-соединений. Устройство функционирует как TCP-сервер и испытывает затруднения при отправке данных через сокет. Основываясь на предоставленных данных, можно сделать несколько выводов и предложений по выявлению и устранению данной проблемы.

Описание проблемы

Вы указали, что блокировка происходит во время вызова функции send(socket_num, (const void *) msg, len, 0). Это может свидетельствовать о нескольких потенциальных проблемах, связанных с состоянием сети или особенностями реализации протокола.

  1. Статус соединения: Во время блока устройства необходимо проверить, активно ли TCP-соединение. Если соединение было потеряно или закрыто с одной из сторон, это может привести к блокировке функции send, так как она ожидает подтверждения от другой стороны.

  2. Переполнение буфера: LWIP управляет буферизацией данных в памяти. Если буфер отправки заполнен неотправленными данными, вызов функции send может заблокироваться до тех пор, пока в нем не освободится место. Это может происходить в условиях перегруженной сети или при недостаточной скорости обработки данных на стороне получателя.

  3. Сетевые проблемы: Вы упомянули, что проблема воспроизводится чаще при взаимодействии устройства с ПК через внутреннюю сеть компании. Возможные проблемы в сети: перегрузка, конфликты на уровне маршрутизации, низкая пропускная способность каналов и т.д. Это может быть одной из причин увеличенного времени отклика или потери пакетов, что, в свою очередь, требует повторной передачи данных.

  4. Анализ трафика: Логи, которые вы предоставили, указывают на то, что происходит множество повторных отправок TCP (TCP Retransmission). Это подтверждает гипотезу о том, что данные не достигают получателя. Проблема может быть связана с блокировкой передач на уровне оборудования (например, коммутаторов) или с неправильной конфигурацией сетевых устройств.

Рекомендации по устранению проблемы

  1. Проверка состояния соединения: Перед вызовом функции send убедитесь, что соединение активно. Это можно сделать с помощью функций getsockopt и проверки состояния сокета.

  2. Оптимизация буферов: Рассмотрите настройки буферов LWIP. Возможно, потребуется увеличить размеры буферов отправки и приема, чтобы предотвратить их переполнение.

  3. Мониторинг сетевой активности: Используйте инструменты для мониторинга трафика, такие как Wireshark, чтобы выявить изменения в условиях сети и уровень потерь пакетов.

  4. Настройка таймаутов: Установите адекватные таймауты для операций send и recv, чтобы обеспечить быструю обработку блокировок. Это может помочь избежать зависания системы при длительных ожиданиях.

  5. Проведение тестирования: Рекомендуется протестировать сценарии подключения как через внутреннюю сеть, так и через прямое соединение с ПК, чтобы сравнить поведение и зафиксировать разницу в производительности и стабильности.

Заключение

Проблема блокировки интерфейса отправки в стеке LWIP является комплексной и может являться следствием как программных, так и сетевых факторов. Необходимо внимательно произвести анализ всех аспектов сетевой конфигурации и состояния передачи данных для эффективного устранения проблемы. Следуя предложенным рекомендациям, можно значительно улучшить стабильность и производительность TCP-соединений устройства.

Оцените материал
Добавить комментарий

Капча загружается...