中級ではOSI 7層/TCP/IP 4層の対応とカプセル化を見ました。上級では、各層が実際に何を約束しているか・カプセル化で付くヘッダの中身・TCPがどう信頼性を作るか(順序保証/再送/フロー制御/輻輳制御)・MTUとMSS・L2とL3の違いまで踏み込みます。
上級の解説は準備中のため、上級の内容を表示しています。
概要 — まず全体をつかむ
詳細 — 1段階ずつ追う
各層は何を約束しているか
中級では層ごとの代表プロトコルを並べました。ここでは「その層が何を保証し 何を保証しないか」を責務として捉え直します。
アニメーション『OSI 7層とTCP/IP 4層の対応』を開く
- リンク層(L2) — 目の前の1区間だけを運ぶ。宛先は MAC ※1。同一ネットワーク内で「隣の機器へ渡す」ことだけを約束し 遠くのことは知らない
- ネットワーク層(L3) — IPアドレスで「最終的にどのネットワークのどの機器か」を指し ルータ ※2 がネットワークをまたいで中継する。ただし届く保証はしない(ベストエフォート)
- トランスポート層(L4) — 端末の中のどのアプリかをポート番号で見分け TCPなら順序と到達まで面倒を見る
- アプリ層(L7) — HTTPやDNSなど 中身の意味を扱う
ここで効いてくるのが L2とL3の分業です。L2のスイッチはMACを見て同一ネット内を転送し L3のルータはIPを見てネット間を中継します。だから1つのパケットは「ルータからルータへ」IPで大きく運ばれつつ 各区間ではL2フレームに包み直されて隣へ渡される という二段構えで進みます。
登場人物メモ:
- ※1 MACアドレス — NICに焼かれた機器固有の番号。L2で「目の前の1区間の宛先」を示す。詳しくはNIC
- ※2 ルータ — L3でIPを見てネットワーク間を中継する機器。区間ごとに次の渡し先を決める
カプセル化を中身まで追う
中級では「層ごとにヘッダで包む」と見ました。上級では 各ヘッダに何が書かれ 受信側でどう剥がされるかまで追います。
アニメーション『カプセル化(層ごとに包む)』を開く
送信側では上から下へ包んでいきます。
- アプリがデータを作る(例 HTTPの本文)
- TCPがTCPヘッダを付けてセグメントにする。ここに載るのが送信元・宛先ポートとシーケンス番号(後で順序を直すため)
- IPがIPヘッダを付けてパケットにする。載るのは送信元・宛先IPとTTL(回り続けを止める寿命)
- リンク層がフレームにする。載るのは次の1区間の宛先MAC
受信側は逆順に剥がします。各層は相手側の同じ層が付けたヘッダだけを読みます。ルータはL3まで開けてIPを見て次へ回し(TCPの中身は読まない) スイッチはL2までしか開けません。だから途中の機器は「自分の層の見出し」だけで仕事ができ 上の層の事情を知らずに済むのです。
MTUとMSSもここで理解できます。
- MTU — 1つのL2フレームで運べるデータ量の上限(Ethernetなら概ね1500バイト)
- MSS — 1つのTCPセグメントに載せられる中身の上限。MTUからIPヘッダとTCPヘッダの分を引いた残りとして決まる
- MTUを超えるIPパケットはフラグメント(分割)されるが 分割は効率が悪く途中で詰まる原因にもなる。だからTCPは最初にMSSを決めて「はみ出さないサイズ」で送る
TCPはどう信頼性を作るか
IPは「がんばるが保証しない」層でした。到達も順序も約束しません。その上で確実さを作り出すのがTCPです。土台は3ウェイハンドシェイクで両者の初期シーケンス番号を合わせるところから始まります。
アニメーション『TCPの3ウェイハンドシェイク』を開く
- あなた(クライアント) — 通信を始めたい側。まず接続を確立しにいく
- サーバ — 接続要求を受ける側
TCPの信頼性は4つの仕掛けの合わせ技です。
- 順序保証 — 各バイトにシーケンス番号が付く。到着順が入れ替わっても受信側は番号順に並べ直す
- 再送 — 受信側は届いた分までをACKで知らせる。送信側は一定時間ACKが来なければ再送する(重複ACKが続けば素早く再送する高速再転送もある)
- フロー制御 — 受信側は「今どれだけ受け取れるか」を受信ウィンドウとして広告する。送信側はそれを超えて送らない。受信側のバッファ溢れを防ぐための仕組み
- 輻輳制御 — 経路の混雑を推測して送信量を加減する。始めは控えめに増やすslow start その後はAIMD(うまくいけば少しずつ増やし パケット損失を検知したら大きく減らす)で 経路を壊さない範囲を探る
区別の勘所は「誰を守るか」です。フロー制御は受信側を 輻輳制御は経路を守ります。両方あって初めて 速すぎて相手を溢れさせることも 混雑を悪化させることもなく届けられます。
アニメーション『TCPのフロー制御と再送』を開く
- 送信側 — データを送る側。相手の受信ウィンドウと経路の混雑の両方を見て送る量を決める
- 受信側 — データを受け取る側。今どれだけ受け取れるかを受信ウィンドウとして送信側に伝える
TCPとUDPをどう使い分けるか
同じL4でも TCPの信頼性をあえて捨てるのがUDPです。
- TCP向き — 欠けや順序の乱れが致命的なもの。Webページ・ファイル転送・メール
- UDP向き — 少しの欠けより遅延の小ささが大事なもの。音声・映像通話・オンラインゲーム・DNSの問い合わせ
- なぜ捨てるのか — 再送を待つと古いデータが遅れて届く。通話では「遅れた音」より「今の音」が大事なので 欠けたら諦めて先へ進むほうが良い
つまり信頼性は「常に善」ではなく 用途に応じて選ぶもの。同じIPの上に 性格の違う2つの運び方を用意したのが層モデルの柔軟さです。
なぜ層に分けると差し替えが効くのか
層の最大の恩恵は 中級でも触れた独立した差し替えです。上級の語彙で捉え直すと理由がはっきりします。
- 各層は上下と決められた見出し(ヘッダ)だけでやり取りし 中身の詳細に踏み込まない。だから片方を変えても契約が同じなら壊れない
- リンク層を有線からWi-Fiへ変えても 上のIPやTCPは同じ。IPパケットはどんなL2にも「包み直して」運べるから
- 同じIPの上で TCPとUDPを用途で選べる。L4を差し替えてもL3以下は無関係
- この独立性が インターネットという「バラバラな機器と回線の集まり」を1つの網として動かす土台になっている
⚠️ 層をまたぐ落とし穴
- どの層の問題か切り分けない — 「遅い・繋がらない」の原因がL2(配線)かL3(IP・経路)かL4(ポート・ファイアウォール)かL7(DNS・証明書)かを層で分けて考える
- MTUの不一致 — 経路の途中でMTUが小さい区間があると大きなパケットが通らない。PMTUD(経路MTU探索)が塞がれると通信が詰まる
- ヘッダの分だけ増える — カプセル化で毎回ヘッダが付くので 運ぶ総量は中身より必ず大きい。小さなデータを大量に送るとヘッダの割合(オーバーヘッド)が効いてくる
- 層は地図であって現実そのものではない — 実機では層がきれいに分かれて動くとは限らない。あくまで切り分けと理解のための道具と捉える
関連する知識
理解度チェック
そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. 送信側のカプセル化で、TCP・IP・リンク層が作るデータの単位の呼び名として正しいのは?
問2. L2スイッチとL3ルータが「見る住所」の違いとして正しいのは?
問3. TCPの「フロー制御」と「輻輳制御」の違いとして正しいのは?
問4. 本文によれば、1つのTCPセグメントに載せられる中身の上限(MSS)はどう決まるか?
問5. 本文でのネットワーク層(L3/IP)の責務として正しいのは?
問6. 本文で、TCPの信頼性をあえて捨ててUDPを選ぶのが向くのはどれ?
問7. 本文で挙げられている、Ethernetの1フレームで運べるデータ量の上限(MTU)の概ねの値を、バイト単位の数字で答えてください。
問8. TCPが通信開始時に、両者の初期シーケンス番号を合わせるために行う手続きを何と呼ぶか答えてください。