Игнорирование SYN / ACK - PullRequest
       5

Игнорирование SYN / ACK

2 голосов
/ 19 ноября 2010

Сетевой клиент Mac OSX, над которым я работаю, иногда возникают проблемы с подключением к порту HTTPS.Рассматривая трассировку сети, мы видим следующее:

T0.0 client:port -> server:443 SYN
T0.1 server:443 -> client:port SYN, ACK
T3.1 server:443 -> client:port SYN, ACK
T6.1 server:443 -> client:port RST

3-секундная задержка соответствует времени ожидания TCP для повторения неудачного SYN / ACK, так что это ожидаемо.Но что здесь невероятно, так это то, что клиент никогда не отвечает ACK или RST.Когда клиент пытается войти во второй раз, это успешно.Эта проблема воспроизводится на многих первых попытках подключения.В это же время происходят другие HTTPS-соединения из этой программы, и они, похоже, хорошо работают в сетевых трассировках.

Я подозреваю, что существует состояние гонки, из-за которого иногда сокет управляется неправильноНо до сих пор я не смог воссоздать это ни в каком коде, кроме затронутого клиента (который является очень большим и сложным программным обеспечением).Даже используя nmap и hping3 для ручной обработки пакетов, клиент всегда отправляет как минимум RST.

Есть ли способ настроить (намеренно или по ошибке) такой сокет в коде пользовательского пространстватак что он не отвечает на SYN / ACK?

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

Нет, нет способа сконфигурировать сокет TCP на земле пользователя, чтобы игнорировать SYN / ACK, кроме как закрыть его, что вызвало бы исходящий RST в ответ на входящий SYN / ACK. Для меня это звучит как ошибка ядра. Мне интересно обо всех этих связях, хотя. Вы должны максимально использовать HTTP-поддержку, чтобы минимизировать количество новых соединений в единицу времени.

0 голосов
/ 19 ноября 2010

Вы не можете игнорировать SYN / ACK, потому что он является частью трехстороннего рукопожатия для протокола TCP.Мне кажется, что проблема в том, что серверный сокет неправильно открыт.Другая гипотеза состоит в том, что сервер недоступен (например, брандмауэр блокирует его).

Трудно оказать больше помощи, чем это, не зная программы.Надеюсь, это поможет!

Редактировать: проверить, правильно ли вы закрываете сокеты предыдущего клиента.Может случиться, что предыдущие сокеты не были правильно закрыты, и ОС достигает предела разрешенных открытых сокетов.В этом случае отправляется пакет RST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...