Multipath TCP(MPTCP)의 소개, 사용 사례, 개념(경로 관리자와 패킷 스케줄러), 기능, 커뮤니케이션 채널, 관련 프로젝트 및 커널 개발 리소스를 정리한 페이지.
Multipath TCP 또는 MPTCP는 표준 TCP의 확장으로, RFC 8684에 기술되어 있습니다. 하나의 MPTCP 연결에서 동시에 여러 인터페이스를 활용해 TCP 패킷을 송수신할 수 있게 해줍니다. MPTCP는 여러 인터페이스의 대역폭을 집계하거나, 지연이 가장 낮은 인터페이스를 우선시할 수 있습니다. 또한 한 경로가 내려갔을 때 자동으로 장애 조치(fail-over)하여 트래픽을 다른 경로로 끊김 없이 재주입할 수 있습니다.
graph TD;
subgraph MPTCP
direction LR
C_1(<div style="display: inline-block; min-width: 32px"><font size="7">fa:fa-mobile</font></div>)
S_1((<div style="display: inline-block; min-width: 55px"><font size="7">fa:fa-cloud</font></div>))
end
subgraph TCP
direction LR
C_2(<div style="display: inline-block; min-width: 32px"><font size="7">fa:fa-mobile</font></div>)
S_2((<div style="display: inline-block; min-width: 55px"><font size="7">fa:fa-cloud</font></div>))
end
C_1 <== "5G" ==> S_1
C_1 <== "Wi-Fi<br /><br />여러 경로 (<i>서브플로우</i>)를<br />동시에" ==> S_1
C_2 x-. "5G" .-x S_2
C_2 <== "Wi-Fi<br /><br />한 번에 하나의 경로" ==> S_2
linkStyle 0 stroke:green;
linkStyle 1 stroke:green;
linkStyle 2 stroke:red;
linkStyle 3 stroke:green;
MPTCP 덕분에 여러 경로를 병렬 또는 동시에 사용할 수 있어, TCP와 비교해 새로운 사용 사례가 가능합니다:
기술적으로, IPPROTO_MPTCP 프로토콜(Linux 전용)로 새 소켓을 생성하면 하나의 서브플로우(또는 경로)가 만들어집니다. 이 _서브플로우_는 한 인터페이스를 통해 데이터를 전송하는 일반적인 TCP 연결로 구성됩니다. 이후 호스트 간 협상을 통해 추가 _서브플로우_를 생성할 수 있습니다. 원격 호스트가 MPTCP 사용을 감지할 수 있도록, 하위 TCP _서브플로우_의 TCP 옵션 필드에 새로운 필드가 추가됩니다. 이 필드에는 상대방이 지원할 경우 MPTCP를 사용하도록 지시하는 MP_CAPABLE 옵션 등이 포함됩니다. 원격 호스트나 중간의 어떤 미들박스라도 이를 지원하지 않으면, 반환되는 SYN+ACK 패킷에는 TCP 옵션 필드에 MPTCP 옵션이 포함되지 않습니다. 이 경우 연결은 일반 TCP로 “다운그레이드”되어 단일 경로로 계속됩니다.
이 동작은 내부의 두 구성 요소, 즉 경로 관리자(path manager)와 패킷 스케줄러(packet scheduler)로 가능해집니다.
Path Manager는 _서브플로우_의 생성부터 삭제, 그리고 주소 알림까지 담당합니다. 일반적으로 클라이언트 측이 서브플로우를 시작하고, 서버 측이 ADD_ADDR 및 REMOVE_ADDR 옵션을 통해 추가 주소를 알립니다.
graph LR;
C_1(<div style="display: inline-block; min-width: 35px"><font size="7">fa:fa-mobile</font></div>)
S_1((<div style="display: inline-block; min-width: 60px"><font size="7">fa:fa-cloud</font></div>))
C_1 -. "잠재적 서브플로우" -.- S_1
C_1 <== "초기 서브플로우" ==> S_1
C_1 ~~~|"서브플로우 생성"| C_1
S_1 ~~~|"주소 알림"| S_1
linkStyle 0 stroke:orange;
linkStyle 1 stroke:green;
Linux v5.19 기준, net.mptcp.pm_type sysctl 항목으로 제어되는 두 가지 경로 관리자가 있습니다. 커널 내(in-kernel) 관리자(유형 0)는 모든 연결에 동일한 규칙을 적용합니다(참고: ip mptcp). 사용자 공간(userspace) 관리자(유형 1)는 사용자 공간 데몬(예: mptcpd)이 제어하며, 연결별로 서로 다른 규칙을 적용할 수 있습니다.
패킷 스케줄러는 다음 데이터 패킷을 전송할 때 사용할 수 있는 서브플로우(들) 중 어떤 것을 선택할지 결정합니다. 가용 대역폭 사용을 극대화하도록 결정할 수도 있고, 지연이 더 낮은 경로만 선택하도록 할 수도 있으며, 구성에 따라 다른 정책을 적용할 수도 있습니다.
graph LR;
A_2(<div style="display: inline-block; min-width: 40px"><font size="7">fa:fa-user</font></div>)
PS{패킷<br />스케줄러}
I_21(서브플로우 1)
I_22(서브플로우 2)
A_2 == "<div style='display: inline-block; min-width: 50px'>fa:fa-box fa:fa-box fa:fa-box</div>" ==> PS
PS -- "<div style='display: inline-block; min-width: 32px'>fa:fa-box fa:fa-box</div>" --> I_21
PS -- "<div style='display: inline-block; min-width: 14px'>fa:fa-box</div>" --> I_22
PS ~~~|"서브플로우 간 패킷 분배"| PS
Linux v6.8 기준, net.mptcp의 sysctl 항목들로 제어되는 패킷 스케줄러는 하나만 존재합니다.
Linux v6.10 기준, MPTCP의 주요 기능은 다음과 같습니다:
socket() 시스템 호출에서 IPPROTO_MPTCP 프로토콜 지원ss 명령에서 사용), 트레이스포인트를 포함한 디버그 기능자세한 내용은 ChangeLog를 참조하세요.
메일링 리스트: mptcp@lists.linux.dev (plain text 전용):
IRC: libera.chat의 #mptcp
온라인 미팅
MPTCP 커뮤니티 구성원이 유지보수하는 프로젝트
MPTCP 관련 개선 사항이 포함된 프로젝트
ip mptcp 명령)