Multipath TCP สำหรับลินุกซ์ (ปี 2022)
(mptcp.dev)- MPTCP คือส่วนขยายของ TCP ตาม RFC 8684 ที่ช่วยให้การเชื่อมต่อหนึ่งรายการใช้อินเทอร์เฟซเครือข่ายหลายตัวพร้อมกัน เพื่อปรับปรุงแบนด์วิดท์ ความหน่วง และการรับมือความขัดข้อง
- เนื่องจากมีโครงสร้างที่ใช้หลายเส้นทางแบบขนาน จึงสามารถ รวมแบนด์วิดท์, เลือกใช้เส้นทางที่มีความหน่วงต่ำกว่า และฉีดทราฟฟิกซ้ำไปยังเส้นทางอื่นเมื่อเส้นทางขัดข้องได้
- บน Linux จะสร้างซ็อกเก็ตด้วย
IPPROTO_MPTCPและประกอบ subflow ซึ่งเป็นการเชื่อมต่อ TCP ปกติ หากปลายทางหรืออุปกรณ์กลางไม่รองรับ ก็จะลดระดับไปเป็น TCP เส้นทางเดียวโดยอัตโนมัติ - การจัดการเส้นทางใน Linux ณ เวอร์ชัน v5.19 มีทั้งแบบในตัวเคอร์เนลและแบบเดมอนใน user space เช่น
mptcpdและ ณ Linux v6.8 packet scheduler มีเพียงตัวเดียวที่ควบคุมผ่าน sysctl ของnet.mptcp - ณ Linux v6.10 ความสามารถครอบคลุมถึงการรองรับ
socket(), การลดระดับเป็น TCP, การจัดการเส้นทางในเคอร์เนล/user space, ตัวเลือกซ็อกเก็ต TCP, ตัวนับ MIB, การวินิจฉัยด้วยssและฟีเจอร์ดีบัก tracepoint
MPTCP เปลี่ยนรูปแบบการเชื่อมต่อ TCP อย่างไร
- Multipath TCP(MPTCP) เป็นส่วนขยายของ TCP มาตรฐาน ซึ่งกำหนดไว้ใน RFC 8684
- การเชื่อมต่อ MPTCP หนึ่งรายการสามารถใช้อินเทอร์เฟซหลายตัวพร้อมกันเพื่อส่งและรับแพ็กเก็ต TCP ได้
- สามารถ รวมแบนด์วิดท์ ของหลายอินเทอร์เฟซ หรือให้ความสำคัญกับอินเทอร์เฟซที่มีเวลาแฝงต่ำที่สุดก่อน
- หากเส้นทางหนึ่งหลุด จะฉีดทราฟฟิกซ้ำไปยังอีกเส้นทางได้อย่างราบรื่นเพื่อทำ failover
- ต่างจาก TCP ปกติที่ใช้เส้นทางเดียวในแต่ละครั้ง MPTCP สามารถใช้หลายเส้นทาง เช่น 5G และ Wi‑Fi ร่วมกันเป็น subflow ได้
กรณีใช้งานหลัก
-
การแฮนด์โอเวอร์แบบไม่สะดุด
- สามารถสลับจากเส้นทางหนึ่งไปยังอีกเส้นทางหนึ่งโดยยังคงรักษาการเชื่อมต่อเดิมไว้ได้
- Apple ใช้ Multipath TCP บนสมาร์ตโฟนมาตั้งแต่ปี 2013 โดยส่วนใหญ่ด้วยเหตุผลนี้
-
การเลือกเครือข่ายที่เหมาะสมที่สุด
- เลือกเส้นทางที่ “ดีที่สุด” จากเส้นทางที่ใช้งานได้ โดยพิจารณาเงื่อนไขอย่างเวลาแฝง การสูญเสียแพ็กเก็ต ค่าใช้จ่าย และแบนด์วิดท์
-
การรวมเครือข่าย
- สามารถใช้หลายเส้นทางพร้อมกันเพื่อเพิ่ม throughput ได้
- ตัวอย่างเช่น การผสานเครือข่ายประจำที่กับเครือข่ายมือถือเพื่อส่งไฟล์ได้เร็วขึ้น
วิธีที่การเชื่อมต่อเกิดขึ้นบน Linux
- เมื่อสร้างซ็อกเก็ตใหม่ด้วยโปรโตคอลเฉพาะของ Linux คือ
IPPROTO_MPTCPจะมีการสร้าง subflow หรือ path - subflow คือการเชื่อมต่อ TCP ปกติที่ส่งข้อมูลผ่านอินเทอร์เฟซหนึ่งตัว
- จากนั้นสามารถสร้าง subflow เพิ่มเติมผ่านการเจรจาระหว่างโฮสต์
- ในฟิลด์ TCP option ของ TCP subflow พื้นฐาน จะมีการเพิ่มฟิลด์ใหม่เพื่อให้โฮสต์ปลายทางตรวจพบการใช้ MPTCP
- ฟิลด์นี้มีตัวเลือกอย่าง
MP_CAPABLEสำหรับแจ้งอีกฝ่ายว่ามีการใช้ MPTCP
- ฟิลด์นี้มีตัวเลือกอย่าง
- หากโฮสต์ปลายทางหรือ middlebox ระหว่างทางไม่รองรับ MPTCP ฟิลด์ TCP option ของแพ็กเก็ต
SYN+ACKที่ส่งกลับมาจะไม่มีตัวเลือก MPTCP- ในกรณีนี้ การเชื่อมต่อจะ ลดระดับ เป็น TCP ปกติและดำเนินต่อด้วยเส้นทางเดียว
ตัวจัดการเส้นทางและตัวกำหนดตารางแพ็กเก็ต
- ภายใน MPTCP จะแบ่งหน้าที่ให้ Path Manager และ Packet Scheduler จัดการการสร้าง subflow, การประกาศที่อยู่ และการเลือกเส้นทางส่งข้อมูล
-
Path Manager
- Path Manager จัดการตั้งแต่การสร้างจนถึงการลบ subflow และรับผิดชอบการประกาศที่อยู่ด้วย
- โดยทั่วไปฝั่งไคลเอนต์จะเริ่ม subflow และฝั่งเซิร์ฟเวอร์จะประกาศที่อยู่เพิ่มเติมด้วยตัวเลือก
ADD_ADDRและREMOVE_ADDR - ณ Linux v5.19 มีการควบคุม path manager สองแบบผ่าน sysctl knob
net.mptcp.pm_type- type
0: แบบในตัวเคอร์เนล ใช้กฎเดียวกันกับทุกการเชื่อมต่อ เกี่ยวข้องกับip mptcp - type
1: แบบ user space ควบคุมโดยเดมอนอย่างmptcpdและสามารถใช้กฎต่างกันตามแต่ละการเชื่อมต่อได้
- type
-
Packet Scheduler
- Packet Scheduler เลือก subflow ที่จะใช้เมื่อส่งแพ็กเก็ตข้อมูลถัดไป
- สามารถเพิ่มแบนด์วิดท์ที่ใช้ได้ให้สูงสุด เลือกเฉพาะเส้นทางที่มีเวลาแฝงต่ำกว่า หรือใช้นโยบายอื่นตามการตั้งค่าได้
- ณ Linux v6.8 packet scheduler มีเพียงตัวเดียว และควบคุมผ่าน sysctl knob ของ
net.mptcp
ความสามารถ ณ Linux v6.10
- ณ Linux v6.10 MPTCP มีความสามารถดังต่อไปนี้
- รองรับโปรโตคอล
IPPROTO_MPTCPใน system callsocket() - ลดระดับ จาก MPTCP เป็น TCP เมื่อปลายทางหรือ middlebox ไม่รองรับ MPTCP
- การจัดการเส้นทางโดยใช้ path manager แบบในตัวเคอร์เนลหรือแบบ user space
- ตัวเลือกซ็อกเก็ตที่ใช้กันทั่วไปในซ็อกเก็ต TCP
- ฟีเจอร์ดีบัก รวมถึงตัวนับ MIB, การรองรับ diag ที่คำสั่ง
ssใช้ และ tracepoint
- รองรับโปรโตคอล
- ดูรายละเอียดการเปลี่ยนแปลงได้ที่ ChangeLog
ช่องทางสื่อสารและโปรเจกต์ที่เกี่ยวข้อง
- ช่องทางสื่อสาร
- เมลลิงลิสต์: mptcp@lists.linux.dev, plain text only
- Archives
- Info
- การสมัครสมาชิกทำโดยส่งอีเมล plain text เปล่าไปที่ mptcp+subscribe@lists.linux.dev แล้วตอบกลับอีเมล challenge
- IRC: #mptcp บน libera.chat
- Meetings ออนไลน์
- Blog
- Fediverse
- เมลลิงลิสต์: mptcp@lists.linux.dev, plain text only
- โปรเจกต์ที่ดูแลโดยสมาชิกชุมชน MPTCP
- โปรเจกต์ที่มีการปรับปรุงเกี่ยวกับ MPTCP
- iproute2: สำหรับคำสั่ง
ip mptcp - Network Manager: มีฟีเจอร์ MPTCP ตั้งแต่ v1.40
- Multipath TCP applications: โปรเจกต์ที่ประสานงานการอัปเดต MPTCP สำหรับแอปพลิเคชัน TCP ยอดนิยม
- iproute2: สำหรับคำสั่ง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เคยได้ยินเรื่อง MPTCP มาตั้งแต่ปี 2013 แล้ว
ตอนนั้นพอนึกถึงว่าแอปมือถือยังไม่ค่อยทนต่อการเปลี่ยนเครือข่ายมากนัก ก็คิดว่ามันน่าจะถูกนำไปใช้เร็วเพราะช่วยปรับปรุง UX ได้มาก
แต่ตลอด 10 ปีที่ผ่านมาแทบไม่ได้ traction เลย และเพิ่งจะมาเห็นเป็นตัวเลือกในเคอร์เนลตอนนี้ก็ค่อนข้างน่าเศร้า ระหว่างนั้นทุกคนก็ห่อ HTTP call ไว้ด้วยตัวจัดการ retry หลายชั้นกันหมดแล้ว และระบบปฏิบัติการมือถือก็ทำเรื่องการเชื่อมต่อเครือข่ายให้เป็นนามธรรมมากเกินไป จนให้ความรู้สึกใกล้กับการใช้ zeromq มากกว่า TCP
ดูตัวอย่างได้ที่ https://blog.apnic.net/2021/12/08/efficient-multipath-transp...
ตอนนำไปใช้บน FreeBSD โดยไม่มี load balancer แพตช์ล่าสุดยังไม่มี และถึงจะมี ก็ยังต้องทำงานอีกมากเพื่อไม่ให้มีการประกาศ private network IP เป็นเส้นทางสำรอง
บน Linux เวลาวางไว้หลัง load balancer การส่งสตรีมไปยังปลายทางที่ถูกต้องซับซ้อนเกินไป และตัว load balancer เองก็ไม่ได้พยายามจะทำแบบนั้น
การจัดการสองสตรีมร่วมกันคือการเพิ่มความซับซ้อนอย่างมากให้กับ เส้นทางที่มีปริมาณงานสูง ซึ่งเสี่ยงมาก และถ้าจะเปลี่ยนก็ต้องรีบูตด้วย
ต่อให้ทำทั้งหมดนั้นแล้ว ประโยชน์หลักก็ยังตกกับผู้ใช้ iOS เป็นหลัก ซึ่งผู้ใช้กลุ่มนี้ก็มักมีเครือข่ายที่ดีกว่าอยู่แล้ว
https://en.wikipedia.org/wiki/Stream_Control_Transmission_Pr...
สุดท้ายเพื่อประหยัดเวลาพัฒนาเลยใช้ SpeedFusion ของ PepLink แต่ค่าไลเซนส์แพงมาก หวังว่าในอนาคตจะมีทางออกฟรีสำหรับการใช้เครือข่ายเซลลูลาร์ 2 เส้นพร้อม failover ต่ำกว่า 50ms
multipath UDP + OpenVPN ก็น่าจะเป็นทางออกที่ใช้งานได้จริงเหมือนกัน
ไม่แน่ใจว่าอะไรน่าเศร้ากว่ากัน ระหว่างพื้นที่ адрес IPv4 ที่มีแค่ 32 บิต กับการที่ TCP ใช้ IP ต้นทาง/ปลายทางใน connection tuple
ถ้ามีไทม์แมชชีนก็อยากย้อนกลับไปหา Cerf กับ Kahn แล้วให้แก้ทั้งสองอย่าง
หมายถึงโครงสร้างที่ต้องติดตามการเชื่อมต่อด้วย 4 ฟิลด์ คือ IP และพอร์ตของทั้งสองฝั่งใช่ไหม?
เสียดายที่ไม่มีลิงก์ไปยังโปรเจกต์ที่ใช้ MPTCP เช่น โปรเจกต์สาย OpenWrt
เคยเป็นเมนเทอร์ให้นักศึกษาใน GSOC อยู่ 2 ปี โดยทำแพตช์ MPTCP ให้กับ OpenWrt
https://blog.freifunk.net/2017/05/29/gsoc-2017-add-mptcp-sup...
ไม่นานมานี้ผมซื้ออสังหาริมทรัพย์ที่ยังติดตั้งไฟเบอร์เต็มรูปแบบไม่ได้ แต่ใช้ 5G ได้ราว 150~400Mbps เลยกำลังคิดจะใช้ 5G สองเส้นแล้ว tunnel ทราฟฟิกผ่าน MPTCP ไปยัง VPS เพื่อรวมลิงก์เข้าด้วยกัน
https://github.com/home-assistant/operating-system/pull/3248
http://www.openmptcprouter.com/
ดูเหมือนว่าสิ่งที่สำคัญที่สุดน่าจะเป็นการรองรับบนเว็บเซิร์ฟเวอร์และอุปกรณ์พกพา
ถ้ามีเส้นทางสำรองแบบโปร่งใสอยู่แล้ว ก็ไม่เข้าใจว่าทำไมต้องให้แอปพลิเคชันเลือกแบบชัดเจนด้วย
ถ้าเคอร์เนลจัดการแบบโปร่งใสให้กับทุก TCP connection ก็ไม่น่าจะตัดสินใจระดับ ภาพรวมของระบบ อย่างการรวมเส้นทางหรือการตั้งค่าความชอบของลิงก์ได้ดีกว่าหรือ?
implementation multipath TCP รุ่นเก่าก่อนเข้า upstream ตั้งใจให้โปร่งใสต่อแอปพลิเคชันอย่างสมบูรณ์ และผมคิดว่านั่นสอดคล้องกับเป้าหมายของโปรโตคอลมากกว่า
แน่นอนว่าในหลายกรณี MPTCP จะดีกว่าถ้าได้รับคำแนะนำจากแอปพลิเคชัน แต่ตัวอย่างเช่น ถ้ามีเพียงแนวทางมาตรฐานระดับระบบที่สร้าง subflow บนการเชื่อมต่อ LTE เพื่อเตรียม automatic failover ไว้ แต่ไม่ส่งข้อมูลผ่าน subflow นั้น ก็อาจเพียงพอสำหรับ 95% ของกรณีใช้งานแล้ว
[1] https://lore.kernel.org/all/alpine.OSX.2.21.1707181728570.11...
เช่น อาจมีแอปพลิเคชันที่ตอนเริ่มเชื่อมต่อจะตรวจสอบ IP ของไคลเอนต์กับ whitelist แล้วหลังจากนั้นก็ถือว่า IP จะไม่เปลี่ยนอีก
สำหรับฉัน การใช้งาน MPTCP ที่ใช้งานได้จริงเพียงอย่างเดียวคือ ใช้เครือข่ายมือถือกับ Wi-Fi พร้อมกันเพื่อเพิ่มความเร็ว โดยทั้ง iOS และ WeChat รองรับสิ่งนี้
แต่เครือข่ายมือถือคิดค่าบริการตามปริมาณข้อมูลเลยปิดไว้ตลอด ดังนั้นสำหรับฉัน MPTCP จึงไม่มีประโยชน์
คือสถานการณ์ที่ยังเห็นสัญญาณ Wi-Fi อยู่ แต่เชื่อมต่อใช้งานจริงไม่ได้ ถ้ามี MPTCP ก็จะสลับไปใช้เครือข่ายเซลลูลาร์เมื่อเกิดปัญหา
ฉันทำงานด้านสนับสนุน ดีบัก และแก้ไข Linux network stack กับไดรเวอร์ และแปลกใจที่มันถูกนำไปใช้น้อยขนาดนี้
เหมือนกับสิ่งอื่น ๆ อย่าง SCTP ที่พยายามมาแทน TCP ทั่วไป MPTCP ก็ดูจะยังเป็น เทคโนโลยีเฉพาะทาง ที่มีนักพัฒนาแอปบางส่วนใช้กันต่อไป ขณะที่โลกที่เหลือก็ลืมมันไป
ฉันเจอเอกสารที่อธิบายความต่างเชิงโครงสร้างระหว่าง MPTCP กับ QUIC และยังแนะนำโปรโตคอล MPQUIC ที่ผู้เขียนเสนอไว้ด้วย
QUIC ทำ multiplex แอปพลิเคชันสตรีมบน UDP flow เดียว ส่วน MPTCP แบ่งสตรีมเดียวออกเป็นหลาย TCP subflow และ MPQUIC รวมสองคุณลักษณะนี้เข้าด้วยกันโดยทำ multiplex แอปพลิเคชันสตรีมบนหลาย UDP subflow
[1]: "Multipath QUIC: A Deployable Multipath Transport Protocol" https://www.researchgate.net/publication/327122884_Multipath...
ตอนนี้เลยสงสัยว่าในสภาพแวดล้อม production โปรโตคอลพวกนี้เปรียบเทียบกันอย่างไร มีใครเคยใช้ทั้งสองอย่างไหม?
https://lwn.net/Articles/964377/
ทั้งสองอย่างพยายามบรรลุเป้าหมายเดียวกัน ในทางเทคนิคสามารถทำให้พฤติกรรมคล้ายกันมากได้ MPTCP ถูกอิมพลีเมนต์ใน Linux kernel ส่วน QUIC อยู่ฝั่ง user space
Apple ก็รองรับและใช้กับ Siri
https://developer.apple.com/documentation/foundation/urlsess...
ตอนปี 2011 ฉันยังแปลกใจอยู่เลยที่แอป VoIP ของเราทำงานได้ทนทานขนาดนั้น :D
ถ้ามีอุปกรณ์กลางแม้แต่ตัวเดียวที่ไม่รองรับ แล้วแพ็กเก็ต SYN+ACK ที่ส่งกลับมาไม่มีตัวเลือก MPTCP อยู่ในฟิลด์ TCP options แบบนี้ฟังดู มีข้อจำกัด พอสมควร
ข้อกำหนดเพียงอย่างเดียวของอุปกรณ์กลางคือแค่ต้องส่งผ่านตัวเลือก MPTCP ไปตรง ๆ เท่านั้นหรือ?
คือไม่ก็ผ่านไปได้อย่างถูกต้อง ไม่ก็ fallback กลับเป็น single-path TCP อย่างปลอดภัย
โดยทั่วไปแล้ว หากอุปกรณ์กลางส่งผ่านตัวเลือกที่ตัวเองไม่รู้จักโดยไม่แก้ไข และไม่ได้บังคับว่า TCP sequence space ที่มันมองเห็นต้องต่อเนื่องกัน MPTCP ก็สามารถทำงานผ่านอุปกรณ์นั้นได้
ถ้าสนใจ มีบทความที่เกี่ยวข้องสองฉบับ
[1] https://www.usenix.org/conference/nsdi12/technical-sessions/...
[2] https://www.researchgate.net/publication/229002024_Is_it_sti...
มันอาจช่วยได้ในแง่การตั้งค่าความปลอดภัยและความเป็นส่วนตัว
ตัวอย่างเช่นถ้าคิดถึง Great Firewall ของจีน ถ้าสามารถแบ่งทราฟฟิกออกไปหลาย uplink channel ได้ แบบนั้นไฟร์วอลล์จะประกอบกลับขึ้นมาเพื่อบังคับใช้นโยบายได้ยากขึ้นหรือเปล่า?