У меня недавно была ситуация, когда мой TCP-клиент (сидящий через WAN) испытывал перехват WAN. Клиент продолжал отправлять данные, так как базовый стек TCP не сообщал об ошибке ETIMEDOUT , пока не завершил свою tcp_retries2 (значение по умолчанию 16 в моей системе). С этими настройками по умолчанию я вижу, что я получаю ошибку timed out примерно через 15-16 минут. Я хотел сократить этот тайм-аут до 20 секунд.
Основываясь на определении TCP_USER_TIMEOUT , я ожидал, что если я установлю опцию сокета на стороне клиента, он истечет после истечения указанного тайм-аута. ,
int tcp_timeout = 20000;
auto status = setsockopt(mFd, IPPROTO_TCP , TCP_USER_TIMEOUT, &tcp_timeout, sizeof(tcp_timeout));
разъем выше установлен неблокирующим.
Я попробовал следующие шаги на моей тестовой виртуальной машине:
- Establi sh соединение клиент-сервер. Клиент периодически (каждые 5 секунд) отправляет данные на сервер
отбрасывает пакет в месте назначения
sudo iptables -A INPUT -s <dest_ip> -j DROP
Я также пытался временно отключить if (через скрипт)
#!/bin/bash
sudo ip link set eth0 down
sleep 2
sudo ip link set eth0 up
- Обратите внимание, что SEND-Q продолжает расти (используется ss -p) для него.
Я вижу, что установка параметра сокета TCP_USER_TIMEOUT не имеет никакого значения для периода ожидания.
# uname -r
3.10.0-862.9.1.el7.x86_64
Буду очень признателен за любую помощь / указатели на это.
TIA