🖧 Как вызвать таймаут TCP-сокета |

🖧 Как вызвать таймаут TCP-сокета

Мануал

1. Обзор

Протокол управления передачей TCP (Transmission Control Protocol) обеспечивает надежный обмен сетевыми пакетами между отправителем и получателем.

В нем используется концепция подтверждения пакетов и тайм-аута сообщений.

В целях отладки иногда необходимо имитировать таймаут TCP-сокета на TCP-сервере.

В этом руководстве мы узнаем, как вызвать таймаут TCP-сокета с помощью стандартных инструментов Linux.

2. Использование iptables для блокировки порта

Мы можем использовать iptables для блокировки заданного TCP-порта на нашей машине, тем самым имитируя тайм-аут TCP.

Например, мы можем заблокировать порт 6000:

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

Итак, давайте разберемся в каждой части этой команды:

  • при обновлении правил iptables необходимы привилегии sudo или root
  • -A INPUT означает добавление входящего правила
  • -p указывает протокол TCP
  • -dport указывает номер порта
  • -j DROP означает добавление правила для отбрасывания TCP-пакета.

Наконец, давайте проверим, правильно ли было добавлено правило DROP port 6000:

sudo iptables -L
[sudo] password for user:
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  --  anywhere             anywhere             tcp dpt:x11
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination[simterm]
В результате мы видим, что правило DROP теперь добавлено в цепочку INPUT.
3. Проверка таймаута
На данном этапе мы можем проверить тайм-аут с помощью команды netcat (nc):
[simterm]$ nc -vz localhost 6000
nc: connect to localhost (127.0.0.1) port 6000 (tcp) failed: Connection timed out

Как мы видим, через некоторое время соединение с портом 6000 прерывается.

Опция -v означает режим verbose, а -z – режим сканирования порта.

Мы можем измерить точное значение таймаута, используя команду time перед командой nc:

time nc -vz localhost 6000
nc: connect to localhost (127.0.0.1) port 6000 (tcp) failed: Connection timed out
real 2m9,534s
user 0m0,004s
sys 0m0,004s

Полученное время ожидания составляет 2 минуты и 9,534 секунды.

4. Обновление значений таймаута

Чтобы увеличить или уменьшить значения таймаута TCP, мы можем использовать файлы, расположенные в каталоге /proc/sys/net/ipv4/ псевдофайловой системы /proc.

Итак, давайте обновим таймаут TCP, а затем измерим, как это повлияет на результаты измерений таймаута.

4.1. Уменьшение таймаута TCP

Существует несколько файлов, которые влияют на таймаут TCP:

  • tcp_retries2
  • tcp_keepalive_time
  • tcp_keepalive_intvl
  • tcp_keepalive_probes

Уменьшив значения по умолчанию для вышеперечисленных файлов, мы сможем добиться меньшего времени таймаута TCP.

Например, давайте уменьшим таймаут, изменив количество повторных попыток передачи TCP-пакетов.

Для этого сначала проверим значение по умолчанию с помощью команды cat:

cat /proc/sys/net/ipv4/tcp_retries2
15

По умолчанию количество повторных попыток TCP равно 15.

Давайте уменьшим его до 1 с помощью утилиты sysctl:

sudo sysctl -w net.ipv4.tcp_retries2=1

Таким образом, мы задаем значение для файла tcp_retries2.

Наконец, давайте применим изменения:

sudo sysctl -p

В результате это значение должно сохраниться и применяться к любым последующим TCP-соединениям.

4.2. Повторное измерение тайм-аута

Давайте проверим, как изменение файла повлияло на наши измерения тайм-аута:

time nc -vz localhost 6000
nc: connect to localhost (127.0.0.1) port 6000 (tcp) failed: Connection timed out
real 0m11,283s
user 0m0,004s
sys 0m0,004s

Как мы видим, тайм-аут уменьшился с более чем двух минут до 11 283 секунд.

5. Заключение

В этой статье мы рассмотрели, как имитировать таймаут TCP-сокета.

Для этого, во-первых, мы узнали, как заставить TCP-порт блокировать входящие соединения.

Во-вторых, мы узнали, как обновить значение таймаута TCP.

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий