Multipath TCP cho Linux (2022)
(mptcp.dev)Tổng quan về Multipath TCP
- Multipath TCP (MPTCP) là phần mở rộng của TCP tiêu chuẩn, được mô tả trong RFC 8684
- Cho phép thiết bị sử dụng đồng thời nhiều giao diện để gửi và nhận các gói TCP thông qua một kết nối MPTCP duy nhất
- MPTCP có thể gộp băng thông của nhiều giao diện hoặc ưu tiên giao diện có độ trễ thấp nhất
- Ngoài ra, ngay cả khi một đường truyền bị gián đoạn, vẫn có thể failover và lưu lượng sẽ được chuyển tiếp mượt mà sang đường khác
Các trường hợp sử dụng của MPTCP
- Việc dùng MPTCP để có thể sử dụng nhiều đường truyền theo kiểu song song hoặc đồng thời đã tạo ra các trường hợp sử dụng mới so với TCP:
- Seamless handovers: chuyển từ một đường truyền sang đường khác mà vẫn giữ kết nối. Apple đã chủ yếu sử dụng MPTCP trên smartphone vì lý do này từ năm 2013.
- Best network selection: sử dụng đường truyền “tốt nhất” dựa trên một số điều kiện như độ trễ, mất gói, chi phí, băng thông, v.v.
- Network aggregation: sử dụng đồng thời nhiều đường truyền để đạt thông lượng cao hơn. Ví dụ: kết hợp mạng cố định và mạng di động để gửi tệp nhanh hơn.
Khái niệm MPTCP
- Khi tạo socket mới bằng giao thức IPPROTO_MPTCP (chỉ dành cho Linux), các subflow (hoặc path) gồm các kết nối TCP thông thường dùng để truyền dữ liệu qua một giao diện sẽ được tạo ra
- Các subflow bổ sung có thể được đàm phán sau giữa các host
- Một trường mới được thêm vào trường tùy chọn TCP của subflow TCP cơ sở để host từ xa có thể phát hiện việc sử dụng MPTCP
- Trường này bao gồm các tùy chọn như MP_CAPABLE để báo cho host kia rằng hãy sử dụng MPTCP nếu có hỗ trợ
- Nếu host từ xa hoặc middlebox ở giữa không hỗ trợ MPTCP, trường tùy chọn TCP của gói SYN+ACK trả về sẽ không chứa tùy chọn MPTCP
- Trong trường hợp đó, kết nối sẽ được “hạ cấp” xuống TCP thông thường và tiếp tục trên một đường duy nhất
Hành vi này có được nhờ hai thành phần nội bộ là Path Manager và Packet Scheduler.
Path Manager
- Path Manager phụ trách các subflow từ lúc tạo đến khi xóa, đồng thời cũng phụ trách thông báo địa chỉ
- Thông thường, phía client sẽ khởi tạo subflow và phía server sẽ thông báo thêm địa chỉ thông qua các tùy chọn ADD_ADDR và REMOVE_ADDR
- Tính đến Linux v5.19, có 2 Path Manager được điều khiển bằng sysctl
net.mptcp.pm_type:- in-kernel (loại 0): áp dụng cùng một quy tắc cho mọi kết nối (tham khảo
ip mptcp) - userspace (loại 1): được điều khiển bởi daemon không gian người dùng (ví dụ:
mptcpd) và có thể áp dụng các quy tắc khác nhau cho từng kết nối
- in-kernel (loại 0): áp dụng cùng một quy tắc cho mọi kết nối (tham khảo
Packet Scheduler
- Packet Scheduler chịu trách nhiệm chọn subflow nào trong số các subflow khả dụng sẽ được dùng để gửi gói dữ liệu tiếp theo
- Có thể quyết định các chính sách như tối đa hóa việc sử dụng băng thông sẵn có, chỉ chọn đường có độ trễ thấp nhất, hoặc các chính sách khác tùy theo cấu hình
- Tính đến Linux v6.8, chỉ có một Packet Scheduler duy nhất, được điều khiển bằng sysctl của
net.mptcp
Các tính năng chính của MPTCP (tính đến Linux v6.10)
- Hỗ trợ giao thức IPPROTO_MPTCP trong lời gọi hệ thống
socket() - Chuyển từ MPTCP sang TCP khi peer hoặc middlebox không hỗ trợ MPTCP
- Quản lý đường truyền bằng path manager trong kernel hoặc ở không gian người dùng
- Các tùy chọn socket thường được sử dụng trên socket TCP
- Tính năng debug bao gồm bộ đếm MIB, hỗ trợ diag (được dùng trong lệnh
ss) và tracepoint
Ý kiến của GN⁺
- MPTCP là công nghệ rất hữu ích khi thiết bị đầu cuối được kết nối với nhiều mạng. Có thể được tận dụng hiệu quả cho handover 5G-Wi-Fi hoặc gộp các mạng dị chủng.
- Tuy nhiên, cả phía server và client đều phải được triển khai hỗ trợ MPTCP, đồng thời mạng trung gian cũng cần hỗ trợ MPTCP, đây là một ràng buộc đáng kể. Có vẻ sẽ cần thời gian để công nghệ này trở nên phổ biến.
- Giao thức QUIC của Google cũng cung cấp tính năng multipath tương tự, và do QUIC đơn giản hơn, dựa trên UDP nên được dự đoán sẽ phổ biến nhanh hơn. Có thể sẽ có sự cạnh tranh giữa MPTCP và QUIC.
- Khác với cách triển khai MPTCP cho Linux phụ thuộc vào kernel, Apple tự triển khai MPTCP trong không gian người dùng và tích hợp vào iOS và macOS. Google cũng có vẻ có khả năng chọn cách tiếp cận tương tự.
- Để việc điều khiển đường truyền và chính sách lập lịch của MPTCP được tối ưu theo yêu cầu của ứng dụng, có vẻ cần có sự trao đổi thông tin giữa ứng dụng và MPTCP thông qua API. Hiện vẫn chưa thấy có phương án tiêu chuẩn hóa cho việc này.
1 bình luận
Ý kiến trên Hacker News