Ошибка WSL2 Docker — Keep Alive в стеке TCP

#docker #tcp #wsl-2

#docker #tcp #wsl-2

Вопрос:

Интересно, заметили ли другие эту проблему с реализацией TCP WSL2 Debian.

Я подключаюсь из контейнера Docker под управлением WSL2 Debian v. 20

TCP-клиент отправляет пакет Keep-Alive каждую секунду, что является излишним. Затем примерно через 5 минут клиент прерывает соединение без какой-либо причины. Кто-нибудь видит это поведение?

Вы можете воспроизвести это, просто открыв сеанс telnet на другом хосте. Но такое поведение происходит и на других типах сокетов.

И прежде чем вы спросите, эта проблема не вызвана сервером, она не возникает при открытии того же tcp-соединения с других хостов.

дамп wireshark последних нескольких секунд бездействующего TCP-соединения

Комментарии:

1. Параметры TCP keepalive по умолчанию могут быть переопределены, и, кроме того, приложение может устанавливать параметры TCP keepalive для каждого сокета; их не обязательно определяет реализация TCP. TCP-соединение при захвате было прервано нормально. Что-то на прикладном уровне прервало соединение. Я не думаю, что есть что-то, указывающее на ошибку TCP в захвате. Возможно, вы захотите попробовать netcat-keepalive ( github.com/cyberelf/netcat-keepalive ), чтобы увидеть, что происходит, когда вы указываете свои собственные параметры keepalive.

Ответ №1:

У меня была такая же проблема с Ubuntu на WSL2. Исходящее ssh-соединение закрывается по истечении определенного периода времени, если в этом соединении не было никакой активности. Особенно неприятно, если вы запускали приложение, которое не выводило данные на экран.

Я подозреваю, что внутренний маршрутизатор, который соединяет wsl с локальной сетью, сбросил неработающее TCP-соединение.

Решение состояло в том, чтобы сократить таймеры поддержки TCP в /proc/ sys / net/ ipv4, для меня сработало следующее:

 echo 300 > /proc/sys/net/tcp_keepalive_time
echo 45  > /proc/sys/net/tcp_keepalive_intvl
 

Ответ №2:

Итак, я понял это. К сожалению, реализация WSL2 Debian, похоже, имеет это жестко запрограммированное в стеке. Я попытался изменить параметры открытого вызова сокета, и они не привели к изменению поведения.