Tốc độ và Ổn định: Cấu hình MultiPath TCP (MPTCP) trên Linux

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Điểm nghẽn của kết nối đơn (Single-Path)

TCP đã vận hành mạng internet từ những năm 1970, nhưng nó được xây dựng cho một kỷ nguyên đơn giản hơn. Lỗi lớn nhất của nó là gì? Một kết nối bị giới hạn cứng vào đúng hai địa chỉ IP. Hãy tưởng tượng máy chủ của bạn có hai đường cáp quang 10GbE. Ngay cả khi cắm cả hai, TCP tiêu chuẩn vẫn bỏ qua hoàn toàn đường truyền thứ hai. Nếu một kỹ thuật viên vô tình rút nhầm cáp đang hoạt động, phiên làm việc của bạn sẽ bị ngắt ngay lập tức—mặc dù một đường dự phòng 10Gbps hoàn hảo đang nằm ngay bên cạnh.

Tôi thường thấy các quản trị viên cố gắng khắc phục điều này bằng cách chuyển đổi IP thủ công hoặc cơ chế thử lại (retry) phức tạp ở tầng ứng dụng. Đó chỉ là những giải pháp tạm thời. Vấn đề thực sự là tầng vận chuyển (transport layer) không nhận biết được phần cứng bổ sung. Điều này làm lãng phí một lượng lớn băng thông và khiến các kết nối trở nên mong manh trong các môi trường quan trọng như edge computing hoặc đồng bộ hóa dữ liệu trung tâm.

Tại sao TCP tiêu chuẩn thất bại với nhiều đường truyền

Vấn đề nằm ở TCP 4-tuple: IP nguồn, Cổng nguồn, IP đích và Cổng đích. Sau khi quá trình bắt tay (handshake) ban đầu kết thúc, bốn yếu tố này sẽ bị khóa. Nếu bạn rời khỏi văn phòng và điện thoại chuyển từ Wi-Fi sang 5G, IP nguồn của bạn sẽ thay đổi. 4-tuple bị phá vỡ, và máy chủ sẽ ngắt kết nối vì nó không nhận diện được IP mới là một phần của phiên làm việc hiện tại.

MultiPath TCP (MPTCP) giải quyết vấn đề này bằng cách cho phép một kết nối duy nhất quản lý nhiều “subflow” trên các giao diện mạng khác nhau. Nó tách biệt phiên làm việc logic khỏi sợi dây vật lý. Điều này cho phép bạn rải dữ liệu trên mọi con đường có sẵn cùng lúc, cho dù bạn đang sử dụng hai cổng Ethernet hay kết hợp giữa cáp quang và vệ tinh.

MPTCP so với Link Aggregation (LACP)

Các kỹ sư thường nhầm lẫn MPTCP với Ethernet Bonding hoặc LACP. Chúng có vẻ giống nhau về mặt hình thức nhưng giải quyết các vấn đề khác nhau.

  • TCP tiêu chuẩn: Sử dụng một đường truyền. Nếu đường truyền đó lỗi, kết nối sẽ bị ngắt. Tốc độ của bạn bị giới hạn bởi giao diện nhanh nhất duy nhất.
  • LACP (Layer 2 Bonding): Gộp các liên kết vật lý thành một đường truyền logic. Nó thường yêu cầu phần cứng switch chuyên dụng và gặp khó khăn khi các đường truyền có độ trễ khác nhau hoặc đi qua các bộ định tuyến khác nhau.
  • MPTCP (Layer 4): Hoạt động trên các mạng hoàn toàn khác nhau. Bạn có thể kết hợp một đường truyền ISP 1Gbps ổn định với một modem 5G 150Mbps. MPTCP quản lý tắc nghẽn trên từng con đường một cách độc lập và xử lý việc lắp ghép gói tin tại điểm đích.

Theo kinh nghiệm của tôi, MPTCP là lựa chọn vượt trội cho các gateway di động nơi bạn không thể kiểm soát các switch phía trên nhưng vẫn cần đảm bảo thời gian hoạt động 100%.

Sự đánh đổi: MPTCP có xứng đáng không?

Lợi ích

  • Gộp băng thông thực sự: Nếu bạn có hai đường truyền 100Mbps, MPTCP có thể thực hiện một lần chuyển tệp 50GB với tốc độ gần 200Mbps.
  • Chuyển vùng không gián đoạn (Zero-Downtime Failover): Nếu đường chính bị đứt, subflow đó sẽ bị hủy, nhưng kết nối chính vẫn sống trên đường dự phòng. Người dùng thậm chí sẽ không nhận thấy sự thay đổi nào.
  • Cân bằng tải thông minh: Bạn có thể sử dụng đường truyền vệ tinh độ trễ cao, giá rẻ chỉ khi đường cáp quang chính đạt 95% công suất.

