
У меня есть два сервера, и я использовал собственную встроенную систему с LwIP для подключения к этим серверам.
Моя встроенная система с LwIP является клиентом, и у меня есть server1 и server2. Я подключился к server1 и завершил соединение перед подключением к server2.
Дальнейшая разбивка по потоку:
- Клиент создает новый сокет с сервером1
- Клиент отправил DNS-пакет для получения IP-адреса сервера 1; получил ACK от точки доступа
- Клиент отправляет пакет TCP SYN;
- Сервер 1 отправляет TCP SYN-ACK и выполняет некоторую передачу данных
- Клиент завершает соединение с сервером server1, отправляя пакет TCP RST; и закрывает сокет
- Клиент создает новый сокет с сервером2
- Клиент отправил DNS-пакет для получения IP-адреса сервера2; получил ACK от точки доступа
- Клиент отправляет пакет TCP SYN на сервер2
- Сервер2 отправляет TCP SYN-ACK и выполняет некоторую передачу данных
- Клиент завершает соединение с сервером server2, отправляя пакет TCP RST; и закрывает сокет
Однако иногда server2 не отвечал на SYN-пакет клиента, который находится на шаге 9. Это случается только иногда. Я проверил несколько форумов, например:
[1]Почему сервер не отправляет пакет SYN/ACK в ответ на пакет SYN
[2]Сервер не отправляет пакет SYN/ACK в ответ на пакет SYN
Мой код не включает масштабирование окна. Я не могу проверить сервер, так как это частный сервер, поэтому я не уверен, что он был удален. Моя среда довольно шумная и занята множеством маршрутизаторов и коммуникационных устройств. Эта проблема возникает только в шумной среде, но не в более чистой среде.
Что я как клиент могу сделать, чтобы решить эту проблему?
решение1
Несколько идей о том, почему иногда ваш сервер не отвечает SYN-ACK:
- Приложение на сервере останавливается при отправке пакета SYN: это может быть сбой, а затем снова работать с помощью механизма автоматического перезапуска программы. Когда приложение сервера останавливается или дает сбой, прослушивающий сокет tcp закрывается, поэтому ОС не отвечает.
- У вашего сервера возникли некоторые проблемы с поиском вашего клиента. Это может быть проблема с маршрутизацией или асимметричная маршрутизация (это ломает брандмауэр).
- Если клиент и сервер находятся в одной сети, это может быть связано с проблемой уровня 2, например, с протоколом Spanning Tree или ARP.
- Потеря пакетов в сети: ваш пакет SYN или SYN ACK потерян.
- Сервер перегружен и иногда не может ответить на ваш SYN-пакет.
Может быть множество причин, по которым сервер может не ответить на SYN-пакет.
Что я буду делать :
- Выполнение tcpdump на сервере для проверки сети: получает ли сервер пакет SYN или в сети есть проблема заранее? Генерирует ли сервер и отправляет ли он пакет SYN ACK? И работайте с этого момента.
- Если у вас нет доступа к серверу, сделайте то же самое на ближайшем маршрутизаторе/брандмауэре.
- Свяжитесь с кем-то, у кого есть доступ к серверу.