Note that in the model, 'protocol' (actually one derived class per protocol semantic) receives and originates all p2p messages (apart from explicit broadcasts). Each protocol subscribes to the message type(s) of interest. This is part of the elegance of the design. Each derived protocol class entirely encapsulates the semantic (such as compact blocs, ping/pong, headers, txs, blocks, etc.). These are versioned and are attached independently on each channel (by the session), conforming to the negotiated protocol version of the channel. They are very simple and clearly document each independent protocol.
(edited)