Bản sao xác thực xong, số đối tượng hiện ra, rồi không có gì nhúc nhích trong nhiều phút. Windows báo VPN đã kết nối, tên máy chủ được phân giải, và trình duyệt trên cùng máy vẫn tải cùng trang kho mà không gặp khó khăn. Sự kết hợp đó chỉ vào kích thước gói chứ không phải thông tin đăng nhập, và câu hỏi về kích thước phải được đặt ở hai nơi vì WSL2 có giao diện Linux riêng với MTU riêng. Một con số thuộc phía Windows của đường đi, con số kia thuộc bản phân phối, và chỉ đọc bộ điều hợp VPN sẽ để nửa đường đi chưa được kiểm tra.

Ba dấu hiệu tách vấn đề kích thước khỏi nguyên nhân khác

Dấu hiệu thứ nhất là hình dạng: việc thiết lập kết nối và một trao đổi nhỏ thành công, sau đó việc truyền lớn ngừng tiến triển. Dấu hiệu thứ hai là tính đối xứng: cùng kho và cùng phương thức vận chuyển thất bại trong khi một máy chủ khác trên cùng đường đi vẫn hoạt động, hoặc lỗi thay đổi theo kích thước tải trọng chứ không theo giờ trong ngày. Dấu hiệu thứ ba là sự im lặng: không có lỗi xác thực, không có proxy từ chối, không có lỗi phân giải tên, chỉ có một lần truyền không bao giờ hoàn tất.

Ba điều đó cùng nhau biện minh cho giả thuyết về kích thước gói. Lỗi DNS, token hết hạn, khóa SSH bị từ chối và proxy từ chối CONNECT mỗi thứ tạo ra lỗi riêng, và không thứ nào trông giống như bị treo sau khi thành công. Giữ nguyên kho, phương thức vận chuyển và khoảng thời gian khi kiểm tra là điều làm cho so sánh trung thực.

So sánh cả hai giao diện trước khi quyết định

Thu thập góc nhìn Windows và góc nhìn Linux trong cùng một phiên, và bám vào địa chỉ của kho thay vì đoán giao diện nào mang nó. Lệnh bên dưới phân giải đích trước để việc tra cứu tuyến mô tả máy chủ thực mà bản sao liên hệ, có thể khác tên mà trình duyệt hiển thị. Chạy hai nửa gần nhau, vì VPN có thể thay đổi số liệu giao diện giữa các lần thử.

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"'

Chạy nửa Linux bên trong bản phân phối thay vì dán kết quả vào shell Windows, vì tên giao diện và việc chọn tuyến chỉ có nghĩa ở đó. Dán từ shell Windows báo cáo con số sai với độ tin cậy cao. Ghi lại thiết bị, tuyến đã chọn và MTU từ mỗi phía trước khi thay đổi bất cứ điều gì.

Quyết định xem con số có nên nhỏ hơn không

MTU giao diện lớn hơn mức đường đi có thể mang không tự động là lỗi, vì việc phát hiện MTU đường đi tồn tại chính vì điều đó. Chế độ lỗi xuất hiện khi việc phát hiện bị chặn: thông điệp ICMP bị lọc ở đâu đó trên đường, bên gửi không bao giờ biết giới hạn, và gói lớn biến mất trong khi gói nhỏ đi qua. Đó là thuộc tính của đường đi, không phải thuộc tính của Git. Đó cũng là lý do một tệp nhỏ có thể thành công trên kết nối mà tệp lớn không bao giờ hoàn tất.

Nếu bằng chứng ủng hộ, thay đổi tạm thời trên giao diện Linux là phép thử rẻ nhất. Chọn giá trị dưới kích thước đường đi khả dụng, ghi lại giá trị trước và giữ mọi thứ khác không đổi để so sánh có ý nghĩa. Nếu việc truyền hoàn tất với giá trị nhỏ hơn, bạn có chẩn đoán chứ không phải sự trùng hợp.

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

Quyết định cài đặt nên sống ở đâu

Ba lựa chọn rút ra từ phép thử, và thường chỉ một là phù hợp. Nếu giá trị nhỏ hơn khắc phục việc truyền và giá trị thực sự cần cho mạng này, cài đặt cần một chủ sở hữu vòng đời: móc khởi động trong bản phân phối, cấu hình mạng do nền tảng quản lý, hoặc quy trình được ghi lại. Nếu giá trị không khắc phục gì, hãy hoàn nguyên và quay lại các câu hỏi về vận chuyển, proxy và xác thực.

Việc có móc khởi động hay không phụ thuộc vào phiên bản Windows và WSL đang dùng và chế độ mạng đã cấu hình. Phản chiếu mạng Windows có thể thay đổi cách VPN tương tác với bản phân phối theo những cách quan trọng hơn việc điều chỉnh MTU, nên hãy xác định chế độ trước khi thiết kế giải pháp vòng tránh cho nó. Một giá trị phù hợp với một nhà mạng hoặc một hồ sơ VPN không phải là mặc định cho cái tiếp theo.

Điều cần tránh là vị trí hấp dẫn: một lệnh mạng đặc quyền trong tệp khởi động của mọi shell tương tác, hoặc sudo không mật khẩu cho toàn bộ tệp nhị phân ip để một script có thể chạy một dòng. Cả hai biến chẩn đoán thành phơi nhiễm vĩnh viễn và làm cho vấn đề ban đầu khó thấy hơn về sau.

Xác minh sau khi khởi động sạch, rồi hoàn nguyên

Một thay đổi chỉ tồn tại đến khi bản phân phối khởi động lại không phải là bản sửa. Khởi động lại bản phân phối, kết nối lại VPN và lặp lại thao tác Git ban đầu thay vì một thứ thay thế như ping hay một yêu cầu HTTP nhỏ. Sau đó xác nhận giao diện mang giá trị dự định trong phiên mới.

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

Giữ giá trị gốc đã ghi bên cạnh thay đổi để thí nghiệm có thể hoàn nguyên sạch, và ghi lại họ địa chỉ nào đã được thử, vì kết quả IPv4 không nói gì về kết nối IPv6 trên cùng máy chủ. Tài liệu mạng của WSL mô tả các chế độ quyết định bản sửa nên trông như thế nào; bản thân con số MTU là phép đo cục bộ, không phải khuyến nghị.

Bài viết liên quan