Multipath TCP สำหรับ Linux (ปี 2022)
(mptcp.dev)ภาพรวมของ Multipath TCP
- Multipath TCP (MPTCP) เป็นส่วนขยายของ TCP มาตรฐานและมีการอธิบายไว้ใน RFC 8684
- ช่วยให้อุปกรณ์สามารถใช้หลายอินเทอร์เฟซพร้อมกันเพื่อส่งและรับแพ็กเก็ต TCP ผ่านการเชื่อมต่อ MPTCP เดียว
- MPTCP สามารถรวมแบนด์วิดท์ของหลายอินเทอร์เฟซเข้าด้วยกัน หรือเลือกใช้อินเทอร์เฟซที่มีเวลาแฝงต่ำที่สุดเป็นหลัก
- นอกจากนี้ แม้เส้นทางหนึ่งจะล่มก็ยังสามารถทำ failover ได้ และทราฟฟิกจะถูกส่งต่อไปยังเส้นทางอื่นอย่างราบรื่น
กรณีการใช้งานของ MPTCP
- การที่ MPTCP ทำให้สามารถใช้หลายเส้นทางแบบขนานหรือพร้อมกันได้ ทำให้เกิดกรณีการใช้งานใหม่เมื่อเทียบกับ TCP:
- Seamless handovers: สลับจากเส้นทางหนึ่งไปอีกเส้นทางหนึ่งโดยยังคงรักษาการเชื่อมต่อไว้ Apple ใช้ MPTCP บนสมาร์ตโฟนเป็นหลักด้วยเหตุผลนี้มาตั้งแต่ปี 2013
- Best network selection: ใช้เส้นทางที่ "ดีที่สุด" ตามเงื่อนไขบางอย่าง เช่น latency, loss, cost และ bandwidth
- Network aggregation: ใช้หลายเส้นทางพร้อมกันเพื่อให้ได้ throughput สูงขึ้น เช่น รวมเครือข่ายแบบมีสายและเครือข่ายมือถือเพื่อส่งไฟล์ได้เร็วขึ้น
แนวคิดของ MPTCP
- เมื่อสร้างซ็อกเก็ตใหม่ด้วยโปรโตคอล IPPROTO_MPTCP (เฉพาะ Linux) จะมีการสร้าง subflow (หรือ path) ซึ่งประกอบด้วยการเชื่อมต่อ TCP ปกติที่ใช้ส่งข้อมูลผ่านอินเทอร์เฟซหนึ่ง
- สามารถเจรจาเพิ่ม subflow เพิ่มเติมระหว่างโฮสต์ได้ในภายหลัง
- มีการเพิ่มฟิลด์ใหม่ใน TCP option field ของ TCP subflow หลัก เพื่อให้โฮสต์ปลายทางตรวจพบว่ามีการใช้ MPTCP
- ฟิลด์นี้มีตัวเลือกอย่าง MP_CAPABLE ซึ่งแจ้งให้อีกโฮสต์ใช้งาน MPTCP หากรองรับ
- หากโฮสต์ปลายทางหรือ middlebox ระหว่างทางไม่รองรับ MPTCP ใน TCP option field ของแพ็กเก็ต SYN+ACK ที่ตอบกลับจะไม่มี MPTCP option
- ในกรณีนี้ การเชื่อมต่อจะถูก "downgrade" เป็น TCP ปกติและดำเนินต่อไปแบบเส้นทางเดียว
พฤติกรรมนี้เกิดขึ้นได้จากองค์ประกอบภายในสองส่วนคือ Path Manager และ Packet Scheduler
Path Manager
- Path Manager รับผิดชอบ subflow ตั้งแต่การสร้างจนถึงการลบ และรับผิดชอบการประกาศที่อยู่ด้วย
- โดยทั่วไป ฝั่งไคลเอนต์จะเป็นผู้เริ่ม subflow และฝั่งเซิร์ฟเวอร์จะแจ้งที่อยู่เพิ่มเติมผ่านตัวเลือก ADD_ADDR และ REMOVE_ADDR
- ณ Linux v5.19 มี Path Manager 2 แบบที่ควบคุมด้วย sysctl knob
net.mptcp.pm_type:- in-kernel (type 0): ใช้กฎเดียวกันกับทุกการเชื่อมต่อ (ดู
ip mptcp) - userspace (type 1): ควบคุมโดย userspace daemon (เช่น
mptcpd) และสามารถใช้กฎต่างกันในแต่ละการเชื่อมต่อได้
- in-kernel (type 0): ใช้กฎเดียวกันกับทุกการเชื่อมต่อ (ดู
Packet Scheduler
- Packet Scheduler มีหน้าที่เลือก subflow ที่จะใช้ส่งแพ็กเก็ตข้อมูลถัดไปจากบรรดา subflow ที่พร้อมใช้งาน
- สามารถตัดสินนโยบายต่าง ๆ ได้ตามการตั้งค่า เช่น ใช้แบนด์วิดท์ที่มีอยู่ให้มากที่สุด หรือเลือกเฉพาะเส้นทางที่มีเวลาแฝงต่ำที่สุด
- ณ Linux v6.8 มี Packet Scheduler เพียงตัวเดียวที่ควบคุมด้วย sysctl knob ของ
net.mptcp
คุณสมบัติหลักของ MPTCP (ณ Linux v6.10)
- รองรับโปรโตคอล IPPROTO_MPTCP ใน system call
socket() - fallback จาก MPTCP เป็น TCP หาก peer หรือ middlebox ไม่รองรับ MPTCP
- การจัดการเส้นทางโดยใช้ path manager ภายในเคอร์เนลหรือใน userspace
- socket options ที่มักใช้กับ TCP socket ทั่วไป
- ความสามารถด้านดีบัก รวมถึง MIB counters, การรองรับ diag (ใช้ในคำสั่ง
ss) และ trace points
ความเห็นของ GN⁺
- MPTCP เป็นเทคโนโลยีที่มีประโยชน์มากเมื่ออุปกรณ์ปลายทางเชื่อมต่อกับหลายเครือข่าย สามารถนำไปใช้ได้อย่างมีประสิทธิภาพกับ 5G-Wi-Fi handover หรือการรวมเครือข่ายต่างชนิด
- อย่างไรก็ตาม มีข้อจำกัดว่าทั้งฝั่งเซิร์ฟเวอร์และไคลเอนต์ต้องมีการติดตั้งรองรับ MPTCP และเครือข่ายระหว่างทางก็ต้องรองรับ MPTCP ด้วย จึงน่าจะต้องใช้เวลากว่าจะใช้งานกันอย่างแพร่หลาย
- โปรโตคอล QUIC ของ Google ก็มีความสามารถแบบ multipath ที่คล้ายกัน และคาดว่า QUIC ซึ่งเรียบง่ายกว่าและอยู่บนพื้นฐานของ UDP จะกระจายตัวได้เร็วกว่า จึงน่าจะเกิดการแข่งขันระหว่าง MPTCP กับ QUIC
- ต่างจากการติดตั้งใช้งาน MPTCP สำหรับ Linux ที่ผูกกับเคอร์เนล Apple ได้พัฒนา MPTCP ใน user space ของตนเองและใส่มาใน iOS และ macOS แล้ว Google ก็มีแนวโน้มว่าจะเลือกแนวทางที่คล้ายกัน
- หากต้องการให้การควบคุมเส้นทางและนโยบายการจัดตารางของ MPTCP เหมาะสมกับความต้องการของแอปพลิเคชัน ก็อาจจำเป็นต้องมีการแลกเปลี่ยนข้อมูลระหว่างแอปพลิเคชันกับ MPTCP ผ่าน API ซึ่งจากที่ทราบยังไม่มีแนวทางที่เป็นมาตรฐานในเรื่องนี้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News