* 仕様書

[REFS[
- [1] '''[CITE@en[RFC 6455 - The WebSocket Protocol]] ([TIME[2015-03-11 20:42:50 +09:00]] 版) <http://tools.ietf.org/html/rfc6455#section-5.5.3>'''
- [8] [CITE@en[RFC 6455 - The WebSocket Protocol]] ([TIME[2015-03-11 20:42:50 +09:00]] 版) <http://tools.ietf.org/html/rfc6455#section-7.1.7>
- [10] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#ping-and-pong-frames>
]REFS]

* 構文

[2] [CODE[[[opcode]]]] は、 [CODE[[[0xA]]]] です [SRC[>>1]]。
[[制御フレーム]]です。

[3] [[応用データ]]は、返信元の[[[CODE[Ping]]フレーム]]の[[応用データ]]でなければなりません [SRC[>>1]]。

;; [5] 返信元が無い場合の[[応用データ]]は不明です。

* 文脈

[4] [[[CODE[Ping]]フレーム]]を受信したら、[[[CODE[Pong]]フレーム]]を送信しなければなりません。
以前の[[フレーム]]にまだ返信していないなら、直近のものにのみ送信しても構いません [SRC[>>1]]。

[9] ただし [[WebSocket接続失敗]]後は送信しては[['''なりません''']] [SRC[>>8]]。

[6] 要求がなくても送信しても構いません ([DFN[[[unsolicited Pong frame]]]]) [SRC[>>1]]。

;; [7] 単方向の [[heartbeat]] として機能します [SRC[>>1]]。

[11] [[利用者エージェント]]は、必要に応じて ([[NAT]] に[[接続]]を保持させるため、
[[接続]]の切断を検出するためなどの目的で) [[Pongフレーム]]を送信して構いません [SRC[>>10]]。
しかし[[サーバー]]を助ける目的で送信しては[['''なりません''']] [SRC[>>10]]。

;; [[サーバー]]は必要があるなら自身で適宜送信するべきです。

;; [14] これは [[fingerprinting vector]] かもしれません。

* 処理

[12] [[[CODE[Pong]]フレーム]]を受信しても、何もしなくて構いません。

[13] [[[CODE[Ping]]フレーム]]と同じ[[応用データ]]を含めなければならないということは、
自身が送信したものと同じものが返ってくるかチェックして、時間を計測するなどの使い方が想定されていそうです。
しかしそのように使わなければならない義務があるわけではありません。

* 関連

[15] [[HTTP/2]] では [CODE[[[PING]]]] [[フレーム]] ([CODE[[[ACK]]]] フラグ付き)
に相当します。
