未分類

TCPのRFCとは?標準仕様と参照方法も!(RFC 793:仕様書:IETF:プロトコル標準:改訂履歴など)

当サイトでは記事内に広告を含みます

TCPのRFCとは?標準仕様と参照方法も!(RFC 793:仕様書:IETF:プロトコル標準:改訂履歴など)

インターネット通信の根幹を支えるTCP(Transmission Control Protocol)は、私たちが日常的に使うWebブラウジングやメール送受信など、あらゆるネットワーク通信に欠かせないプロトコルです。そのTCPの仕様を定めているのが、RFC(Request for Comments)と呼ばれる文書群になります。「RFCって何?」「どこで参照できるの?」と疑問に思う方も多いのではないでしょうか。本記事では、TCPのRFCとは何か、代表的な仕様書であるRFC 793をはじめ、IETFによる標準化プロセス、プロトコル標準の構造、さらには改訂履歴まで、わかりやすく解説していきます。

TCPのRFCとは?結論から理解しよう

それではまず、TCPのRFCとは何かという結論から解説していきます。

RFC(Request for Comments)とは、インターネット技術の標準仕様を記述した公式文書のことです。TCPに関しては、1981年に発行されたRFC 793が長らく基本仕様書として機能してきました。そして2022年には、RFC 793を廃止・統合する形でRFC 9293が新たな標準として発行されています。

RFCはインターネットの「設計図」とも言える存在です。TCPに限らず、HTTP・DNS・SMTPなど、インターネットで使われるほぼすべてのプロトコルがRFCによって定義されています。

RFCを発行・管理しているのがIETF(Internet Engineering Task Force)という標準化団体です。IETFは世界中のエンジニアや研究者が参加するオープンなコミュニティであり、インターネット技術の標準化を担っています。

RFCの基本的な役割

RFCはもともと「コメントを求める文書」という意味を持つ名称でした。インターネットの黎明期に、研究者たちがアイデアや仕様を共有するために使い始めた仕組みが起源となっています。

現在のRFCは単なる提案文書ではなく、インターネット標準(Internet Standard)として機能するものも多くあります。TCPのRFC 9293もそのひとつで、実装者はこの文書に従ってTCPを実装することが求められるでしょう。

TCPを定義する主なRFC一覧

TCPに関連するRFCは複数存在します。以下の表で主要なものをまとめてみましょう。

RFC番号 発行年 内容 状態
RFC 793 1981年 TCPの基本仕様(旧標準) 廃止(RFC 9293に統合)
RFC 1122 1989年 ホスト要件(TCP関連補足) 現行
RFC 2018 1996年 TCP選択的確認応答(SACK) 現行
RFC 5681 2009年 TCP輻輳制御 現行
RFC 7323 2014年 TCP高性能拡張 現行
RFC 9293 2022年 TCPの統合最新仕様 現行(推奨標準)

このように、TCPの仕様は一枚のRFCで完結しているわけではなく、複数のRFCによって段階的に拡張・補完されてきた経緯があります。

RFCの番号と種別について

RFCにはそれぞれ固有の番号が付与されており、番号は発行順に割り当てられます。種別としては主に以下のカテゴリが存在するでしょう。

「Standards Track(標準化トラック)」は正式なインターネット標準を目指す文書、「Informational(情報提供)」は参考情報として提供される文書、「Experimental(実験的)」は研究・実験用途の文書、「Historic(歴史的)」は廃止または旧来の文書です。TCPの主要仕様はStandards Trackに分類されています。

RFC 793の詳細:TCPの原点となる仕様書

続いては、TCPの原点とも言えるRFC 793の詳細を確認していきます。

RFC 793は1981年9月、Jon Postelによって執筆・発行されました。約80ページにわたるこの文書は、TCPの基本動作のすべてを定義しており、40年以上にわたってインターネット通信の礎となってきた歴史的な仕様書です。

RFC 793が定義する主要な概念

RFC 793では、TCPの根幹となる概念が定義されています。特に重要なものを以下の表で整理しましょう。

概念 説明
コネクション管理 3ウェイハンドシェイクによる接続確立と4ウェイハンドシェイクによる切断
シーケンス番号 データの順序保証に使用される番号体系
確認応答(ACK) 受信確認を通知する仕組み
フロー制御 ウィンドウサイズによる送受信速度の調整
再送制御 タイムアウトによるパケット再送の仕組み
ポート番号 アプリケーションを識別するための番号

これらの概念は現在のTCP実装においても変わらず使われており、RFC 793の先見性の高さがうかがえるでしょう。

