Параметр сокета TCP_USER_TIMEOUT не учитывается - PullRequest
0 голосов
/ 18 февраля 2020

У меня недавно была ситуация, когда мой 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));

разъем выше установлен неблокирующим.

Я попробовал следующие шаги на моей тестовой виртуальной машине:

  1. Establi sh соединение клиент-сервер. Клиент периодически (каждые 5 секунд) отправляет данные на сервер
  2. отбрасывает пакет в месте назначения

    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
    
    
  3. Обратите внимание, что SEND-Q продолжает расти (используется ss -p) для него.

Я вижу, что установка параметра сокета TCP_USER_TIMEOUT не имеет никакого значения для периода ожидания.

# uname -r
3.10.0-862.9.1.el7.x86_64

Буду очень признателен за любую помощь / указатели на это.

TIA

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