メインコンテンツまでスキップ

3. ハートビートプロトコル

ハートビートプロトコル (Heartbeat protocol) は、レコード層 (Record Layer) の上で動作する新しいプロトコルです。プロトコル自体は 2 つのメッセージタイプで構成されています:HeartbeatRequest と HeartbeatResponse です。

enum {
heartbeat_request(1),
heartbeat_response(2),
(255)
} HeartbeatMessageType;

HeartbeatRequest メッセージは、接続の存続期間中のほぼ任意の時点で到着する可能性があります。HeartbeatRequest メッセージを受信した場合は常に、対応する HeartbeatResponse メッセージで応答すべきです (SHOULD)。

ただし、HeartbeatRequest メッセージはハンドシェイク中に送信すべきではありません (SHOULD NOT)。HeartbeatRequest がまだ転送中にハンドシェイクが開始された場合、送信側ピアはそのための DTLS 再送タイマーを停止しなければなりません (MUST)。受信側ピアは、ハンドシェイク中にメッセージが到着した場合、メッセージを静かに破棄すべきです (SHOULD)。DTLS の場合、古いエポック (epochs) からの HeartbeatRequest メッセージは破棄すべきです (SHOULD)。

同時に複数の HeartbeatRequest メッセージが転送中であってはなりません (MUST NOT)。HeartbeatRequest メッセージは、対応する HeartbeatResponse メッセージが受信されるまで、または再送タイマーが期限切れになるまで、転送中であると見なされます。

データグラム輻輳制御プロトコル (Datagram Congestion Control Protocol, DCCP) や UDP のような信頼性のないトランスポートプロトコルを使用する場合、HeartbeatRequest メッセージは、[RFC6347] のセクション 4.2.4 に記載されている DTLS がフライト (flights) に使用する単純なタイムアウトおよび再送方式を使用して再送しなければなりません (MUST)。特に、予期されるペイロードを持つ対応する HeartbeatResponse メッセージを受信せずに何度か再送した後、DTLS 接続を終了すべきです (SHOULD)。これに使用されるしきい値は、DTLS ハンドシェイクメッセージと同じであるべきです (SHOULD)。HeartbeatRequest メッセージを監視するタイマーが期限切れになった後、このメッセージはもはや転送中とは見なされないことに注意してください。したがって、HeartbeatRequest メッセージは再送の対象となります。再送方式と、転送中の HeartbeatRequest が 1 つのみ許可されるという制限を組み合わせることで、トランスポートプロトコルが輻輳制御を提供しない場合(DTLS over UDP の場合など)でも、輻輳制御が適切に処理されることが保証されます。

ストリーム制御伝送プロトコル (Stream Control Transmission Protocol, SCTP) や TCP のような信頼性のあるトランスポートプロトコルを使用する場合、HeartbeatRequest メッセージは一度だけ送信する必要があります。トランスポート層が再送を処理します。一定時間後に対応する HeartbeatResponse メッセージが受信されなかった場合、HeartbeatRequest メッセージの送信を開始したアプリケーションによって DTLS/TLS 接続を終了してもかまいません (MAY)。