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.
The canister message payload size limit is indeed 2 MB. Subnet-local canister requests may go up to 10 MB, but we will be deprecating that now that chunked Wasm uploads have been implemented (since the metrics seem to show that requests larger than 10 MB are only ever made to the management canister; i.e. they appear to be canister installs only).
But for whatever reason, the ingress response payload size limit is 3 MB.