Thử thách

  • Can thiệp từ thiết bị trung gian (Middlebox): Một số tường lửa doanh nghiệp khắt khe coi header MPTCP là “lạ” và loại bỏ các gói tin này.
  • Yêu cầu Kernel hiện đại: Mặc dù hiện đã được tích hợp vào Linux, bạn vẫn cần Kernel 5.6 trở lên. Các thiết lập cũ như Ubuntu 18.04 yêu cầu các bản vá tùy chỉnh.
  • Chi phí xử lý: Việc quản lý nhiều luồng và bộ đệm sắp xếp lại dữ liệu sẽ làm tăng một chút mức sử dụng CPU so với TCP tiêu chuẩn.

Điều kiện tiên quyết để triển khai

Để thấy MPTCP hoạt động, bạn cần một hệ thống hiện đại. Hãy sử dụng một bản phân phối có Kernel 5.15 trở lên, chẳng hạn như Ubuntu 22.04 hoặc RHEL 9. Quan trọng là cả client và server đều phải hỗ trợ giao thức này. Nếu server không hỗ trợ MPTCP, kết nối sẽ tự động quay về TCP tiêu chuẩn. Cơ chế dự phòng này đảm bảo bạn không bao giờ mất kết nối chỉ vì cố gắng tối ưu hóa hiệu suất.

Thiết lập MPTCP trên Linux

Việc triển khai khá đơn giản vì các phần việc nặng nhọc đã được tích hợp sẵn trong mainline kernel. Chúng ta không còn cần phải biên dịch mọi thứ từ đầu nữa.

1. Kiểm tra hỗ trợ Kernel

Xác minh rằng kernel của bạn bao gồm module MPTCP bằng cách chạy:

grep -i MPTCP /boot/config-$(uname -r)

Tìm dòng CONFIG_MPTCP=y. Tiếp theo, xác nhận giao thức đã được kích hoạt trong runtime:

sysctl net.mptcp.enabled

Nếu bạn thấy net.mptcp.enabled = 1, công cụ đã sẵn sàng hoạt động.

2. Cài đặt các công cụ điều khiển

Chúng ta sử dụng lệnh ip mptcp từ gói iproute2. Hầu hết các bản phân phối hiện đại đều có sẵn công cụ này, nhưng cập nhật nhanh cũng không thừa.

sudo apt update && sudo apt install iproute2 -y

3. Thiết lập giới hạn kết nối

Theo mặc định, kernel có thể giới hạn số lượng subflow bổ sung là 0. Bạn cần cấp quyền cho hệ thống sử dụng nhiều hơn một đường truyền. Nếu bạn có hai giao diện, hãy đặt giới hạn ít nhất là 2.

# Cho phép tối đa 2 subflow trên mỗi kết nối
sudo ip mptcp limits set subflow 2

# Cho phép hệ thống chấp nhận các yêu cầu gửi đến cho các đường truyền mới
sudo ip mptcp limits set add_addr_accepted 2

4. Ánh xạ các giao diện mạng

Xác định địa chỉ IP của bạn bằng lệnh ip addr. Giả sử bạn có eth0 tại 192.168.1.10 và eth1 tại 192.168.2.10. Bạn phải đánh dấu chúng là đã sẵn sàng cho MPTCP.

# Đánh dấu eth0 để thông báo sự tồn tại của nó cho phía bên kia
sudo ip mptcp endpoint add 192.168.1.10 dev eth0 signal

# Đánh dấu eth1 để cho phép khởi tạo các subflow mới
sudo ip mptcp endpoint add 192.168.2.10 dev eth1 subflow

Cờ signal báo cho server biết: “Tôi có một IP khác mà bạn có thể sử dụng.” Cờ subflow báo cho client: “Hãy bắt đầu đường truyền thứ hai bằng giao diện cụ thể này.”

5. Khắc phục xung đột định tuyến

Một vấn đề thường gặp: Linux có thể cố gắng gửi các gói tin cho đường truyền của eth1 thông qua gateway của eth0. Điều này sẽ phá hỏng mọi thứ. Hãy sử dụng policy routing để đảm bảo lưu lượng truy cập đi đúng đường truyền.

# Định tuyến lưu lượng từ IP của eth1 qua gateway riêng của nó
sudo ip rule add from 192.168.2.10 table 100
sudo ip route add default via 192.168.2.1 dev eth1 table 100

6. Xác minh

Kiểm tra kết quả bằng lệnh ss (thống kê socket). Kiểm tra kết quả bằng lệnh ss (thống kê socket). Kết nối tới một máy chủ đã bật MPTCP và chạy:

ss -nliM

Cờ -M hiển thị các thông tin nội bộ của MPTCP. Bạn sẽ thấy danh sách nhiều subflow. Để thực hiện bài kiểm tra thực tế, hãy bắt đầu tải xuống một tệp 5GB và tắt giao diện chính của bạn:

sudo ip link set eth0 down

Nếu được cấu hình đúng, quá trình tải xuống sẽ tiếp tục mà không bị tạm dừng. Sự bền bỉ đó là lý do tại sao MPTCP đang trở thành tiêu chuẩn vàng cho mạng Linux có độ sẵn sàng cao.

Share: