Message IDs are assumed to be compact from ID 0x11 onwards (0x00-0x10 is reserved for the "p2p" capability) and given to each shared (equal-version, equal-name) capability in alphabetic order. Capability names are case-sensitive. Capabilities which are not shared are ignored. If multiple versions are shared of the same (equal name) capability, the numerically highest wins, others are ignored.
It says the message IDs of capabilities start at 0x11, but in reality (e.g. checked Geth, OpenEthereum, Nimbus) the "eth" capability starts at 0x10, so the reserved range for "p2p" is 0x00-0x0f.
The Message ID section of RLPx appears to be incorrect:
It says the message IDs of capabilities start at 0x11, but in reality (e.g. checked Geth, OpenEthereum, Nimbus) the "eth" capability starts at 0x10, so the reserved range for "p2p" is 0x00-0x0f.