3. Protocole Heartbeat
Le protocole Heartbeat est un nouveau protocole fonctionnant au-dessus de la couche d'enregistrement (Record Layer). Le protocole lui-même se compose de deux types de messages : HeartbeatRequest et HeartbeatResponse.
enum {
heartbeat_request(1),
heartbeat_response(2),
(255)
} HeartbeatMessageType;
Un message HeartbeatRequest peut arriver à presque tout moment pendant la durée de vie d'une connexion. Chaque fois qu'un message HeartbeatRequest est reçu, il DEVRAIT (SHOULD) recevoir une réponse avec un message HeartbeatResponse correspondant.
Cependant, un message HeartbeatRequest NE DEVRAIT PAS (SHOULD NOT) être envoyé pendant les poignées de main (handshakes). Si une poignée de main est initiée alors qu'une HeartbeatRequest est encore en cours de transmission, le pair émetteur DOIT (MUST) arrêter le temporisateur de retransmission DTLS pour celle-ci. Le pair récepteur DEVRAIT (SHOULD) abandonner le message silencieusement s'il arrive pendant la poignée de main. Dans le cas de DTLS, les messages HeartbeatRequest provenant d'époques plus anciennes DEVRAIENT (SHOULD) être abandonnés.
Il NE DOIT PAS (MUST NOT) y avoir plus d'un message HeartbeatRequest en cours de transmission à la fois. Un message HeartbeatRequest est considéré comme étant en cours de transmission jusqu'à ce que le message HeartbeatResponse correspondant soit reçu, ou jusqu'à ce que le temporisateur de retransmission expire.
Lors de l'utilisation d'un protocole de transport non fiable comme le protocole de contrôle de congestion de datagramme (Datagram Congestion Control Protocol, DCCP) ou UDP, les messages HeartbeatRequest DOIVENT (MUST) être retransmis en utilisant le schéma simple de temporisation et de retransmission que DTLS utilise pour les vols, comme décrit dans la section 4.2.4 de [RFC6347]. En particulier, après un certain nombre de retransmissions sans recevoir un message HeartbeatResponse correspondant contenant la charge utile attendue, la connexion DTLS DEVRAIT (SHOULD) être terminée. Le seuil utilisé pour cela DEVRAIT (SHOULD) être le même que pour les messages de poignée de main DTLS. Veuillez noter qu'après l'expiration du temporisateur supervisant un message HeartbeatRequest, ce message n'est plus considéré comme étant en cours de transmission. Par conséquent, le message HeartbeatRequest est éligible pour la retransmission. Le schéma de retransmission, en combinaison avec la restriction selon laquelle une seule HeartbeatRequest est autorisée à être en cours de transmission, garantit que le contrôle de congestion est géré de manière appropriée dans le cas où le protocole de transport n'en fournit pas, comme dans le cas de DTLS sur UDP.
Lors de l'utilisation d'un protocole de transport fiable comme le protocole de contrôle de transmission de flux (Stream Control Transmission Protocol, SCTP) ou TCP, les messages HeartbeatRequest n'ont besoin d'être envoyés qu'une seule fois. La couche de transport gérera les retransmissions. Si aucun message HeartbeatResponse correspondant n'a été reçu après un certain temps, la connexion DTLS/TLS PEUT (MAY) être terminée par l'application qui a initié l'envoi du message HeartbeatRequest.