public bool TryHandshake(AmqpProtocol client, out AmqpProtocol server)
        {
            if (_client == null)
            {
                _client = new TcpClient();
                _client.Connect(_endpoint, AmqpPort);
                _stream = _client.GetStream();
                _inner  = _stream;
                UpgradeToTls();
            }

            Span <byte> amqp = stackalloc byte[16]; // slack is needed for read (below)

            amqp[0] = (byte)'A';
            amqp[1] = (byte)'M';
            amqp[2] = (byte)'Q';
            amqp[3] = (byte)'P';
            amqp[4] = (byte)client.Security;
            amqp[5] = client.Major;
            amqp[6] = client.Minor;
            amqp[7] = client.Revision;
            _stream.Write(amqp.Slice(0, 8));
            _stream.Flush();

            amqp.Clear();
            int read     = _stream.Read(amqp);
            var response = amqp.Slice(0, read);

            return(TryParseHandshake(response, out server));
        }
 bool TryParseHandshake(ReadOnlySpan <byte> response, out AmqpProtocol protocol)
 {
     if (response.Length == 8 && response.StartsWith(s_Amqp))
     {
         protocol          = new AmqpProtocol();
         protocol.Security = (AmqpSecurity)response[4];
         protocol.Major    = response[5];
         protocol.Minor    = response[6];
         protocol.Revision = response[7];
         return(true);
     }
     else
     {
         protocol = default;
         return(false);
     }
 }