Một trang tải được, ping thành công, nhưng bản sao tệp lại treo ở đúng một điểm mỗi lần. Kiểu này chỉ vào kích thước gói chứ không phải băng thông hay thông tin đăng nhập. Đóng gói thêm byte cho mỗi gói, nên phần tải trọng vừa với đường ban đầu có thể vượt giới hạn sau khi đi qua đường hầm. Trong các cuộc trao đổi này, ba con số khác nhau được gọi là MTU, và nhầm lẫn chúng dẫn đến một thiết lập sửa ứng dụng này và làm hỏng ứng dụng kia.

Ba con số mà người ta gọi là MTU

MTU của giao diện là giới hạn được cấu hình cho gói trên liên kết đó. MTU của đường đi là giới hạn nhỏ nhất dọc tuyến, và nó được khám phá chứ không được cấu hình. TCP MSS là kích thước tải trọng mà bên đối tác công bố có thể nhận, và nó suy ra từ hai con số kia, không phải một giới hạn vật lý riêng.

Đường hầm có góc nhìn bên trong và bên ngoài. Gói bên ngoài mang gói đã đóng gói cộng các tiêu đề mà giao thức cần, nên kích thước bên trong dùng được nhỏ hơn mức đường ngoài cho phép. Đường đến máy chủ VPN cũng khác đường của máy chủ đến đích.

Việc khám phá MTU đường đi cho phép bên gửi biết kích thước hoạt động, nhưng phụ thuộc vào việc phản hồi có đến hay không. Khi một thiết bị trung gian lọc các thông điệp ICMP liên quan, bên gửi vẫn tiếp tục gửi những gói không bao giờ hoàn tất, và đó là lỗ đen kinh điển. Triệu chứng rất đặc trưng khi đã biết: bắt tay thành công, tải trọng kích thước đầy đủ đầu tiên biến mất, và kết nối cuối cùng bị đặt lại hoặc treo. Không có gì trong nhật ký ứng dụng trông giống sự cố mạng.

Thử đường đi bằng tải trọng bạn kiểm soát

Một lần thử là bằng chứng về một tuyến và một kích thước, không phải một thiết lập được khuyến nghị. Dùng một máy chủ phản hồi, và chỉ thay đổi kích thước tải trọng.

ping -M do -s 1372 -c 2 203.0.113.20
ping -4 -f -l 1372 vpn.example

Lệnh đầu tiên gửi một phép thử Linux với phân mảnh bị tắt và tải trọng 1372 byte, lệnh thứ hai làm điều tương tự trên Windows nơi tải trọng được đặt bằng -l. Có phản hồi nghĩa là kích thước đó đã đi qua đường. Thông báo rằng cần phân mảnh là hữu ích, trong khi hết thời gian chờ là mơ hồ vì máy chủ hoặc thiết bị trung gian có thể chỉ đơn giản là bỏ ICMP.

Hạ kích thước từng bước thay vì tìm kiếm nhị phân đến từng byte. Bạn đang cố xác định xem có trần kích thước hay không, chứ không phải công bố một con số cho mọi mạng. Con số bạn tìm được áp dụng cho tuyến này, giao thức này và họ địa chỉ này.

IPv4 và IPv6 phân mảnh khác nhau, nên kết quả của một họ không nói gì về họ kia. Hãy thử họ mà ứng dụng thực sự dùng.

Kẹp MSS chỉ giúp TCP

Trong TCP, tải trọng hiệu dụng được thương lượng trong bắt tay, và bộ định tuyến trên đường có thể ghi lại giá trị đó xuống thấp hơn để cả hai đầu gửi các đoạn nhỏ hơn. Đó là điều kẹp MSS làm, và nó hoạt động mà không hề chạm vào máy khách.

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
ip link show tun0

Quy tắc thứ nhất kẹp MSS đã công bố xuống MTU đường đi cho các bắt tay TCP được chuyển tiếp, quy tắc thứ hai hiển thị MTU riêng của giao diện đường hầm để bạn so với mức đường cho phép. Kẹp là cách sửa ít xâm lấn nhất cho ứng dụng TCP bị treo sau bắt tay.

Với UDP, nó không làm gì cả. Một máy khách thoại hoặc trò chơi gửi datagram lớn sẽ phớt lờ thiết lập MSS hoàn toàn, vì không có bắt tay để ghi lại. Nếu ứng dụng hỏng dùng UDP, hãy xem các tùy chọn kích thước gói của chính máy khách. Hai giao thức hỏng theo cách khác nhau và được sửa bằng công cụ khác nhau, vì thế giao thức thuộc về câu đầu tiên của phiếu.

OpenVPN cung cấp các tùy chọn như tun-mtu, mssfix và các thiết lập liên quan đến phân mảnh, và hành vi của chúng phụ thuộc phiên bản và việc kênh dữ liệu có phải AEAD hay không. Hãy đọc tài liệu của phiên bản đang dùng, và mỗi lần chỉ thay một tùy chọn.

Thay đổi một thiết lập được hỗ trợ và lặp lại cả hai lần chạy

Giữ hồ sơ gốc, thay một giá trị được hỗ trợ, và lặp lại cả yêu cầu nhỏ từng chạy được lẫn lần truyền lớn bị lỗi. Nếu chỉ cái lớn thay đổi, bạn đang đuổi theo kích thước. Nếu cả hai cùng thay đổi, thì có thứ khác cũng đã dịch chuyển cùng nó.

Giá trị thấp hơn có thể giảm triệu chứng nhưng thêm chi phí phụ, nên con số nhỏ nhất có thể không phải là mục tiêu. Mục tiêu là kích thước mà đường đi chở được một cách đáng tin cậy với ít lãng phí nhất. Ghi giá trị, tuyến và phiên bản máy khách vào phiếu, vì áp cùng con số ở nơi khác chỉ là phỏng đoán.

Nếu cùng hồ sơ đó hoạt động từ một mạng tin cậy khác, hãy giữ khác biệt đó trong chẩn đoán thay vì tuyên bố máy khách đã được sửa. Biến đã thay đổi là tuyến, và tuyến chính là thứ phép thử đã đo.

Bài viết liên quan