TCP/IP
インターネットで標準的に使われる通信プロトコル群の総称で、中心となるTCPとIPの名前から呼ばれる。通信機能をアプリケーション層・トランスポート層・インターネット層・リンク層の4階層に分け、各層が自分のヘッダーを付けて下の層へ渡すカプセル化によってデータを運ぶ。
イマシルちゃんの解説
メールを送るときもWebを見るときも、コンピュータ同士は決まった約束事に従ってデータをやり取りしているんだ。
その約束事のうち、インターネットで標準的に使われているプロトコルのまとまりをTCP/IPというよ。
名前はTCPとIPの二つから来ているけど、実際にはDNSやHTTPなどたくさんのプロトコルが含まれるの。
データを相手のネットワークまで運ぶ仕事はIP、取りこぼしなく順番どおりに届ける仕事はTCPが受け持つんだ。
こうして役割を段に分けているから、有線が無線に変わってもアプリケーションはそのまま使えるんだよ。
この解説はわかりやすかったですか?
より深い解説
定義と成り立ち
TCP/IPは、特定の一つのプロトコルではなく、インターネットで使われるプロトコルの集まり(プロトコルスイート)を指す。正式にはインターネットプロトコルスイートと呼ばれ、代表であるTCPとIPの名前から「TCP/IP」の通称が広まった。DNS、HTTP、ICMP、UDP、ARPなども含まれる。
TCP/IPは、米国国防総省の研究機関(DARPA)が支援したARPANETの研究から生まれた。IPはRFC 791、TCPはRFC 793(現在はRFC 9293が後継)として定められ、ARPANETは1983年にTCP/IPへ全面移行した。現在の仕様はIETFがRFCとして発行している。
TCP/IPの階層構造は、ホストが満たすべき要件をまとめたRFC 1122で整理されている。OSI基本参照モデルのように先に枠組みを決めたのではなく、実際に動くプロトコルの実装と運用を通じて形作られた点が特徴である。
階層の構成
RFC 1122は、TCP/IPの通信機能を次の層に分けている。日本の教材では、最下位の層を「ネットワークインタフェース層」と呼ぶことも多い。この階層の分け方をTCP/IPモデル(TCP/IP階層モデル)という。
| 階層 | 役割 | 代表的なプロトコル |
|---|---|---|
| アプリケーション層 | 利用者のサービスを実現する | HTTP、DNS、SMTP、DHCP、SSH |
| トランスポート層 | 端末内のアプリケーションをポート番号で区別し、必要なら信頼性を提供する | TCP、UDP |
| インターネット層 | IPアドレスを使い、ルータで中継して宛先のネットワークまで届ける | IP、ICMP |
| リンク層 | 直接つながった機器の間でフレームを送受信する | イーサネット、無線LAN、PPP、ARP |
ARPはIPアドレスからMACアドレスを求めるプロトコルで、IPの下で働くためリンク層の側に置かれることが多い。ICMPはIPパケットに入れて運ばれるが、IPの動作を支える制御用プロトコルとして、IPと同じ層に含めるのが一般的である。
層の数を5つとし、リンク層を物理層とデータリンク層に分けて説明する教材もある。分け方が違っても、各プロトコルの役割そのものは変わらない。
OSI基本参照モデルとの対応
OSI基本参照モデルは7層の枠組みである。TCP/IPのアプリケーション層は、OSIの上位の複数の層をまとめて受け持つ。
| OSI基本参照モデル | TCP/IPの階層 |
|---|---|
| アプリケーション層・プレゼンテーション層・セッション層 | アプリケーション層 |
| トランスポート層 | トランスポート層 |
| ネットワーク層 | インターネット層 |
| データリンク層・物理層 | リンク層 |
この対応は目安である。TLSのように、どの層に置くかが説明の目的によって変わるプロトコルもある。試験では、IPやTCP・UDP、イーサネットがOSIのどの層に相当するかという対応が基本となる。
ヘッダーを付けて包む流れ
Webブラウザがサーバへ要求を送るときの流れを、送信側から追う。各層は上の層から受け取ったデータを中身として扱い、自分の制御情報であるヘッダーを先頭に付ける。
- アプリケーション層がHTTPの要求メッセージを作る。
- トランスポート層のTCPが、送信元と宛先のポート番号などを含むTCPヘッダー(最小20バイト)を付けてセグメントにする。
- インターネット層のIPが、送信元と宛先のIPアドレスなどを含むIPv4ヘッダー(最小20バイト)を付けてパケットにする。
- リンク層のイーサネットが、MACアドレスなどを含むヘッダー(14バイト)と、誤り検出用のFCS(4バイト)を付けてフレームにする。
受信側は逆の順でヘッダーを外していく。このとき、下の層のヘッダーには「中身がどのプロトコルか」を示す欄がある。イーサネットのタイプが0x0800ならIPv4、IPヘッダーのプロトコル番号が6ならTCP、17ならUDPである。最後に宛先ポート番号で、どのアプリケーションへ渡すかを決める。
| 層 | データの呼び方(一般的な例) | 次の層を示す情報 |
|---|---|---|
| アプリケーション層 | メッセージ | なし |
| トランスポート層 | セグメント(UDPではデータグラム) | ポート番号 |
| インターネット層 | パケット(データグラム) | プロトコル番号 |
| リンク層 | フレーム | タイプ(EtherType) |
ヘッダーの大きさを計算する
ヘッダーの大きさは、一つのフレームで運べるアプリケーションのデータ量に影響する。イーサネットで一度に運べるIPパケットの最大長(MTU)が1,500バイトのとき、オプションのないIPv4とTCPを使うと次のようになる。
TCPで運べるデータの最大長(MSS) = 1,500 − 20 − 20 = 1,460バイト
フレーム全体 = 1,460 + 20 + 20 + 14 + 4 = 1,518バイト
回線上ではさらに、フレームの前のプリアンブル(8バイト分)と、フレーム間の最小間隔(12バイト分)も時間を使う。これらを含めると、1フレームは1,538バイト分の時間を占める。
伝送効率 = 1,460 ÷ 1,538 ≒ 0.949
1Gbit/sの回線で運べるTCPデータの上限 ≒ 1,000Mbit/s × 0.949 ≒ 949Mbit/s
つまり、回線速度の約95%がアプリケーションのデータに使える上限となる。トンネルやVPNで外側にヘッダーが加わると、MTUとMSSはさらに小さくなる。例えば経路のMTUが1,400バイトなら、MSSは1,400 − 20 − 20 = 1,360バイトになる。
各層の識別子と変わる範囲
各層は、それぞれ別の識別子で通信相手を区別している。どの識別子がどの範囲で意味を持つかを区別すると、通信の流れを正しく追える。
| 層 | 識別子 | 意味を持つ範囲 |
|---|---|---|
| トランスポート層 | ポート番号(16ビット) | 端末の中のアプリケーション |
| インターネット層 | IPアドレス(IPv4は32ビット) | 送信元から宛先まで(NATで変換される場合を除く) |
| リンク層 | MACアドレス(48ビット) | 直接つながった一つのリンクの中 |
パケットがルータを越えるたびに、リンク層のヘッダーは作り直される。つまり送信元・宛先のMACアドレスは区間ごとに変わる。一方、IPアドレスは通常、送信元から宛先まで変わらない。異なるネットワークの相手へ送る場合、端末はフレームの宛先をデフォルトゲートウェイのMACアドレスにして送り出す。
設計の考え方
インターネット層のIPは、届くことを保証しないベストエフォート型でコネクションレスの転送を行う。パケットの損失・重複・順序の入れ替わりは、必要に応じて端末側のTCPが補う。ネットワーク内部を単純にし、高度な機能を両端の端末に任せる考え方をエンドツーエンド原理という。
また、さまざまなリンク技術とさまざまなアプリケーションが、共通のIPを介してつながる。IPを中心に上下が広がる形から「砂時計型」と例えられる。イーサネットが無線LANに替わっても上の層は変わらず、新しいアプリケーションを作るときにもネットワークの機器を変える必要がない。
RFC 1122は実装の指針として、「受け取るものには寛容に、送るものには厳格に」という堅牢性原則も示している。これは異なる実装同士がつながるための考え方である。
トランスポート層でTCPとUDPのどちらを使うかは、アプリケーションの要件で決める。
| 観点 | TCP | UDP |
|---|---|---|
| 接続 | 3ウェイハンドシェイクでコネクションを確立する | コネクションを確立しない |
| 信頼性 | 再送・順序制御・フロー制御・輻輳制御を行う | 行わない。必要ならアプリケーションが補う |
| ヘッダー長 | 最小20バイト | 8バイト |
| 主な用途 | Web、メール、ファイル転送 | DNSの問合せ、音声・映像の配信、DHCP |
IPv4とIPv6
TCP/IPは、インターネット層のIPとしてIPv4とIPv6のどちらも使える。トランスポート層のTCPとUDPは基本的にそのまま使い、IPv6ではアドレス解決を近隣探索プロトコル(NDP)が受け持ち、制御にICMPv6を使う。イーサネットのタイプはIPv6では0x86DDとなる。
同じ端末で両方を動かすデュアルスタックでは、アプリケーションから見て通信相手のアドレスの種類によって使う層の実装が変わる。片方だけが不通という障害は、インターネット層を分けて確認する必要がある。
層に沿ったトラブルシューティング
「つながらない」という症状は、どの層で止まっているかで原因と対策が大きく異なる。下の層から順に確認すると、無駄な調査を減らせる。
| 層 | 確認すること | 主な手段 |
|---|---|---|
| リンク層 | リンクアップしているか、ARPで相手のMACアドレスを解決できるか | インタフェースの状態、ARPテーブルの確認 |
| インターネット層 | IPアドレスとサブネットマスク、デフォルトゲートウェイ、経路が正しいか | ping、traceroute、経路表の確認 |
| トランスポート層 | 宛先ポートで待ち受けているか、途中で遮断されていないか | 接続の試行、ファイアウォールのログ |
| アプリケーション層 | 名前解決や認証、アプリケーションの応答が正しいか | DNSの問合せ、アプリケーションのログ |
例えば、IPアドレスを指定すれば接続できるのに名前では接続できないなら、アプリケーション層のDNSに問題がある。pingは通るのにWebに接続できないなら、トランスポート層のポートやファイアウォールを疑う。各層のヘッダーはWiresharkやtcpdumpで取り込んで直接確かめられる。
午後での問われ方
- 構成図とパケットの流れを示し、各区間での送信元・宛先のIPアドレスやMACアドレス、ポート番号を答えさせる。
- MTUとヘッダー長からMSSを求めさせたり、トンネルによるヘッダーの追加でフラグメンテーションや通信不良が起きる理由を説明させる。
- アプリケーションの特性から、トランスポート層にTCPとUDPのどちらが適するかを理由とともに問う。
- 障害の症状から、どの層のどの機能に原因があるかを切り分けさせる。
- IPv4とIPv6が混在する環境で、どの層の仕組みが変わり、どこが共通かを説明させる。