Как сделать время ожидания сокета TCP


20

Для моделирования сетевых катастроф нашей серверной среды мы ищем способ преднамеренного тайм-аута сокета TCP. Есть ли простые способы для существующих сокетов? Кроме того, небольшая программа для тестирования на С была бы плюсом.

Мы уже пытались отключить сетевые интерфейсы во время чтения буфера TCP и чтения из отключенных подключенных ресурсов (samba).

Наш тестовый сервер - Ubuntu 12.04.4.

Ответы:


19

Чтобы вызвать выходное соединение с тайм-аутом, вы можете использовать iptables. Просто включите DROPправило для порта, который вы хотите отключить. Поэтому, чтобы смоделировать тайм-аут для вашего сервера Samaba, когда активное соединение установлено, выполните на сервере следующее:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

DROPЦель не будет отвечать на RSTпакете или ICMPошибки отправителя пакета. Клиент прекратит получать пакеты с сервера и в конечном итоге истечет время ожидания.

В зависимости от того, если / как вы iptablesнастроили, вы можете вставить правило выше в INPUTнабор правил.


Попробовал это с помощью netcat (для прослушивания / отправки данных) и ждал вечно ... без таймаута: / И я могу подтвердить, что данные были отброшены. Я даже изменился /proc/sys/net/ipv4/tcp_keepalive_timeна очень маленькое число
er453r

@ er453r попробуйте включить подробный вывод, ncat -vчтобы увидеть, что именно ncatделает. Мне потребовалось 2м7,291 секунды на установку Ubuntu 12.04 в ванильном режиме до тайм-аута
Крик,

верно - я не отправлял ничего через сокет во время первого теста. Я наконец-то освоил таймауты и подробно описал их ниже :)
er453r

16

Первый ответ правильный, но я обнаружил, как работают эти таймауты, чтобы вы могли наблюдать и тестировать их (не забудьте заблокировать порт!).

Существует 4 наиболее интересных параметра ядра, связанных с таймаутами TCP:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

Сейчас есть 2 сценария:

  1. Разъем открывается и пытается передать - тогда (если нет ответа от другой стороны), система повторяет попытки tcp_retries2. При значении по умолчанию для пенсий это занимает где-то более 2 минут и время ожидания сокета истекает.

  2. Разъем открывается и простаивает - тогда интересны ограничения keepalive. С незанятым сокетом система будет ждать tcp_keepalive_timeсекунды, а после этого попытаться tcp_keepalive_probesраз отправить TCP KEEPALIVE с интервалами в tcp_keepalive_intvlсекунды. И только после этого все сбои сокета истекают.


1
Кроме того, вы можете отслеживать это время, используяnetstat -o
er453r
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.