TCP port 0 has a special meaning *in many socket API*s (especially the common Berkeley socket API that the POSIX one grew out of), for requesting an ephemeral/dynamic port from the stack. Probably for that reason IANA has reserved that port, so that it is not used in general.

*Within* the actual stack, port 0 has no special meaning (nor does any other number have). Due to its API use it might be (very) hard to put into actual use though. And simply, there's no point to try.

Note that ports are only used with some transport-layer protocols. ICMP (which actually belongs to the network layer although it is encapsulated like an L4 protocol) doesn't use ports.