code: public static Buffer consumeSentProtocol(final Buffer buffer) throws IOException, SipParseException {
          expectSIP2_0(buffer);
          expect(buffer, SipParser.SLASH);
  
          final Buffer protocol = consumeToken(buffer);
          if (protocol == null || protocol.isEmpty()) {
              throw new SipParseException(buffer.getReaderIndex(), "Expected transport");
          }
          return protocol;
      }
docs: Consume the "sent-protocol", which according to RFC 3261 is:
  
  <pre>
  sent-protocol = protocol-name SLASH protocol-version SLASH transport
  transport     =  "UDP" / "TCP" / "TLS" / "SCTP" / other-transport
  other-transport   =  token
  </pre>
  
  The "sent-protocol" is only present in a Via header and typically looks
  like this: SIP/2.0/UDP
  
  The consume method will make sure that "SIP/2.0/" is present and if not,
  complain. The transport can really be anything and as such that is what
  you will get back as a return value. Hence, in the above example you
  would get back a buffer consisting of "UDP".
  
  Also note that the transport can be "other-transport" which translates to
  a "token" so we allow really anything and as such we will just consume
  and return the token after verifying that it start with the SIP/2.0
  stuff.
  
  @param buffer
  @return the transport part of the "sent-protocol". Typically this will be
  one of UDP, TCP or TLS.
  @throws IOException
  @throws SipParseException
  in case anything goes wrong while parsing including if the
  protocol-name isn't SIP and the version isn't 2.0