RFC6455 仕様性質カタログ claude
claudeくんにRFC6455本文から抽出させた、形式検証でつかう仕様性質カタログ。
RFC6455 仕様性質カタログ(形式検証対象の洗い出し)
出典: RFC6455 本文 https://datatracker.ietf.org/doc/html/rfc6455 (normative 文言を裏取り済み)。
4観点(状態機械 / フレーミング / 制御・タイミング / マスク・エラー)で棚卸しし、重複を統合した。
数学的性質(masking involution, length roundtrip, UTF-8 健全性)は既証(WsProof.{Masking,LengthCodec,Utf8})。
本カタログは プロトコル仕様としての性質(状態機械の不変条件・MUST/MUST NOT・ワークフロー・順序/タイミング)。
凡例: 型 = invariant(単一ステップ不変) / pre / post / temporal(trace上の順序・応答義務・到達可能性)。 優先度 = C(critical) / I(important) / N(nice-to-have)。
A. 状態機械ライフサイクル (§5.1, §7)
| ID | 性質 | RFC | 型 | 優先 |
|---|---|---|---|---|
| S-01 | 状態は OPEN→CLOSING→CLOSED の一方向遷移のみ(逆行しない) | §7.1.2-4 | invariant | C |
| S-02 | CLOSED は吸収状態(以降どのイベントでも CLOSED のまま) | §7.1.4 | invariant | C |
| S-03 | Close 送信後はデータフレームを送らない(“does not send any further data”) | §5.5.1 | invariant | C |
| S-04 | Close 受信後は以降のデータを破棄する(“discards any further data”) | §5.5.1 | invariant | I |
| S-05 | Close 受信→未送信なら Close で応答(送信済みなら不要) | §5.5.1 | post | C |
| S-06 | 両端同時 Close(race)でも双方 CLOSED に収束 | §7.1.2 | temporal | I |
B. フレーミング / フラグメント (§5.2, §5.4)
| ID | 性質 | RFC | 型 | 優先 |
|---|---|---|---|---|
| F-01 | 単一メッセージ = FIN=1 ∧ opcode≠0 | §5.4 | invariant | C |
| F-02 | フラグメント列 = [FIN=0,op≠0] ++ [FIN=0,op=0]* ++ [FIN=1,op=0] | §5.4 | invariant | C |
| F-03 | continuation(op=0)は進行中メッセージがある時のみ許容(文脈外は fail) | §5.4 | pre | C |
| F-04 | 進行中メッセージ中に新規データフレーム(op≠0)開始は禁止(interleave 禁止) | §5.4 | invariant | C |
| F-05 | 集約メッセージのバイト列 = 各フラグメント payload の順序保存連結 | §5.4 | post | C |
| F-06 | メッセージ全体の opcode = 最初のフラグメントの opcode(text/binary) | §5.4 | invariant | C |
| F-07 | RSV1/2/3 が非0(拡張未交渉)なら fail | §5.2 | pre | C |
| F-08 | 未知 opcode は fail | §5.2 | pre | C |
| F-09 | 非最小長エンコードは fail(既証 LengthCodec の単射性が根拠) | §5.2 | pre | C |
| F-10 | 64bit 長の最上位ビットが1なら fail | §5.2 | pre | I |
| F-11 | N メッセージ送信 → N メッセージを順序通り受信(境界保存) | §6 | temporal | I |
C. 制御フレーム / タイミング (§5.4, §5.5)
| ID | 性質 | RFC | 型 | 優先 |
|---|---|---|---|---|
| C-01 | 制御フレームがフラグメント途中に挟まっても集約状態(msg_len,in_message)を壊さない | §5.4 | invariant | C |
| C-02 | 制御フレームは payload ≤125(超過は fail) | §5.5 | pre | C |
| C-03 | 制御フレームは fragment 不可(FIN=1 必須、FIN=0 は fail) | §5.5 | pre | C |
| C-04 | Ping 受信→Pong 応答義務(Close 受信済みを除く) | §5.5.2 | temporal | I(層注) |
| C-05 | Pong の payload = 元 Ping の payload | §5.5.2 | post | C |
| C-06 | unsolicited Pong を受理してよい(状態を壊さない) | §5.5.3 | invariant | N |
| C-07 | 受信粒度非依存: フレームを任意チャンク分割で供給しても同一結果 | §6(実装) | temporal | I |
D. マスク / エラー / close code (§5.1, §7.4, §8.1)
| ID | 性質 | RFC | 型 | 優先 |
|---|---|---|---|---|
| M-01 | server は masked クライアントフレームのみ受理 | §5.1 | invariant | C |
| M-02 | unmasked クライアントフレーム受信→必ず fail(close) | §5.1 | post | C |
| M-03 | server 送信フレームは必ず unmasked | §5.1 | invariant | C |
| M-04 | 全フレーム受信は accept か fail のどちらかに決定的に分類される(網羅性) | §5/§7 | invariant | C |
| M-05 | エラー検出→close 送信→CLOSED の一方向(Fail the Connection) | §7.1.7 | temporal | C |
| M-06 | close code 1005/1006/1015 をフレームに出さない | §7.4.1 | invariant | I |
| M-07 | 不正 close code 受信時の扱い(1002 で fail) | §7.4.1 | post | I |
| M-08 | text/close reason が不正 UTF-8 なら fail(1007)。既証 Utf8 が判定の核 | §8.1 | post | C |
形式化方針(提案)
- 抽象状態機械を Lean で構築:
WsState(open/closing/closed)、Event(data/continuation/control/close/error)、 決定的 step 関数step : WsState → Frame → (WsState × Action)を定義。 A/D の invariant(S-01..03, M-01..05)は step の単一ステップ性質として証明。 - フラグメント集約を純関数で:
aggregate : List Frame → Result (List Message)を定義し、 B(F-01..F-06)と C-01 を証明。F-05 連結はList.flatten/++で表現。 - temporal 性質(順序・応答義務)は trace 述語:
valid_trace : List Event → Prop。 C-04/C-07/F-11/S-06 はここ。応答義務 C-04 は「層注」: SDK は ping を event として通知する所まで 保証し、pong 送信はアプリ責務。よって「ping イベントが payload 込みで正しく通知される」を証明対象とする。 - 既証3定理を再利用: F-09 は LengthCodec 単射性、M-08 は Utf8 健全性、C-05 は Masking で payload 不変。
証明状況(28要素 → Lean 定理の対応)
全 28 要素を WsProof.Spec.* で証明済み(lake build 緑・sorryAx 非依存)。
| ID | 定理 | ファイル |
|---|---|---|
| S-01 | step_monotone |
StateMachine |
| S-02 | step_closed_absorbing |
StateMachine |
| S-03 | no_data_after_close_sent |
Workflow |
| S-04 | data_discarded_after_close_recv |
Workflow |
| S-05 | close_from_open / close_from_closing |
StateMachine |
| S-06 | close_race_converges |
Trace |
| F-01 | WellFormedMsg.single / aggregate_opcode |
Fragment |
| F-02 | WellFormedMsg.multi / WellFormedTail |
Fragment |
| F-03 | continuation_needs_context |
Fragment |
| F-04 | no_interleave |
Fragment |
| F-05 | aggregate_payload_concat |
Fragment |
| F-06 | aggregate_opcode |
Fragment |
| F-07 | rsv_nonzero_rejected |
StateMachine |
| F-08 | unknown_opcode_rejected |
StateMachine |
| F-09 | f09_minimal_length_basis(既証 encode_injective 橋渡し) |
Workflow |
| F-10 | msb_set_len_rejected |
Workflow |
| F-11 | roundtrip_messages |
Trace |
| C-01 | control_preserves_acc / feed_filters_control |
Fragment |
| C-02 | control_oversize_rejected |
StateMachine |
| C-03 | control_fragmented_rejected |
StateMachine |
| C-04 | ping_notified_with_payload(層注) |
Trace |
| C-05 | pong_echoes_ping_payload / pong_payload_from_ping_event |
Workflow |
| C-06 | unsolicited_pong_preserves_state |
Workflow |
| C-07 | chunking_invariant / split_join |
Trace |
| M-01 | server_accepts_masked |
Workflow |
| M-02 | server_rejects_unmasked |
StateMachine |
| M-03 | server_frames_unmasked |
Workflow |
| M-04 | error_implies_closed |
StateMachine |
| M-05 | error_implies_closed(Fail→closed の一方向) |
StateMachine |
| M-06 | sanitized_close_code_not_reserved |
Workflow |
| M-07 | invalid_close_code_yields_1002 |
Workflow |
| M-08 | m08_utf8_decision_basis(既証 validate_correct 橋渡し) |
Workflow |
C 実装との対応
証明した step 関数/述語を、conn.c の consume_frame/header_ok/accept_data/accept_control の
分岐構造に1対1で対応させ、その対応を C ユニットテスト(test_conn.c 拡張)で test-first に確認する。
これにより proof と実装の乖離をテストが検出する(数学性質3定理と同じ橋渡し方式)。
Write a comment