* 仕様書

[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.2>'''
- [7] [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[[[0x9]]]] です [SRC[>>1]]。
[[Pingフレーム]]は、[[制御フレーム]]です。

[3] [[応用データ]]を含めて構いません [SRC[>>1]]。
[[応用データ]]は特に規定がなく、任意のバイト列で良いようです。
ただし[[制御フレーム]]の長さ制限から、125バイト以下でなければなりません。

* 文脈

[5] [[WebSocket接続の確立]]の後、任意の時機に送信できます [SRC[>>1]]。

;; [6] [[keepalive]] としても、相手がまだ反応するか検証する手段としても使えます [SRC[>>1]]。

[8] [[利用者エージェント]]は、必要に応じて ([[NAT]] に[[接続]]を保持させるため、
[[接続]]の切断を検出するためなどの目的で) [[Pingフレーム]]を送信して構いません [SRC[>>7]]。
しかし[[サーバー]]を助ける目的で送信しては[['''なりません''']] [SRC[>>7]]。

;; [[サーバー]]は必要があるなら自身で適宜送信するべきです。

;; [9] これは [[fingerprinting vector]] かもしれません。

[16] [[Chrome]] も [[Firefox]] も、(少なくても数時間以内には)
[[Pingフレーム]]や[[Pongフレーム]]を自発的に送信することはないようです。
[TIME[2015-08-17T02:36:51.100Z]]

;; [17] [[Firefox]] は送信・設定できるようにしたようですが [SRC[>>12]]、
その後 [[TCP keep alive]] が実装されたことで使われなくなったと思われます。

* 処理

[4] [[Pingフレーム]]を受信したら、既に [[[CODE[Close]]フレーム]]を受信した場合を除き、
[[[CODE[Pong]]フレーム]]を送信しなければ[['''なりません''']]。
これはできるだけすぐに送信する[['''べきです''']]。 [SRC[>>1]]
[[応用データ]]を返送しなければなりません。
複数受信した場合は、最後のものにのみ返信することとしても構いません。

[11] [[Chrome]] も [[Firefox]] も、すべてに順に返信しているように見えます。 [TIME[2015-08-16T14:59:12.400Z]]

-*-*-

[21] [[Webブラウザー]]の [CODE[WebSocket]] [[API]] は [[Pingフレーム]]や
[[Pongフレーム]]を扱う手段を一切提供していません。 [[JavaScript]]
側で扱うべきものではなく、[[プロトコル]]の内部処理に過ぎないと考えられています。

[22] [[Webサーバー]]側の [[API]] や、[[Webブラウザー]]以外の[[クライアント]]の
[[API]] は、 [[Pingフレーム]]や [[Pongフレーム]]を扱う手段を提供できます。
しかし[[アプリケーション]]のデータはすべて[[テキストフレーム]]や[[バイナリーフレーム]]で送受信するべきで、
[[Pingフレーム]]や[[Pongフレーム]]が[[アプリケーション]]の処理に影響するべきではありません。

* 関連

[10] [[HTTP/2]] では [CODE[[[PING]]]] [[フレーム]] ([CODE[[[ACK]]]] 未設定)
に相当します。

* 歴史

[12] [CITE@en[855906 – Set pingInterval on websocket]]
([TIME[2015-08-17 00:37:36 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=855906>

[13] [CITE@en[849364 – Provide per-websocket way to enable keepalive pings]]
([TIME[2015-08-17 00:38:16 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=849364>

[14] [CITE@en[894879 – SimplePush: Adaptive ping for WebSocket]]
([TIME[2015-08-17 00:39:40 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=894879>

[15] [CITE@en[13104 – Enable keepalive on WebSocket API]]
([TIME[2015-08-17 01:02:33 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=13104>

[FIG(quote)[
[FIGCAPTION[
[18] [CITE[Bitfinex API Reference]]
([TIME[2016-05-12 07:24:33 +09:00]])
<http://docs.bitfinex.com/#info-messages>
]FIGCAPTION]

> Ping/Pong
> // request
> {
>    "event":"ping"
> }
> // response
> {
>    "event":"pong"
> }
> Use ping message to test your connection to the websocket server.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[19] [CITE[Bitfinex API Reference]]
([TIME[2016-05-12 07:24:33 +09:00]])
<http://docs.bitfinex.com/#heartbeating>
]FIGCAPTION]

> Heartbeating
> '''['''"<Chan Id>", "hb"''']'''
> If there is no new message in the channel for 1 second, Websocket server will send you an heartbeat message in this format.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[20] [CITE@en[RFC 7977 - The WebSocket Protocol as a Transport for the Message Session Relay Protocol (MSRP)]]
([TIME[2016-10-04 23:50:28 +09:00]])
<https://tools.ietf.org/html/rfc7977#section-6>
]FIGCAPTION]

> It is RECOMMENDED that MSRP WebSocket Clients and Servers keep their
>    WebSocket connections open by sending periodic WebSocket "Ping"
>    frames as described in Section 5.5.2 of '''['''RFC6455''']'''.
>    The WebSocket API '''['''WS-API''']''' does not provide a mechanism for
>    applications running in a web browser to control whether or not
>    periodic WebSocket "Ping" frames are sent to the server.  The
>    implementation of such a keepalive feature is the decision of each
>    web browser manufacturer and may also depend on the configuration of
>    the web browser.
>    A future WebSocket protocol extension providing a similar keepalive
>    mechanism could also be used.
>    When MSRP WebSocket Clients or Servers cannot use WebSocket "Ping"
>    frames to keep connections open, an MSRP implementation MAY use
>    bodiless SEND requests as described in Section 7.1 of '''['''RFC4975''']'''.
>    MSRP WebSocket Clients or Servers MUST be prepared to receive
>    bodiless SEND requests.

]FIG]


[23] [CITE@ja[机「9」文字事件 - Wikipedia]]
([TIME[2019-08-03 17:57:45 +09:00]])
<https://ja.wikipedia.org/wiki/%E6%9C%BA%E3%80%8C9%E3%80%8D%E6%96%87%E5%AD%97%E4%BA%8B%E4%BB%B6>