IP-MPTCP(8)
๐ ip-mptcp โ the MPTCP path manager, explained by your bestie ๐
okay so this is ip-mptcp, a page from the Linux manual, section 8. it's the ip sub-command situation for MPTCP path manager config, and honestly? it's giving networking main character energy. let's get into it ๐ซถ
โจ NAME โจ
ip-mptcp โ MPTCP path manager configuration. that's it, that's the name, no notes ๐
๐ธ SYNOPSIS ๐ธ
the way you invoke this, in all its forms:
ip [ OPTIONS ] mptcp { endpoint | limits | help }
ip mptcp endpoint add IFADDR [ port PORT ] [ dev IFNAME ] [ id ID ] [
FLAG-LIST ]
ip mptcp endpoint delete id ID [ IFADDR ]
ip mptcp endpoint change [ id ID ] [ IFADDR ] [ port PORT ] CHANGE-OPT
ip mptcp endpoint show [ id ID ]
ip mptcp endpoint flush
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG := [ signal | subflow | laminar | backup | fullmesh ]
CHANGE-OPT := [ backup | nobackup | fullmesh | nofullmesh ]
ip mptcp limits set [ subflow SUBFLOW_NR ] [ add_addr_accepted
ADD_ADDR_ACCEPTED_NR ]
ip mptcp limits show
ip mptcp monitor
like, look at all those little brackets. so many optional things. it's lowkey iconic ๐
๐ฆ DESCRIPTION ๐ฆ
so MPTCP is a transport protocol built on top of TCP that lets TCP connections use multiple paths to maximize resource usage and increase redundancy. basically it's TCP but with more friends. โจ
the ip-mptcp sub-commands let you configure several aspects of the MPTCP path manager, which is the thing in charge of subflow creation. it's the group-chat admin of your connections fr fr.
๐ the endpoint object ๐
this one specifies the IP addresses that will be used and/or announced for additional subflows:
ip mptcp endpoint addโ add new MPTCP endpointip mptcp endpoint deleteโ delete existing MPTCP endpointip mptcp endpoint showโ get existing MPTCP endpointip mptcp endpoint flushโ flush all existing MPTCP endpoints
and now the little arguments that go with them, one by one, no skipping bestie:
IFADDRโ an IPv4 or IPv6 address. when used with thedelete idoperation, anIFADDRis only included when theIDis 0. that's the rule, periodt.PORTโ when a port number is specified, incoming MPTCP subflows for already established MPTCP sockets will be accepted on the specified port, regardless the original listener port accepting the first MPTCP subflow and/or this peer being actually on the client side. this option has to be used in combination with thesignalflag. so like,signalor it doesn't count ๐IFNAMEโ the network interface name attached to the endpoint. it's important to specify this device name linked to the address to make sure the system knows how to route packets from the specified IP address to the correct network interface. without this, it might be required to add IP rules and routes to have the expected behavior. so basically if you skip it, you're gonna be out here hand-writing routes. your call ๐IDโ a unique numeric identifier, between 0 and 255, for the given endpoint. it is not possible to add endpoints with ID 0, because this special ID is reserved for the initial subflow. for rules linked to the initial subflow, the path-manager will look at endpoints matching the same address, and port if set, ignoring the ID. 0 is booked, bestie, it's taken, move along ๐signalโ the endpoint will be announced/signalled to each peer via an MPTCPADD_ADDRsub-option. typically, a server would be responsible for this. upon reception of anADD_ADDRsub-option, the other peer, typically the client side, can try to create additional subflows, seeADD_ADDR_ACCEPTED_NR. it's the "hey everyone look at me" flag ๐ฃsubflowโ if additional subflow creation is allowed by the MPTCP limits, the MPTCP path manager will try to create an additional subflow using this endpoint as the source address after the MPTCP connection is established. a client would typically do this. very "i'll start something new" of it ๐ฆlaminarโ the endpoint will be used to create new subflows from the associated address to additional addresses announced by the other peer. this will be done if allowed by the MPTCP limits, and if the associated address is not already being used by another subflow from the same MPTCP connection. note that thefullmeshflag takes precedence over thelaminarone. without any of these two flags, the path-manager will create new subflows to additional addresses announced by the other peer by selecting the source address from the routing tables, which is harder to configure if the announced address is not known in advance. solaminaris the tidy, structured queen and routing-table guessing is the chaos option ๐backupโ if this is a subflow endpoint, the subflows created using this endpoint will have the backup flag set during the connection process. this flag instructs the remote peer to only send data on a given subflow when all non-backup subflows are unavailable. when using the default packet scheduler with a'backup'endpoint, outgoing data from the local peer is also affected: packets will only be sent from this endpoint when all non-backup subflows are unavailable. backup = the understudy. only goes on when the lead is out ๐ญfullmeshโ if this is a subflow endpoint and additional subflow creation is allowed by the MPTCP limits, the MPTCP path manager will try to create an additional subflow for each known peer address, using this endpoint as the source address. this will occur after the MPTCP connection is established. if the peer did not announce any additional addresses using the MPTCPADD_ADDRsub-option, this will behave the same as a plainsubflowendpoint. when the peer does announce addresses, each receivedADD_ADDRsub-option will trigger creation of an additional subflow to generate a full mesh topology. thisfullmeshflag should always be used in combination with thesubflowone to be useful, except for the address used by the initial subflow, wheresubflowis then optional. it's giving "everybody connects to everybody" and honestly? obsessed ๐implicitโ in some scenarios, an MPTCP subflow can use a local address mapped by an implicit endpoint created by the in-kernel path manager. once set, theimplicitflag cannot be removed, but other flags can be added to the endpoint. implicit endpoints cannot be created from user-space. so it's a permanent-marker situation, no erasing โ๏ธ
๐ the limits object ๐
this one specifies the constraints for subflow creations:
ip mptcp limits showโ get current MPTCP subflow creation limitsip mptcp limits setโ change the MPTCP subflow creation limits
and the two knobs inside it:
SUBFLOW_NRโ specifies the maximum number of additional subflows allowed for each MPTCP connection. additional subflows can be created due to: incoming acceptedADD_ADDRsub-option, local subflow endpoints, additional subflows started by the peer. three ways in, one cap to rule them all ๐งADD_ADDR_ACCEPTED_NRโ specifies the maximum number of incomingADD_ADDRsub-options accepted for each MPTCP connection. after receiving the specified number ofADD_ADDRsub-options, any other incoming one will be ignored for the MPTCP connection lifetime. when anADD_ADDRsub-option is accepted and there are no local fullmesh endpoints, the MPTCP path manager will try to create a new subflow using the address in theADD_ADDRsub-option as the destination address and a source address determined using local routing resolution. when fullmesh endpoints are available, the MPTCP path manager will try to create new subflows using each fullmesh endpoint as a source address and the peer'sADD_ADDRaddress as the destination. in both cases theSUBFLOW_NRlimit is enforced. so many rules but it all tracks, trust ๐ซถ
๐ monitor ๐
monitor displays creation and deletion of MPTCP connections as well as addition or removal of remote addresses and subflows. it's the live feed, the storytime, the reality show of your connections. sit back and watch ๐
๐ AUTHOR ๐
Original Manpage by Paolo Abeni <pabeni@redhat.com>
and that's the whole page bestie, no cap, every single flag accounted for ๐
this little love letter comes to you from iproute2, dated 4 Apr 2020 โ yes the source and the date, we're giving credit where it's due, always ๐ธโจ slay, and go configure those endpoints ๐ ๐
๐ฆ where this page comes from
- alpine 3.24: iproute2-doc 7.0.0-r0 ยท GPL-2.0-or-later
- arch rolling: iproute2 7.2.0-1
- arch rolling: iproute2 7.3.0-1 ยท GPL-2.0-or-later
- centos-stream 10: iproute 7.0.0-2.el10 ยท GPL-2.0-or-later AND NIST-PD
- nixos 26.05: iproute2 7.0.0
- nixpkgs unstable: iproute2 7.2.0
- ubuntu resolute: iproute2 6.19.0-1ubuntu1 ยท GPL-2.0-only
- ubuntu resolute: iproute2 6.19.0-1ubuntu1.1 ยท GPL-2.0-only
- ubuntu stonking: iproute2 7.2.0-1ubuntu1 ยท GPL-2.0-only
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms