Вопрос или проблема
Используя стек протоколов 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)
. Это может свидетельствовать о нескольких потенциальных проблемах, связанных с состоянием сети или особенностями реализации протокола.
-
Статус соединения: Во время блока устройства необходимо проверить, активно ли TCP-соединение. Если соединение было потеряно или закрыто с одной из сторон, это может привести к блокировке функции
send
, так как она ожидает подтверждения от другой стороны. -
Переполнение буфера: LWIP управляет буферизацией данных в памяти. Если буфер отправки заполнен неотправленными данными, вызов функции
send
может заблокироваться до тех пор, пока в нем не освободится место. Это может происходить в условиях перегруженной сети или при недостаточной скорости обработки данных на стороне получателя. -
Сетевые проблемы: Вы упомянули, что проблема воспроизводится чаще при взаимодействии устройства с ПК через внутреннюю сеть компании. Возможные проблемы в сети: перегрузка, конфликты на уровне маршрутизации, низкая пропускная способность каналов и т.д. Это может быть одной из причин увеличенного времени отклика или потери пакетов, что, в свою очередь, требует повторной передачи данных.
-
Анализ трафика: Логи, которые вы предоставили, указывают на то, что происходит множество повторных отправок TCP (TCP Retransmission). Это подтверждает гипотезу о том, что данные не достигают получателя. Проблема может быть связана с блокировкой передач на уровне оборудования (например, коммутаторов) или с неправильной конфигурацией сетевых устройств.
Рекомендации по устранению проблемы
-
Проверка состояния соединения: Перед вызовом функции
send
убедитесь, что соединение активно. Это можно сделать с помощью функцийgetsockopt
и проверки состояния сокета. -
Оптимизация буферов: Рассмотрите настройки буферов LWIP. Возможно, потребуется увеличить размеры буферов отправки и приема, чтобы предотвратить их переполнение.
-
Мониторинг сетевой активности: Используйте инструменты для мониторинга трафика, такие как Wireshark, чтобы выявить изменения в условиях сети и уровень потерь пакетов.
-
Настройка таймаутов: Установите адекватные таймауты для операций
send
иrecv
, чтобы обеспечить быструю обработку блокировок. Это может помочь избежать зависания системы при длительных ожиданиях. -
Проведение тестирования: Рекомендуется протестировать сценарии подключения как через внутреннюю сеть, так и через прямое соединение с ПК, чтобы сравнить поведение и зафиксировать разницу в производительности и стабильности.
Заключение
Проблема блокировки интерфейса отправки в стеке LWIP является комплексной и может являться следствием как программных, так и сетевых факторов. Необходимо внимательно произвести анализ всех аспектов сетевой конфигурации и состояния передачи данных для эффективного устранения проблемы. Следуя предложенным рекомендациям, можно значительно улучшить стабильность и производительность TCP-соединений устройства.