Каждое сообщение протокола Handshake содержит специальный заголовок, состоящий из четырех байтов. Первый байт содержит код типа сообщения, три следующих байта - длину сообщения:
enum { | |
hello_request(0), client_hellо(1), server_hello(2), | |
certificate(11), certificate_request(13), | |
server_hello_done(14), certificate_verify(15) , | |
client_key_exchange(16), finished(20), (255) | |
} HandshakeType; | |
struct { | |
HandshakeType msg_type; | /*handshake type */ |
uint24 length; | /*bytes in message */ |
select (HandshakeType) { | |
case hello_request: | HelloRequest; |
case client_hello: | ClientHello; |
case server_hello: | ServerHello; |
case certificate: | Certificate; |
case certificate_request: | CertificateRequest; |
case server_hello_done: | ServerHelloDone; |
case certificate_verify: | CertificateVerify; |
case client_key_exchange: | ClientKeyExchange; |
case finished: | Finished; |
} body; | |
} Handshake; |
Сообщения протокола Handshake, описанные ниже, приведены в том порядке, в котором они должны следовать для обеспечения корректной работы протокола. Единственным исключением является сообщение запроса приветствия (HelloRequest), которое может быть послано сервером в любой момент, но которое должно быть проигнорировано клиентом, если оно получено во время выполнения протокола Handshake.