RFC標準を調べるための知識やツール

# はじめに

本記事では、[RFC (Request for Comments)](https://ja.wikipedia.org/wiki/Request_for_Comments) で提案・標準化された仕様を探して読むための基礎知識や、Web上で利用できるツール等について記します。

想定読者は、Web技術に関わるエンジニアで、RFCを参照して標準仕様を調べる機会がある人です。

## ここに書かないこと

- RFCとは何か
- Internet-Draft (I-D) 段階の議論の追い方
- I-Dから標準化のプロセスに乗るまでの細かい流れ

# 基礎知識

## RFCの種類

すべてのRFCが仕様として標準化されるというわけではありません。
RFCは次のように、いくつかのCategoryに分類されます。

| Category | 説明 |
|--------|------|
| **`INTERNET STANDARD`** | 国際標準とすべき仕様の最上位。STD番号が割り振られる |
| **`PROPOSED STANDARD`** |複数の組織での独立な実装と、それらの相互接続性が確認されているもの |
| `EXPERIMENTAL` | 標準化が目的ではない調査や検討などを含む文章。特定の企業が自社の仕様を公開する際にも用いられる。  |
| `INFORMATIONAL` | 標準化が目的でない情報提供が目的の文章。公式度が低い前提。  |
| `HISTORICAL` | 標準化の過程がわかるよう、過去の議論を残すための文章。  |
| `BEST CURRENT PRACTICE` | 現時点での最良の実践。IETFが支持する技術的関連情報を発行するためにRFC1818(BCP:1)で定められた。BCP番号が割り振られる。  |
| `UNKNOWN` | 1990年以前のRFCのうち、未分類のもの |

この内、仕様として標準化されるものは上の2つです。
この2つのCategoryをまとめて、 `Standards Track` と記すこともあります。

標準化のプロセスは、 `PROPOSED STANDARD` → `INTERNET STANDARD` のように進行します。

NOTE:

- RFC2026では `PROPOSED STANDARD` と `INTERNET STANDARD` の間に位置するものとして **`DRAFT STANDARD`** というCategoryも定められていましたが、RFC6410によって削減されました。ただし、古いRFCではまだこのCategoryのものも見られます。

## 注意点：文書の状態

古いRFCは、後のRFCによって更新 (= Update) されたり、廃止 (= Obsolete) されることがあります。
特に、古い技術系の記事などで言及されているRFCを素直に辿ると、それがout-of-dateなものであっても気づけないことがあります。
従って、あるRFCを見るときに、それが後のRFCによって更新・廃止されていないかがわかるツールを使うことが大事だと思います。

## RFCの構成

1つのRFC文書は概ね次のような構成になっています。

```
ヘッダ                // RFC番号やCategory, Obsoletes, Updates情報など
タイトル
Abstract
Status of This Memo  // 定型文
Copyright Notice     // 定型文
Table of Contents
1. Introduction
  1.1. Conventions and Terminology  // 助動詞の使い方(RFC2119 or 8174)を定義した定型文
  :
:                    // 本文
Acknowledgements
Author's Address
```

## 仕様の強制力を表す助動詞の使い方

RFC文書内で、個々の仕様の強制力を表すための助動詞の使い方がRFC2119で定められ、RFC8174で更新されました。

| キーワード | 意味 |
|-----------|-----|
| `"MUST"`, `"REQUIRED"`, `"SHALL"` | 仕様の絶対的な要請事項 |
| `"MUST NOT"`, `"SHALL NOT"` | 仕様の絶対的な禁止事項 |
| `"SHOULD"`, `"RECOMMENDED"` | 特定の状況下では、特定の項目を無視する正当な理由が存在するかもしれないが、 異なる選択をする前に、当該項目の示唆するところを十分に理解し、慎重に重要性を判断しなければならない |
| `"SHOULD NOT"`, `"NOT RECOMMENDED"` | 特定の状況下では、特定の動作が容認できる、ないし、非常に有用である、というような正当な理由が存在するかもしれないが、その動作を実装する前に、当該項目の示唆するところを十分に理解し、慎重に重要性を判断しなければならない |
| `"MAY"`, `"OPTIONAL"` | 選択的。該当のオプションを含まない実装は、それを含む他の実装との相互運用に備えなければならない(MUST)。同様に、オプションを含む実装は、それを含まない他の実装との相互運用に備えなければならない(MUST)。 |

# ツール

いくつか知っているものを、オススメ順に挙げます。

## RFC Editor

https://www.rfc-editor.org/

[検索コンソール](https://www.rfc-editor.org/search/rfc_search.php)がなかなか高機能で使いやすいです。

機能・特長:

- キーワード検索
- Category (※ただし、このツール上は "Status" となっている) や公開日での絞り込み
- 検索結果画面でのObsoletes, Updates, Errataの表示

このサイトには他に、[全RFCの一覧ページ](https://www.rfc-editor.org/rfc-index.html)などもあります。

## RFC Reader

http://www.rfcreader.com/

単一ページを読む際に、左サイドペインに目次が表示されます。RFCは長いものが多いので便利です。
会員機能もあり、お気に入りやブックマーク機能もあるようです。

検索結果一覧も見やすいのですが、RFC Editorと比べるとUpdates, Errata, Categoryといった情報が不足しています。

## IETF Datatracker

https://datatracker.ietf.org/

RFC, Internet Draftだけでなく、会議のアジェンダや議事録、スライド資料なども検索できるオンラインデータベースです。

機能・特長:

- キーワード検索
- 検索結果画面でのObsoletes, Updates, Errataの表示
- 著者やWG、地域などでの絞り込み

RFC Editor同様に検索結果画面の情報がリッチで見やすいですが、Categoryでの絞り込みなどには対応していません。
IETF関係者が使う上では有用性がありそうだと思いました。

----

IETF Toolsには、他にも色々なツールがありますが、まだ試せていません。

# その他のツールについて

他にも、「RFC Viewer」などで検索すると多数ヒットします。

# 日本語訳について

- [RFCの日本語訳リンク集 - JPNIC](https://www.nic.ad.jp/ja/tech/rfc-jp-links.html)
  - IPAほか各種団体が訳したものへのリンク集になっています。JPNICで訳されたものも含まれています。
- [セキュリティ関連 RFC：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/security/rfc/RFC.html)
- [JPRS DNS 関連技術情報#DNS関連のRFC](https://jprs.jp/tech/#dns-rfc-info)
- [RFC « DNSSECジャパン](https://dnssec.jp/index.html?page_id=124) ... DNSSEC関連RFC

その他、個人サイトなどでRFCの翻訳を公開しているものもたくさん見られます。

# 終わりに

ここに掲載した以外に有益な情報がありましたら、お知らせ頂けると嬉しいです。
コメントや編集リクエストを歓迎します。

# 参考

- [Request for Comments - Wikipedia](https://ja.wikipedia.org/wiki/Request_for_Comments)
- [RFC/Internet-Draftの読み方 - ISOC-JP (PDF)](https://www.isoc.jp/wiki.cgi?page=PreIETF93&action=ATTACH&file=isocjp%2Dietf%2Dstudy%2D20150701%5Fhayashi%5Fnishizuka%2Epdf) ... 本記事の「RFCの種類」の表や「RFC内での助動詞の使い方」に示したRFC2119の訳文を記す上で大いに参考にさせて頂きました。
- [RFC2026](https://tools.ietf.org/html/rfc2026)
- [RFC2119](https://tools.ietf.org/html/rfc2119)
- [RFC6410](https://tools.ietf.org/html/rfc6410)
- [RFC8174](https://tools.ietf.org/html/rfc8174)