Multipath TCP cho Linux (2022)
(mptcp.dev)- MPTCP là phần mở rộng của TCP dựa trên RFC 8684, cho phép một kết nối sử dụng đồng thời nhiều giao diện mạng để cải thiện băng thông, độ trễ và khả năng ứng phó sự cố
- Với kiến trúc dùng song song nhiều đường truyền, nó cho phép gộp băng thông, ưu tiên đường có độ trễ thấp, và tái chèn lưu lượng sang đường khác khi một đường gặp sự cố
- Trên Linux, socket được tạo bằng
IPPROTO_MPTCPvà cấu thành các kết nối TCP thông thường gọi là subflow; nếu phía đối tác hoặc thiết bị trung gian không hỗ trợ, kết nối sẽ tự động hạ xuống TCP một đường truyền - Việc quản lý đường truyền trên Linux, tính đến v5.19, có kiểu tích hợp trong kernel và kiểu daemon không gian người dùng như
mptcpd; tính đến Linux v6.8, chỉ có một packet scheduler được điều khiển bằng sysctlnet.mptcp - Tính đến Linux v6.10, các tính năng bao gồm hỗ trợ
socket(), hạ xuống TCP, quản lý đường truyền ở kernel/người dùng, tùy chọn socket TCP, cùng các tính năng gỡ lỗi như MIB, chẩn đoánssvà tracepoint
MPTCP thay đổi cách thiết lập kết nối TCP
- Multipath TCP(MPTCP) là phần mở rộng của TCP tiêu chuẩn, được định nghĩa trong RFC 8684
- Một kết nối MPTCP có thể đồng thời sử dụng nhiều giao diện để gửi và nhận gói TCP
- 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
- Nếu một đường bị ngắt, lưu lượng có thể được tái chèn mượt mà sang đường khác để thực hiện chuyển đổi dự phòng
- Khác với TCP thông thường chỉ dùng một đường tại một thời điểm, MPTCP có thể dùng đồng thời nhiều đường như 5G và Wi‑Fi dưới dạng subflow
Các trường hợp sử dụng tiêu biểu
-
Chuyển giao không gián đoạn
- Có thể chuyển từ đường này sang đường khác mà vẫn giữ nguyên kết nối hiện tại
- Apple đã sử dụng Multipath TCP trên smartphone chủ yếu vì lý do này từ năm 2013
-
Chọn mạng tối ưu
- Chọn đường “tốt nhất” trong các đường khả dụng dựa trên các điều kiện như độ trễ, mất gói, chi phí và băng thông
-
Gộp mạng
- Có thể tăng thông lượng bằng cách dùng đồng thời nhiều đường
- Ví dụ là kết hợp mạng cố định và mạng di động để truyền tệp nhanh hơn
Cách kết nối được thiết lập trên Linux
- Khi tạo socket mới bằng giao thức riêng của Linux
IPPROTO_MPTCP, một subflow hoặc path sẽ được tạo ra - subflow là một kết nối TCP thông thường truyền dữ liệu qua một giao diện duy nhất
- Sau đó, thông qua quá trình thương lượng giữa các host, có thể tạo thêm các subflow
- Trong trường TCP option của subflow TCP nền tảng, có thêm các trường mới để host bên kia có thể nhận biết việc sử dụng MPTCP
- Các trường này bao gồm tùy chọn
MP_CAPABLEđể thông báo cho đối tác biết MPTCP đang được sử dụng
- Các trường này bao gồm tùy chọn
- Nếu host đối tác hoặc middlebox ở giữa không hỗ trợ MPTCP, trường TCP option trong gói
SYN+ACKtrả về sẽ không có tùy chọn MPTCP- Trong trường hợp này, kết nối sẽ hạ xuống TCP thông thường và tiếp tục với một đường duy nhất
Path manager và packet scheduler
- Về nội bộ, MPTCP chia việc tạo subflow, thông báo địa chỉ và chọn đường truyền thành hai thành phần: Path Manager và Packet Scheduler
-
Path Manager
- Path Manager quản lý subflow từ lúc tạo đến lúc xóa, đồng thời phụ trách thông báo địa chỉ
- Thông thường phía client sẽ khởi tạo subflow, còn phía server sẽ thông báo địa chỉ bổ sung bằng các tùy chọn
ADD_ADDRvàREMOVE_ADDR - Tính đến Linux v5.19, hai path manager được điều khiển bằng sysctl knob
net.mptcp.pm_type- loại
0: cách tích hợp trong kernel, áp dụng cùng một quy tắc cho mọi kết nối. Liên quan đếnip mptcp - loại
1: cách không gian người dùng, được điều khiển bởi daemon nhưmptcpdvà có thể áp dụng quy tắc khác nhau theo từng kết nối
- loại
-
Packet Scheduler
- Packet Scheduler chọn subflow sẽ được dùng để gửi gói dữ liệu tiếp theo
- Nó có thể tối đa hóa băng thông khả dụng, chỉ chọn các đường có độ trễ thấp hơn, hoặc áp dụng các chính sách khác theo cấu hình
- Tính đến Linux v6.8, chỉ có một packet scheduler và nó được điều khiển bằng sysctl knob của
net.mptcp
Tính năng tính đến Linux v6.10
- Tính đến Linux v6.10, MPTCP cung cấp các tính năng sau
- Hỗ trợ giao thức
IPPROTO_MPTCPtrong lời gọi hệ thốngsocket() - Hạ xuống từ MPTCP sang TCP khi phía đối tác hoặc middlebox không hỗ trợ MPTCP
- Quản lý đường truyền bằng path manager tích hợp trong kernel hoặc ở không gian người dùng
- Các tùy chọn socket thường được dùng trên socket TCP
- Bộ đếm MIB, hỗ trợ diag được lệnh
sssử dụng, và các tính năng gỡ lỗi bao gồm tracepoint
- Hỗ trợ giao thức
- Có thể xem chi tiết thay đổi trong ChangeLog
Kênh liên lạc và các dự án liên quan
- Kênh liên lạc
- Mailing list: mptcp@lists.linux.dev, plain text only
- Archives
- Info
- Việc đăng ký được thực hiện bằng cách gửi email plain text trống tới mptcp+subscribe@lists.linux.dev rồi trả lời email challenge
- IRC: #mptcp trên libera.chat
- Meetings trực tuyến
- Blog
- Fediverse
- Mailing list: mptcp@lists.linux.dev, plain text only
- Các dự án do thành viên cộng đồng MPTCP duy trì
- Các dự án có tích hợp cải tiến liên quan đến MPTCP
- iproute2: dành cho lệnh
ip mptcp - Network Manager: có tính năng MPTCP từ v1.40
- Multipath TCP applications: dự án điều phối các bản cập nhật MPTCP cho các ứng dụng TCP phổ biến
- iproute2: dành cho lệnh
1 bình luận
Ý kiến trên Hacker News
MPTCP thì tôi đã nghe từ năm 2013 rồi
Nghĩ đến việc hồi đó ứng dụng di động không thực sự vững khi mạng thay đổi, tôi tưởng mức cải thiện UX sẽ lớn nên nó sẽ nhanh chóng được chấp nhận
Nhưng trong 10 năm qua nó gần như không có traction, và giờ mới thấy xuất hiện tùy chọn kernel thì khá đáng buồn. Trong lúc đó, mọi người đã bọc các lệnh gọi HTTP bằng nhiều cơ chế retry, còn hệ điều hành di động thì trừu tượng hóa kết nối mạng đến mức cảm giác gần như dùng zeromq hơn là TCP
Xem ví dụ tại https://blog.apnic.net/2021/12/08/efficient-multipath-transp...
Khi triển khai trên FreeBSD không có load balancer thì không có bản vá mới nhất, và ngay cả nếu có thì cũng cần khá nhiều công sức để không quảng bá IP mạng riêng làm tuyến thay thế
Khi ở sau load balancer trên Linux, việc gửi stream đến đúng chỗ quá phức tạp, và load balancer cũng không muốn làm việc đó
Xử lý hai stream cùng nhau đồng nghĩa đưa độ phức tạp lớn vào đường xử lý thông lượng cao, nên rủi ro lớn, và muốn thay đổi còn cần reboot
Dù làm hết như vậy, lợi ích chủ yếu chỉ dành cho người dùng iOS, mà những người đó ngay từ đầu thường đã dùng mạng tốt hơn
https://en.wikipedia.org/wiki/Stream_Control_Transmission_Pr...
Cuối cùng, để tiết kiệm thời gian phát triển, chúng tôi dùng SpeedFusion của PepLink, nhưng phí license đắt. Hy vọng sau này sẽ có giải pháp miễn phí cho 2 mạng di động và failover dưới 50ms
UDP đa đường + OpenVPN có lẽ cũng có thể là một giải pháp thực dụng
Tôi không biết điều gì đáng buồn hơn: không gian địa chỉ IPv4 chỉ có 32 bit, hay TCP dùng địa chỉ IP nguồn/đích trong tuple kết nối
Nếu có cỗ máy thời gian, tôi muốn quay về gặp Cerf và Kahn để bảo họ đổi cả hai
Ý bạn là cấu trúc phải theo dõi kết nối bằng địa chỉ IP và cổng của hai bên, tức 4 trường đó à?
Thật tiếc là không có link đến các dự án dùng MPTCP, ví dụ như dự án phái sinh của OpenWrt
Tôi từng mentor sinh viên trong GSOC suốt 2 năm để patch MPTCP vào OpenWrt
https://blog.freifunk.net/2017/05/29/gsoc-2017-add-mptcp-sup...
Gần đây tôi mua một bất động sản không lắp được đường cáp quang đầy đủ, nhưng 5G đạt 150~400Mbps. Tôi đang nghĩ đến việc dùng 2 đường 5G và tunnel traffic bằng MPTCP đến một VPS để gộp băng thông
https://github.com/home-assistant/operating-system/pull/3248
http://www.openmptcprouter.com/
Có vẻ việc web server và thiết bị di động hỗ trợ mới là quan trọng nhất
Nếu có tuyến thay thế trong suốt, tôi không hiểu vì sao ứng dụng lại cần lựa chọn rõ ràng
Tôi nghĩ kernel nên xử lý trong suốt cho mọi kết nối TCP thì mới có thể đưa ra quyết định toàn cục tốt hơn, như gộp đường truyền hay ưu tiên liên kết
Triển khai Multipath TCP cũ trước khi upstream vốn được thiết kế để hoàn toàn trong suốt với ứng dụng, và tôi nghĩ hướng đó phù hợp hơn với mục tiêu của giao thức
Dĩ nhiên trong nhiều trường hợp MPTCP sẽ tốt hơn nếu nhận chỉ dẫn từ ứng dụng, nhưng chỉ cần một cách tiếp cận hệ thống chuẩn, chẳng hạn tạo subflow trên kết nối LTE để sẵn sàng failover tự động nhưng không gửi dữ liệu qua subflow đó, thì cũng đã đủ cho 95% trường hợp
[1] https://lore.kernel.org/all/alpine.OSX.2.21.1707181728570.11...
Ví dụ, có thể nghĩ đến một ứng dụng kiểm tra IP client với whitelist tại thời điểm kết nối và giả định rằng sau đó nó sẽ không thay đổi
Với tôi, ứng dụng thực tế duy nhất của MPTCP là dùng mạng di động cùng với Wi‑Fi để tăng tốc độ. Cả iOS lẫn WeChat đều hỗ trợ việc này
Nhưng mạng di động tính theo dung lượng nên tôi luôn tắt. Vì vậy với cá nhân tôi, MPTCP không hữu ích
Đó là tình huống tín hiệu Wi‑Fi vẫn hiện nhưng kết nối không hoạt động đúng. Có MPTCP thì sẽ failover sang mạng di động
Tôi làm công việc hỗ trợ, debug và sửa Linux network stack cùng driver, nên khá ngạc nhiên khi nó được áp dụng ít đến vậy
Giống như SCTP và những thứ từng cố thay thế TCP thông thường, MPTCP có vẻ vẫn chỉ là một công nghệ ngách mà một số nhà phát triển ứng dụng tiếp tục dùng, còn phần còn lại của thế giới thì quên mất
Tôi tìm được tài liệu giải thích khác biệt về kiến trúc giữa MPTCP và QUIC, đồng thời giới thiệu giao thức MPQUIC do các tác giả đề xuất
QUIC ghép kênh các stream ứng dụng trên một luồng UDP, còn MPTCP chia một stream thành nhiều subflow TCP. MPQUIC kết hợp hai đặc điểm này, ghép kênh các stream ứng dụng trên nhiều subflow UDP
[1]: "Multipath QUIC: A Deployable Multipath Transport Protocol" https://www.researchgate.net/publication/327122884_Multipath...
Giờ tôi tò mò các giao thức này so sánh với nhau trong môi trường vận hành thực tế ra sao. Có ai đã dùng cả hai chưa?
https://lwn.net/Articles/964377/
Cả hai đều cố đạt cùng một mục tiêu. Về mặt kỹ thuật, có thể tạo ra hành vi rất giống nhau. MPTCP được triển khai trong kernel Linux, còn QUIC nằm ở phía user space
Apple cũng hỗ trợ và dùng trong Siri
https://developer.apple.com/documentation/foundation/urlsess...
Năm 2011, tôi đã ngạc nhiên khi thấy app VoIP của chúng tôi hoạt động khá bền bỉ :D
Việc chỉ cần một thiết bị trung gian không hỗ trợ là trong trường TCP option của gói SYN+ACK trả về sẽ không có option MPTCP nghe có vẻ khá hạn chế
Yêu cầu duy nhất đối với thiết bị trung gian có phải chỉ là chuyển tiếp nguyên vẹn option MPTCP không?
Hoặc là đi qua đúng cách, hoặc là fallback an toàn về TCP một đường
Nói chung, nếu thiết bị trung gian chuyển tiếp các option không nhận biết mà không sửa đổi, và không ép buộc không gian thứ tự TCP mà nó nhìn thấy phải liên tục, thì MPTCP có thể đi qua và hoạt động qua thiết bị đó
Nếu quan tâm thì có hai bài báo liên quan
[1] https://www.usenix.org/conference/nsdi12/technical-sessions/...
[2] https://www.researchgate.net/publication/229002024_Is_it_sti...
Có thể hữu ích trong các thiết lập bảo mật và quyền riêng tư
Ví dụ, nghĩ đến Great Firewall của Trung Quốc, nếu có thể chia lưu lượng ra nhiều kênh uplink, liệu tường lửa có khó ghép lại để thực thi hơn không?