Клон проходить автентифікацію, з'являється кількість об'єктів, і потім кілька хвилин нічого не рухається. Windows повідомляє, що VPN підключено, ім'я хоста розв'язується, а браузер на тій самій машині без труднощів завантажує ту саму сторінку репозиторію. Таке поєднання вказує на розмір пакета, а не на облікові дані, і питання розміру треба поставити у двох місцях, бо WSL2 має власний інтерфейс Linux з власним MTU. Одне число належить стороні Windows шляху, інше — дистрибутиву, і читання лише адаптера VPN залишає половину шляху недослідженою.

Три ознаки відокремлюють проблему розміру від іншого

Перша ознака — форма: встановлення з'єднання і невеликий обмін вдаються, потім масова передача перестає просуватися. Друга — симетрія: той самий репозиторій і той самий транспорт зазнають невдачі, тоді як інший вузол на тому самому шляху працює, або збій змінюється з розміром корисного навантаження, а не з часом доби. Третя — тиша: немає помилки автентифікації, немає відмови проксі, немає збою розв'язання імен, лише передача, яка ніколи не завершується.

Ці три разом виправдовують гіпотезу про розмір пакета. Збій DNS, прострочений токен, відхилений ключ SSH і проксі, що відмовляє CONNECT, дають кожен свою помилку, і жодна з них не схожа на зупинку після успіху. Збереження того самого репозиторію, транспорту й часового вікна під час тестування робить порівняння чесним.

Порівняйте обидва інтерфейси, перш ніж вирішувати

Зберіть вигляд Windows і вигляд Linux в одній сесії та тримайтеся адреси репозиторію замість здогаду про те, який інтерфейс його несе. Команда нижче спершу розв'язує призначення, щоб пошук маршруту описував реальний сервер, з яким з'єднується клон, а він може відрізнятися від імені, показаного браузером. Запускайте обидві половини близько в часі, бо VPN може змінювати метрики інтерфейсу між спробами.

netsh interface ipv4 show subinterfaces
wsl -d Ubuntu -- bash -lc 'dest=$(getent ahostsv4 github.com | awk \'NR==1{print $1}\'); ip -br link show; ip route get "$dest"'

Запускайте половину Linux усередині дистрибутива, а не вставляйте вивід у оболонку Windows, оскільки назви інтерфейсів і вибір маршруту мають сенс лише там. Вставка з оболонки Windows повідомляє неправильні числа з великою впевненістю. Запишіть пристрій, вибраний маршрут і MTU з кожного боку, перш ніж щось змінювати.

Вирішіть, чи має число бути меншим

Більший MTU інтерфейсу, ніж може нести шлях, не є автоматично дефектом, бо виявлення MTU шляху існує саме для цього. Режим збою виникає, коли виявлення придушене: повідомлення ICMP фільтруються десь на шляху, відправник ніколи не дізнається межу, і великі пакети зникають, тоді як малі проходять. Це властивість шляху, а не властивість Git. Це також причина, чому малий файл може пройти на з'єднанні, де великий ніколи не завершується.

Якщо докази це підтверджують, тимчасова зміна на інтерфейсі Linux — найдешевший тест. Виберіть значення нижче за придатний розмір шляху, запишіть попереднє й тримайте все інше незмінним, щоб порівняння щось означало. Якщо передача завершується за меншого значення, у вас діагноз, а не збіг.

ip -br link show dev eth0
sudo ip link set dev eth0 mtu 1380
ip -br link show dev eth0

Вирішіть, де має жити налаштування

З тесту випливають три варіанти, і зазвичай придатний лише один із них. Якщо менше значення виправляє передачу і значення справді потрібне цій мережі, налаштуванню потрібен власник життєвого циклу: хук запуску в дистрибутиві, мережева конфігурація, керована платформою, або задокументована процедура. Якщо значення нічого не виправляє, поверніть його й поверніться до питань транспорту, проксі та автентифікації.

Наявність хука запуску залежить від використовуваних версій Windows і WSL та налаштованого мережевого режиму. Дзеркалення мережі Windows може змінити те, як VPN взаємодіє з дистрибутивом, у спосіб, важливіший за коригування MTU, тому визначте режим, перш ніж проєктувати для нього обхідне рішення. Значення, що пасує одному оператору або одному профілю VPN, не є типовим для наступного.

Чого слід уникати — це спокусливе розміщення: привілейована мережева команда у файлі запуску кожної інтерактивної оболонки або sudo без пароля для всього двійкового файлу ip, щоб скрипт міг виконати один рядок. Обидва перетворюють діагностику на постійну вразливість і ускладнюють побачити початкову проблему згодом.

Перевірте після чистого запуску, потім відкотіть

Зміна, що тримається лише до перезапуску дистрибутива, не є виправленням. Перезапустіть дистрибутив, знову підключіть VPN і повторіть початкову операцію Git, а не заміну на кшталт ping або невеликого HTTP-запиту. Потім підтвердьте, що інтерфейс несе потрібне значення в новій сесії.

ip -br link show dev eth0
ip route get "$(getent ahostsv4 github.com | awk 'NR==1{print $1}')"

Тримайте записане початкове значення поруч зі зміною, щоб експеримент можна було чисто скасувати, і зазначте, яка родина адрес тестувалася, бо результат IPv4 нічого не каже про з'єднання IPv6 на тому самому вузлі. Документація з мереж WSL описує режими, що визначають, як має виглядати виправлення; саме число MTU є локальним вимірюванням, а не рекомендацією.

Схожі статті