One very immediate reason is that null field numbers are rejected by protoc :
test.proto:2:28: Field numbers must be positive integers.
As to why Buffer protocols were designed this way, I can only guess. One of the nice consequences of this is that a message with zeros will be detected as invalid. It can also be used to indicate "no field" inside as the return value in the implementation of the protocol buffers.
source share