第1章 ネットワークの全体像|1-4|コース全体 19本中4本目
カプセル化とは ― ヘッダが増えるしくみ
カプセル化とは、
前の記事 ・1-3 OSIとTCP/IPモデルの違い・対応関係
ヘッダを足す層を通るたびに、ヘッダが1枚増える
送信側では、データがアプリケーション層から物理層へ降りるあいだに、包みが1枚ずつ増えていきます。この包み方をカプセル化と呼びます。包みは、トランスポート層、ネットワーク層、データリンク層を通るたびに増えます。
手紙を封筒に入れ、さらに配送用の箱に入れる場面を思い浮かべてください。外側の包みが1段ずつ増えていきます。
受信側では、届いたフレームから、まったく逆の順番でヘッダが1枚ずつはがされます。これを非カプセル化と呼びます。降りるときは足し、昇るときははがすという、対称の関係です。包む順番が分かると、Wiresharkでパケットを開いたときに、各行がどの層の情報かを読み取れます。
下の図は、隣の機器までの1つの区間だけを描いています。この1つの区間を、1ホップと呼びます。PCからサーバまで複数のルータを経由するときに何が書き換わるかは、MACアドレスとIPアドレスの記事で説明しています。
カプセル化を1段ずつ見る
例として、ブラウザがWebサーバへHTTPリクエストを送る場面を使います。データが層を降りながら包まれていく様子を、1段ずつ確認してください。
ブラウザが、GET /index.html HTTP/1.1 というHTTPリクエストを作りました。この時点では、まだただの文字列です。どこへどう届けるかの情報は何も付いていません。
TCPヘッダが付きます。ヘッダには、送信元ポート52310 / 宛先ポート80やシーケンス番号、ACK番号などが入ります。これで、相手のどのアプリ宛てか、何番目のデータかが分かるようになります。
IPヘッダが付きます。ヘッダには、送信元 192.168.10.25 / 宛先 203.0.113.50 とTTLが入ります。ルータは、このヘッダを見てどこへ転送するかを決めます。
Ethernetヘッダが付きます。末尾には、誤りを検査するためのFCSも付きます。ヘッダの宛先MACアドレスは、最終目的地のものではありません。次に渡す相手である自宅ルータのものです。
完成したフレームは、0 と 1 の列になります。この列が、電気や光の信号、または電波として送り出されます。受信側は逆の順に、ヘッダを1枚ずつはがして上の層へ渡します。この作業を非カプセル化と呼びます。
各層で何が足されるか
足されるヘッダの中身を層ごとに整理すると、次のとおりです。TCPヘッダとIPヘッダのサイズは、オプションが付かない場合の値です。オプションが付くと、最大60バイトまで伸びます。
一方、Ethernetヘッダは固定14バイトです。VLANタグが付くと18バイトになります。末尾のFCSも、固定4バイトです。
| 層 | 追加される | サイズの | 主な |
|---|---|---|---|
| トランスポート層 | TCPヘッダ | 20バイト | 送信元/宛先ポート番号、シーケンス番号など |
| ネットワーク層 | IPヘッダ | 20バイト | 送信元/宛先IPアドレス、TTLなど |
| データリンク層 | Ethernetヘッダ(先頭)+ FCS(末尾のトレーラ) | 14バイト + 4バイト | 宛先/送信元MACアドレス、上位プロトコルの種別(EtherType)、誤り検査(FCS) |
宛先の粒度は、層ごとに違う
3つのヘッダは、どれも宛先の情報を持ちます。ただし、指し示す範囲の細かさがまったく違います。この細かさを粒度と呼びます。
意味を持つのは、同じネットワーク内だけです。区間が変われば、渡す相手も変わります。
最終目的地までの住所です。ネットワークをまたいでも変わりません。
機器に届いたあと、どのアプリに渡すかを決めます。渡す先は、WebサーバやSSHなどです。
受信側は逆順(非カプセル化)
受信側では、カプセル化とまったく逆の順番で、届いたフレームからヘッダがはがされます。中身は、1つ上の層へ順に渡されていきます。
- 1
Ethernetヘッダを
確認する データリンク層 まず、末尾のFCSで、フレームが壊れていないかを検査します。壊れていれば破棄します。問題なければ、宛先MACアドレスが自分宛かを確認します。
自分宛なら、Ethernetヘッダと末尾のFCSを外して、中身を上の層へ渡します。末尾に付くFCSのような部分を、トレーラと呼びます。渡す前に、EthernetヘッダのEtherTypeという項目を見ます。中身がIPパケットなのかARPなのかを、ここで判断します。
FCSは、CRC-32というしくみで誤りを検出しています。その仕組みはパリティチェックとCRCとは ― 誤り検出の仕組みで解説しています。
- 2
IPヘッダを
確認する ネットワーク層 宛先IPアドレスが自分宛かを確認します。自分宛なら、IPヘッダを外して中身を上の層へ渡します。渡す前に、IPヘッダのプロトコル番号という項目を見ます。中身がTCPなのかUDPなのかを、ここで判断します。
- 3
TCPヘッダを
確認する トランスポート層 宛先ポート番号を確認します。そのあと、TCPヘッダを外して、該当するアプリケーションにデータを渡します。
- 4
データを
処理する アプリケーション層 最後に残ったデータを、Webサーバのアプリケーションが処理します。今回の例では、このデータはHTTPリクエストです。
左右を並べて見ると、この対称性がより分かりやすくなります。
PDUの呼び名が層ごとに変わる理由
セグメント、パケット、フレームは、どれもデータの単位を指す言葉です。この単位をPDU(Protocol Data Unit)と呼びます。どの呼び名でも、中身のデータそのものは同じです。どこまでヘッダが付いた状態かによって、呼び名だけが変わります。
| 層 | PDU | 足されている |
|---|---|---|
| アプリケーション層 | メッセージ(データ) | なし(まだ元のデータのまま) |
| トランスポート層 | セグメント(UDPはデータグラム) | TCPヘッダ(UDPならUDPヘッダ) |
| ネットワーク層 | パケット | IPヘッダ |
| データリンク層 | フレーム | Ethernetヘッダ + FCS |
| 物理層 | ビット | なし(電気信号・電波に変換されるだけ) |
MTUとフラグメンテーション
1つのフレームには、運べるデータ量に上限があります。この上限をMTU(Maximum Transmission Unit)と呼びます。Ethernetでは通常1500バイトです。
IPv4では、送りたいパケットがMTUを超えることがあります。このときの動きは、IPヘッダのDFビット(Don't Fragment)で変わります。DFビットは、分割を禁じる印です。DFビットが立っていなければ、送信元または途中のルータがパケットを複数に分割します。
この分割をフラグメンテーションと呼びます。分割された断片は、最終的な宛先で元の1つのデータに再構成されます。
DFビットが立っている場合、パケットは分割されずに破棄されます。そして、ICMPで送信元に通知されます。この動きはRFC 1191にあります。ICMPは、到達確認やエラー通知を運ぶプロトコルです。このとき返るメッセージの種類は、ICMPの記事にまとめています。
IPv6では、途中のルータはパケットを分割しません(RFC 8200)。経路の途中でMTUを超えたパケットは、分割されずに破棄されます。そして、ICMPv6 Packet Too Big というエラーが送信元に返ります。
送信元はこのエラーを見て、パケットのサイズを下げます。この仕組みを経路MTU探索(Path MTU Discovery)と呼びます。規定はRFC 8201です。この探索を行わない場合は、IPv6の最小MTUである1280バイト以下で送ります。
TCPは、接続時にMSS(Maximum Segment Size)という値をやり取りします。MSSで、セグメントの大きさをあらかじめMTUに収まるよう調整しています。そのため、通常のTCP通信ではこの分割はほとんど起こりません。MSSの求め方と、断片が分かれる様子は、MTUとMSSの記事で説明しています。
実際の通信で、足されたヘッダが並ぶ様子は、パケットキャプチャのソフトで確かめられます。Wiresharkの記事では、疑似パケット一覧でEthernet・IP・TCPのヘッダを層ごとに見ます。
練習問題(全5問)
正解:TCPヘッダ → IPヘッダ → Ethernetヘッダ の
データは、
正解:ポート番号
ポート番号は、
正解:Ethernetヘッダの
非カプセル化は、
正解:セグメント
トランスポート層で
正解:DFビット
IPv4では、
選んでから「採点する」を押すと、解説つきで答え合わせができます。
おすすめの本 PR
この記事の内容を扱っている本です。
![『[改訂新版]3分間ネットワーク基礎講座』の表紙](https://m.media-amazon.com/images/P/4774143731.09.MZZZZZZZ.jpg)