If I recall there are a few relevant limits.
- Ingress
- X-Subnet
- Same Subnet inter canister
I think they may all be different. I didn’t think it was possible to get over 3MB, but it may be. I think everyone settled on 2MB because size also affects your instruction limit during a round and at 1x time slicing I think maybe if you tried to go much over 2MB there wasn’t much else you could do in your round. That is probably different now that we have more instructions.
Or maybe it was that the XSubnet was around 2MB which is what is referred to often in this thread: Scalable Messaging Model
If the second is the case then likely 2MB was chosen so that if you want the IC to reason about your service then best to keep it below 2MB.