3. Protocollo Heartbeat
Il protocollo Heartbeat è un nuovo protocollo che opera sopra il livello di registrazione (Record Layer). Il protocollo stesso consiste di due tipi di messaggi: HeartbeatRequest e HeartbeatResponse.
enum {
heartbeat_request(1),
heartbeat_response(2),
(255)
} HeartbeatMessageType;
Un messaggio HeartbeatRequest può arrivare quasi in qualsiasi momento durante la durata di una connessione. Ogni volta che viene ricevuto un messaggio HeartbeatRequest, DOVREBBE (SHOULD) essere risposto con un corrispondente messaggio HeartbeatResponse.
Tuttavia, un messaggio HeartbeatRequest NON DOVREBBE (SHOULD NOT) essere inviato durante gli handshake. Se viene avviato un handshake mentre una HeartbeatRequest è ancora in transito, il peer mittente DEVE (MUST) interrompere il timer di ritrasmissione DTLS per essa. Il peer ricevente DOVREBBE (SHOULD) scartare il messaggio silenziosamente se arriva durante l'handshake. Nel caso di DTLS, i messaggi HeartbeatRequest provenienti da epoche precedenti DOVREBBERO (SHOULD) essere scartati.
NON DEVE (MUST NOT) esserci più di un messaggio HeartbeatRequest in transito alla volta. Un messaggio HeartbeatRequest è considerato in transito fino a quando non viene ricevuto il corrispondente messaggio HeartbeatResponse, o fino a quando non scade il timer di ritrasmissione.
Quando si utilizza un protocollo di trasporto non affidabile come il protocollo di controllo della congestione dei datagrammi (Datagram Congestion Control Protocol, DCCP) o UDP, i messaggi HeartbeatRequest DEVONO (MUST) essere ritrasmessi utilizzando il semplice schema di timeout e ritrasmissione che DTLS utilizza per i voli, come descritto nella sezione 4.2.4 di [RFC6347]. In particolare, dopo un certo numero di ritrasmissioni senza ricevere un corrispondente messaggio HeartbeatResponse contenente il payload atteso, la connessione DTLS DOVREBBE (SHOULD) essere terminata. La soglia utilizzata per questo DOVREBBE (SHOULD) essere la stessa dei messaggi di handshake DTLS. Si noti che dopo la scadenza del timer che supervisiona un messaggio HeartbeatRequest, questo messaggio non è più considerato in transito. Pertanto, il messaggio HeartbeatRequest è idoneo per la ritrasmissione. Lo schema di ritrasmissione, in combinazione con la restrizione che solo una HeartbeatRequest è consentita in transito, garantisce che il controllo della congestione sia gestito in modo appropriato nel caso in cui il protocollo di trasporto non ne fornisca uno, come nel caso di DTLS su UDP.
Quando si utilizza un protocollo di trasporto affidabile come il protocollo di trasmissione del controllo di flusso (Stream Control Transmission Protocol, SCTP) o TCP, i messaggi HeartbeatRequest devono essere inviati solo una volta. Il livello di trasporto gestirà le ritrasmissioni. Se non è stato ricevuto alcun messaggio HeartbeatResponse corrispondente dopo un certo periodo di tempo, la connessione DTLS/TLS PUÒ (MAY) essere terminata dall'applicazione che ha avviato l'invio del messaggio HeartbeatRequest.