Что может привести к нему отправку флага сброса TCP / IP (RST)?

У меня два сервера Linux (давайте именем их A и B), подключенные к тому же (неуправляемую) переключатель. Я отключил брандмауэр на обоих серверах (нет правил во всех таблицах, и все политики по умолчанию, набор для принятия). Таким образом, ничто не должно предотвратить их сервер для отправки любых пакетов TCP / IP и другой сервер для их получения, как есть.

Теперь, на A мы запускаем приложение TCP Server, которое слушаю / принимают входящие соединения, а затем отправляют много данных в цикле для подключенного клиента (ы). Он не пытается прочитать от клиента и ожидать, что ошибка EPIPE при выполнении записи () для сокета, если / когда клиент отключается.

Далее, на B i Run NC (Netcat) в качестве клиентского приложения, подключается к приложению сервера на A, начнут получать данные, а через несколько секунд я нажимаю Ctrl-C, чтобы прервать это соединение.

Что я вижу, это серверное приложение на просто висит в записи (), у него нет EPIPE или любой другой ошибки.

Я проследил пакеты TCP / IP, используя TCPDUMP, а вот то, что я вижу:

  • после прерывания NetCat на B, b Отправить FIL к A, что правильно отвечает с ACK к этому плавню - так, теперь мы » VE Fair Open TCP-соединение, которое в порядке
  • Далее, пытается отправить следующие данные клиенту с помощью обычных ACK и PSH, пакетов ACK, который также ожидается и правильный
  • , но B не отвечает в Любой способ к этим пакетам (в то время как я ожидаю, чтобы ответить с RST Packet, потому что он получал пакеты на уже закрытое / не существующее TCP-соединение)
  • A не получил ACK, поэтому он перестает отправлять новые данные и начать попрашивать старый Пакеты (и в этот момент следующий звонок для записи () зависает)

Я также пытался запустить NetCat на A (так, чтобы как клиентские, так и серверные приложения работают на одном физическом сервере), и таким образом все работает, как ожидалось - сервер Применение получило еще сразу после прерывания NetCat с Ctrl-C. И TCPDUMP Show есть RST Packet, который отправляется как ожидалось.

Итак, что может привести к не отправлять RST в этом случае?

Я использую затвердевший Gentoo Linux, актуальную, ядро ​​2.6.39-OnDed-R8, без какой-либо конкретной сетевой конфигурации Sysctl Отказ

Это может быть или не может быть или не может быть важно отметить, что на этих серверах есть значительная сетевая активность, около 5000 подключений TCP, перечисленные со netstat -alnp в любой момент, и я думаю, что около 1000 соединений открывается и закрывает каждый второй в среднем. Обычно увидит в журнале ядра что-то вроде этого (но номер порта отличается от использования сервера приложения, обсуждаемое выше):

    TCP: Possible SYN flooding on port XXXXX. Sending cookies.
    net_ratelimit: 19 callbacks suppressed

Вот как сеанс TCP обычно выглядит: http://i54.tinypic.com/ http://i54.tinypic.com/ 1zz10mx.jpg

6
задан Powerman 3 September 2011 в 08:07
поделиться