TCPセグメントのヘッダ構造

TCPセグメントのヘッダはRFC 793で詳細に規定されています。主なフィールドは以下のとおりです。

フィールド名 ビット数 説明
Source Port 16bit 送信元ポート番号
Destination Port 16bit 宛先ポート番号
Sequence Number 32bit シーケンス番号
Acknowledgment Number 32bit 確認応答番号
Data Offset 4bit ヘッダ長
Flags 6bit SYN・ACK・FINなどの制御フラグ
Window Size 16bit 受信ウィンドウサイズ
Checksum 16bit 誤り検出用チェックサム

Pythonを使うと、このTCPヘッダを解析するサンプルコードを書くことができます。Scapyライブラリを使った例を見てみましょう。

 from scapy.all import *
TCPパケットを生成してヘッダ情報を確認するサンプル
ドラゴンフルーツサーバー(192.168.1.10)へのTCP SYNパケット
packet = IP(dst="192.168.1.10") / TCP(
sport=54321,   # 送信元ポート(ゴリラクライアント)
dport=80,      # 宛先ポート(HTTP)
flags="S",     # SYNフラグ
seq=1000,      # シーケンス番号
window=65535   # ウィンドウサイズ
)

TCPヘッダの内容を表示
packet[TCP].show()

出力結果:
###[ TCP ]###
sport = 54321
dport = http
seq = 1000
ack = 0
dataofs = 5
flags = S
window = 65535
chksum = 0x0000

RFC 793と現代の実装との違い

RFC 793が発行された1981年当時と現代では、ネットワーク環境が大きく異なります。高速・大容量通信が当たり前となった現代では、RFC 793だけでは対応しきれない課題が生じていました。

具体的には、シーケンス番号の枯渇問題・高遅延ネットワークへの対応・セキュリティ面の強化などが挙げられるでしょう。これらの課題を解消するために、後述するRFC 9293をはじめとする複数の拡張RFCが発行されてきた経緯があります。

IETFによるTCP標準化プロセスとRFCの参照方法

続いては、IETFによる標準化プロセスとRFCの参照方法を確認していきます。

IETF(Internet Engineering Task Force)は、インターネット技術の標準化を担う国際的なオープンコミュニティです。誰でも参加・貢献できる点が特徴であり、年3回開催されるIETFミーティングや、メーリングリストを通じて議論が行われています。

標準化トラックの流れ

IETFにおけるRFCの標準化には、一定のプロセスが存在します。

標準化トラックの流れは「インターネットドラフト(I-D)→提案標準(Proposed Standard)→推奨標準(Internet Standard)」という段階を経ます。TCPのRFC 9293は現在「推奨標準(Internet Standard)」に位置づけられています。

まず「インターネットドラフト(Internet Draft)」として提案が公開され、ワーキンググループでの審査・議論を経て「提案標準(Proposed Standard)」に格上げされます。さらに複数の実装と相互運用性の確認を経て、最終的に「インターネット標準(Internet Standard)」として承認される仕組みです。

RFCの公式参照方法

