RFC 2119 / 8174: 要求レベルのキーワード
仕様書の MUST・SHOULD・MAY を正確に読み分けられれば、実装の必須要件と裁量の境界が一目で分かり、相互運用性の勘所と「破ってよい条件」まで押さえられる。
- RFC 2119 は仕様の要求度を MUST(絶対)・SHOULD(原則)・MAY(任意)の3段階に固定した、たった数ページの語彙集。以後ほぼ全ての IETF 仕様がこれを土台に書かれる。
- SHOULD は「正当な理由があれば逸脱してよいが、全影響を理解した上で慎重に」という意味。MUST との違いは、相互運用性を壊すかどうかの線引きにある。
- RFC 8174 が「大文字のときだけ規範的意味を持つ」と補足した。地の文の小文字 must は普通の英単語で、仕様上の強制力はない。
このRFCが決めたこと
横にスクロール
RFC 2119(1997年、Scott Bradner)は、プロトコルを定義するのではなく、プロトコル仕様を書くための語彙を定義した異色のRFCです。わずか数ページで、要求の強さを表す一群のキーワード——MUST、SHOULD、MAY とその否定形・同義語——の意味を1つに固定しました。狙いは単純で、仕様書から「〜すべきである」「〜が望ましい」といった曖昧な自然言語の揺れを排除し、実装者がどこが必須でどこが裁量かを誤解なく読み取れるようにすることです。
これが効くのは相互運用性の世界だからです。別々の組織が同じ仕様だけを頼りに実装し、それらが初対面で正しく通信できなければなりません。「推奨」を必須と読むか任意と読むかで実装が食い違えば、接続は壊れます。RFC 2119 は、その解釈のブレをキーワードの定義という一点に閉じ込めました。以後、ネットワークやWeb、セキュリティの主要仕様は、冒頭で「本書のキーワードは RFC 2119 の定義に従う」と宣言するのが定番になっています。
3段階の要求レベルを精読する
キーワードは実質3つの強度に集約されます。同義語が複数あるのは英文法上の言い回しを許すためで、意味は同じです。
| 強度 | キーワード | 意味 | 逸脱すると |
|---|---|---|---|
| 絶対 | MUST / REQUIRED / SHALL | 仕様への準拠に必須。実装は必ず従う | 準拠しておらず、相互運用が壊れうる |
| 絶対の禁止 | MUST NOT / SHALL NOT | その動作を絶対に行ってはならない | 同上(禁止事項の違反) |
| 原則 | SHOULD / RECOMMENDED | 従うのが原則。逸脱には正当な理由が要る | 相互運用は保てるが、影響を理解した上での判断が必須 |
| 原則の否定 | SHOULD NOT / NOT RECOMMENDED | 原則として避ける。特定状況でのみ許容 | 同上 |
| 任意 | MAY / OPTIONAL | 実装の裁量。やってもやらなくてもよい | 非準拠ではない |
読解上の要は SHOULD と MAY の非対称性です。MAY の機能を「実装しない」ことは完全に自由ですが、逆にある実装が MAY の機能を省いても、それと通信する相手はその機能に依存してはいけない——RFC 2119 はこの相互の含意まで明記しています。つまり MAY は「送る側の自由」であると同時に「受ける側は無くても動け」という制約でもあります。
SHOULD の定義は「特定の状況では無視する正当な理由が存在しうるが、その選択の全ての意味を理解し、慎重に比較検討した上でなければならない」です。安易に「推奨だから飛ばす」と読むのは誤読で、逸脱には説明責任が伴います。多くの相互運用トラブルは、この SHOULD を MAY のように扱った実装から生まれます。
RFC 8174 の補足(大文字のときだけ規範)
RFC 2119 には長年ひとつの曖昧さが残っていました。地の文で自然に使われる小文字の "must" や "should" まで規範的キーワードと解釈すべきか、という点です。仕様の散文には「この値は正の整数であるべき(should)」のような日常語としての should が混ざり、どこからが強制力を持つのか判然としませんでした。
2017年の RFC 8174 がこれを一文で解決します。規範的な意味を持つのは、キーワードが大文字で書かれているときだけ、と定めたのです。以後の仕様は「大文字の MUST/SHOULD/MAY のみが RFC 2119 の意味を持ち、小文字は通常の英単語である」という定型文(boilerplate)を冒頭に置きます。
仕様を読むときは、まず大文字キーワードだけを拾って要件の骨格を掴むと速いです。MUST を集めれば「準拠に不可欠な条件」、SHOULD を集めれば「原則と、その例外を自分で正当化すべき箇所」、MAY を集めれば「拡張・最適化の余地」が見えます。散文の説明はその肉付けです。
つまずきやすい点
第一に、キーワードは要件の強さであって、優先度や実装難度ではないという点です。MUST が難しく MAY が簡単とは限りません。第二に、SHOULD の逸脱は「許されている」のではなく「正当化を要求されている」ことです。ログや設計文書に理由を残せない逸脱は、事実上の非準拠と変わりません。第三に、否定形の読み違いです。MUST NOT は「してはならない絶対禁止」で、SHOULD NOT より一段強い。うっかり SHOULD NOT を MUST NOT と同じ強さで実装すると、本来許容される例外ケースを弾いてしまいます。
最後に、これは仕様を書くときの規律でもあります。自分が設計文書やAPIの取り決めを書くなら、要件を大文字キーワードで表現するだけで、読み手の解釈ブレが激減します。曖昧な「〜が望ましい」を一掃できるのは、既製の語彙を借りる最大の利点です。
まとめ
RFC 2119 は、インターネット標準の読み書きを支える最小の共通語です。MUST・SHOULD・MAY の3段階と、RFC 8174 の「大文字のみ規範」という補足を押さえれば、分厚い仕様書からでも必須要件と裁量の境界を素早く抽出できます。他のRFCを読む前に、まずこの語彙を頭に入れておくのが近道です。関連する主要RFCはRFC精読の各記事でも同じ枠組みで読み解いています。
RFC精読の記事ガイド
RFC 2119 / 8174: 要求レベルのキーワードを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
RFC
比較で見る軸
難易度: advanced / カテゴリ: RFC精読 / タグ数: 5
導入後に効く点
SHOULD は「正当な理由があれば逸脱してよいが、全影響を理解した上で慎重に」という意味。MUST との違いは、相互運用性を壊すかどうかの線引きにある。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- RFC精読
- タグ数
- 5
判断チェックリスト
- 自社の用途が「RFC / 仕様」に近いか確認する。
- 強みである「RFC 2119 は仕様の要求度を MUST(絶対)・SHOULD(原則)・MAY(任意)の3段階に固定した、たった数ページの語彙集。以後ほぼ全ての IETF 仕様がこれを土台に書かれる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。