A lot of things need to be considered when designing a new protocol.<p>Versioning is clearly <i></i><i>not</i><i></i> enough: IP for example has <i>many</i> version fields, but that&#x27;s not helping IPv6&#x27;s adoption. You may not be able to &quot;replace all the old versions&quot; if your protocol becomes popular, so you need to consider how you will update it anyway.<p>Tags are worth study: If ECN had been implemented as a new IP option instead of appropriating a bit that &quot;everyone should be ignoring&quot; we would&#x27;ve avoided a lot of problems a few years ago.<p>Differentiating between &quot;must implement to operate&quot; and &quot;may implement&quot; is also useful. Sometimes you can add this with a flag or special notation (e.g. PNG and RIFF), but for protocols you can also use negotiation: Telnet&#x27;s WILL&#x2F;WON&#x27;T&#x2F;DO&#x2F;DON&#x27;T&#x2F;CAN&#x2F;CAN&#x27;T system, for example.<p>Specifying failure cases is also good: To make sure people implement reliable systems, I often design into the spec the retry protocol and have a mode (used in interoperation) that causes random failures so they have to implement the retry protocol correctly.