【RFCの読み方】TCPが41年ぶりに改定?!RFC9293を読む

今年8月、RFC793が41年ぶりに改訂されたことがちょっとした話題となりました。RFC793はTCPの仕様について記載されたRFCです。今回は、今年発行されたRFC793の改訂版であるRFC9293にフォーカスして解説します。

RFC793について

少しだけRFC793について解説します。RFC793は、TCPの基本的なアーキテクチャが記載された文書であり、発行は1981年9月です。このRFCは、ポステルの法則で有名なジョン・ポステルが共著したことでも有名です。 RFC793 2.10. Robustness Principleには、ポステルの法則、別名堅牢性原則の記載があります。

format_quote 2.10. Robustness Principle

TCP implementations will follow a general principle of robustness:
be conservative in what you do, be liberal in what you accept from others.

⼰のなすことには慎重であれ、他⼈のなすことには寛容であれ(BY 筆者訳)

RFC9293が発行されるまでは、このRFCがTCPのベースとなるアーキテクチャが掲載されている唯一のRFCでした。個人的な意見ですが、TCPの概要を理解した上でこの読むとこの内容が理解し易いですが、TCPを理解するためにこのRFCを読むのであれば、(知識のバックグラウンドにもよりますが)少しハードルが高いように思います。

RFC9293について

RFC9293は、RFC793以降インターネットの成長によってTCP継続的に進化した変更をまとめたものとなっています。したがってTCPのベースの仕様自体が変更されたわけではありません。
今までの変更は断片的になっていたので、仕様を確認するためには複数のRFCを読む必要があったのですが、これらがひとつになったということです。ですので、これからTCPについて体系的に学びたい方は、各仕様のRFCからではなく、まずこのRFC9293を最初に読むことをおすすめします。

RFC9293リリースまでの道のり

RFC9293リリースまでの道のりはIFTF Data Tracker - RFC9293で確認できます。
最初のドラフト(draft-eddy-rfc793bis-00)は2013年10月に発行されています。その後改定に改定を重ね、ついに最終のドラフト版(draft-ietf-tcpm-rfc793bis-28)が今年発行され、その後承認されついに8月にRFCとして発行されました。

Datatracker RFC 9293

Datatracker RFC 9293ステータス参照

RFC9293発行によりObsolutes、UpdatesされたRFC

このRFCでObsolutes、UpdatesされたRFCとタイトルは以下のとおりです。RFC番号に各RFCへのリンクを作成してあります。
RFCのヘッダ情報についての見方は、【RFCの読み方】RFCのヘッダには何が書かれているかをご覧ください。

Obsolutes RFC

RFC番号 RFCタイトル 発行年
RFC793 TRANSMISSION CONTROL PROTOCOL 1981
RFC789 The TCP Maximum Segment Size and Related Topics 1983
RFC2873 TCP Processing of the IPv4 Precedence Field 2000
RFC6093 On the Implementation of the TCP Urgent Mechanism 2011
RFC6429 TCP Sender Clarification for Persist Condition 2011
RFC6528 Defending against Sequence Number Attacks 2012
RFC6691 TCP Options and Maximum Segment Size (MSS) 2012

Updates RFC

RFC番号 RFCタイトル 発行年
RFC1011 OFFICIAL INTERNET PROTOCOLS 1987
RFC1122 Requirements for Internet Hosts -- Communication Layers 1989
RFC5961 Improving TCP's Robustness to Blind In-Window Attacks 2010

RFC793からの変更点

RFC793は、TCPのコアなところが記載されたRFCです。
RFC9293 5. Changes from RFC 793からの変更点の記載があります。

  • RFC793 Errata(正誤表)の反映
  • RFC1011、1122、および6093での緊急ポインターの仕様への変更
  • RFC6298でのRTOの議論
  • RFC1011でのTCP仕様に必要ないくつかの変更
  • RFC1122でのTCPのコンテンツの廃止(RFC1122はTCP以外の情報が含まれているためこのRFC自体は廃止ではない。)
  • RFC6528でのより安全な初期シーケンス番号の生成アルゴリズム
  • RFC6429での接続リソースの再利用の注記
  • 輻輳制御への実装

RFC9293を読んだ感想

RFC9293は98ページもありRFCの中でもボリュームが大きいものとなっています。網羅的に読むより、まずは必要なところから順に読んでいくほうが効率的だと思います。(現時点では、私も全部読み切れていません...。)
最近のRFCは目次がわかりやすく情報が整理されていますので、そのあたりに注目してRFC793、RFC9293を比較して読むのも面白いと思います。

RFCの最後の謝辞には、ジョン・ポステルに対する敬意が示されていました。

format_quote Acknowledgments

This document is largely a revision of RFC 793, of which Jon Postel was the editor. Due to his excellent work, it was able to last for three decades before we felt the need to revise it.

このドキュメントは主に RFC 793の改訂版であり、Jon Postelが編集者でした。彼の優れた仕事のおかげで、改訂の必要性を感じるまでに30年間存続することができました。(BY Google訳)

まさにそのとおりだと思います。

そして、TCPは信頼性のあるデータ転送を提供するために設計されていますが、同時に拡張機能を追加することで新たな要求にも対応できるような設計となっています。新しい機能やセキュリティ対策を追加するための拡張が可能であり、その柔軟性がTCPの長寿命を支えていると感じました。

あとがき

早く記事をアップしたいと思いながら、RFC9293が発行されてから少し時間が経過してしまいました。
記事を書くにあたり、あらためてRFC793、RFC9293を読んでみて、つくづくTCPはよくできたプロトコルだなぁと感じました。
3ウェイハンドシェイクなんて、考えてみれば人間のコミュニケーションの基本ですよね。未熟な私としては、会話の終わりはResetで終わらせず、お互いFinで終わることを目指したいと思います。