RFCはRFC Editor(https://www.rfc-editor.org/)IETF公式サイト(https://www.ietf.org/)から無料で参照・ダウンロードできます。番号がわかっている場合は、直接URLでアクセスするのが最も手軽でしょう。

参照先 URL例 特徴
RFC Editor https://www.rfc-editor.org/rfc/rfc9293 公式・HTML/PDF形式で参照可能
IETF Datatracker https://datatracker.ietf.org/doc/rfc9293/ 改訂履歴・関連文書も確認可能
tools.ietf.org https://tools.ietf.org/html/rfc9293 テキスト形式で参照可能

Pythonを使ってRFCの情報を取得する方法

プログラムからRFCの情報を取得したい場合は、RFC EditorのAPIを活用できます。

 import urllib.request import json
RFC EditorのAPIでRFC 9293のメタ情報を取得するサンプル
ボルトサーバーへのリクエストに見立てた情報取得
rfc_number = "9293" url = f"https://www.rfc-editor.org/search/rfc_search_detail.php?rfc={rfc_number}&pub_date_type=any&format=json"

APIリクエスト
with urllib.request.urlopen(url) as response:
data = json.loads(response.read().decode())

取得した情報を表示
for item in data.get("rfc-entries", []):
print(f"RFC番号: RFC {item.get('doc-id', '').replace('RFC', '').strip()}")
print(f"タイトル: {item.get('title', '')}")
print(f"発行日: {item.get('pub-date', '')}")
print(f"ステータス: {item.get('current-status', '')}")

出力結果:
RFC番号: RFC 9293
タイトル: Transmission Control Protocol (TCP)
発行日: 2022-08
ステータス: INTERNET STANDARD

RFC 9293:TCPの改訂履歴と最新プロトコル標準

続いては、TCPの最新プロトコル標準であるRFC 9293と、その改訂履歴について確認していきます。

2022年8月に発行されたRFC 9293は、RFC 793を含む複数の旧RFCを一本化した統合仕様書です。TCP関連の散在していた仕様を整理・統合することで、実装者にとって参照しやすい文書となっています。

RFC 9293が統合した主なRFC

RFC 9293は、以下の旧RFCを廃止・統合する形で発行されました。

統合されたRFC 主な内容
RFC 793 TCPの基本仕様
RFC 879 TCP最大セグメントサイズ(MSS)
RFC 2873 TCPとIPv4のTOS設定
RFC 6093 緊急ポインタの動作
RFC 6429 ゼロウィンドウプローブの動作
RFC 6528 シーケンス番号の初期値選択

これだけ多くのRFCが統合されたことからも、TCP仕様の複雑さと歴史的な積み重ねが見えてくるでしょう。

RFC 9293の主な改善点

RFC 9293では技術的な内容の更新に加え、文書としての明確化・整理も大きな目的のひとつでした。「MUST」「SHOULD」「MAY」といった要件レベルの表現がRFC 2119に沿って整理されており、実装者が何を必ず実装すべきかが明確になっています。

RFC 9293ではセキュリティに関する考慮事項のセクションが大幅に強化されました。SYNフラッド攻撃への対策や、シーケンス番号予測攻撃への対応なども明記されており、現代のセキュリティ要件に対応した内容となっています。

TCPの改訂履歴から見える技術の進化

TCPの改訂履歴を俯瞰すると、インターネット技術の進化の軌跡が見えてきます。1981年のRFC 793が定義した基本アーキテクチャは今も健在ですが、その後の拡張で輻輳制御・高性能化・セキュリティ強化が加えられてきました。

Pythonでシーケンス番号の初期値生成(RFC 6528準拠)を模したサンプルコードを確認してみましょう。

 import hashlib import time import struct
RFC 6528準拠のシーケンス番号初期値生成サンプル
アボカドクライアント → サーモンサーバーの通信を想定
def generate_isn(src_ip, dst_ip, src_port, dst_port, secret_key): """ RFC 6528に基づくTCPシーケンス番号初期値(ISN)を生成する """ # 4タプル情報をバイト列に変換 src_packed = struct.pack("!4sHH", src_ip.encode()[:4], src_port, dst_port) dst_packed = struct.pack("!4s", dst_ip.encode()[:4])

# HMACベースのハッシュ計算
input_data = src_packed + dst_packed + secret_key.encode()
hash_value = int(hashlib.md5(input_data).hexdigest(), 16)

# タイマーと組み合わせてISNを生成(4マイクロ秒ごとにインクリメント)
timer = int(time.time() * 250000) & 0xFFFFFFFF
isn = (hash_value + timer) & 0xFFFFFFFF

return isn
サンプル実行
src_ip = "192.168.10.1"   # アボカドクライアント
dst_ip = "10.0.0.5"       # サーモンサーバー
src_port = 49152
dst_port = 443
secret = "avocado_salmon_secret_2024"

isn = generate_isn(src_ip, dst_ip, src_port, dst_port, secret)
print(f"生成されたISN: {isn}")

出力結果:
生成されたISN: 2874391056 (実行ごとに異なる値となります)

まとめ

本記事では「TCPのRFCとは?標準仕様と参照方法も!(RFC 793:仕様書:IETF:プロトコル標準:改訂履歴など)」というテーマで解説してきました。

TCPのRFCとは、インターネット技術の標準化団体であるIETFが発行するプロトコル仕様書のことです。1981年に発行されたRFC 793がTCPの原点となる仕様書であり、40年以上にわたってインターネット通信を支えてきました。そして2022年には、複数の関連RFCを統合したRFC 9293が新たな標準として発行されています。

RFCはRFC EditorやIETF公式サイトから誰でも無料で参照できます。TCPの実装や深い理解を目指すなら、ぜひ一度RFC 9293を読んでみることをおすすめします。難解に感じる部分もあるかもしれませんが、原文に当たることで得られる知識の深さは格別でしょう。

TCPの仕様は今後も進化を続けていくはずです。QUIC(HTTP/3の基盤)のような新技術も登場していますが、TCPとそのRFCへの理解はネットワークエンジニアにとって変わらず重要な基礎知識であり続けるでしょう。