はじめに
「ネットワークはなぜ繋がるのか」という一冊の本をきっかけに、普段何気なく使っているインターネットの裏側の仕組みに魅了されました。特に、その心臓部であるTCP/IPについて学んだ内容は、驚きと発見の連続でした。
この記事は、私がTCP/IPの複雑な世界をどのように理解していったかの探求の記録であり、学習した内容のアウトプットです。同じようにネットワークを学ぶ方々の、少しでも助けになれば幸いです。
1. TCPとIP:最強の二人組 -「マネージャー」と「配達員」
まず最初に理解したのは、TCP/IPが二つのプロトコルの組み合わせであること、そして彼らが見事な役割分担をしていることでした。
-
IP (Internet Protocol):
インターネット上の「配達員」。IPアドレスという住所を頼りに、データを「パケット」という小荷物にして届けるのが仕事です。ただし、IPは届けることだけに集中し、荷物が途中でなくなっても、順番が入れ替わっても気にしません(ベストエフォート型)。 -
TCP (Transmission Control Protocol):
信頼性を担当する「マネージャー」。IPが運ぶ荷物が確実に、正しい順序で届くように全体を管理します。まさに、TCPという名のマネージャーがいるからこそ、私たちは安心してファイルをダウンロードしたり、メールを送ったりできるのです。
2. 通信の始まりの儀式:3ウェイハンドシェイク
TCPが信頼性を担保するために最初に行うのが、3ウェイハンドシェイクという「挨拶」です。これは、単なる接続確認ではなく、お互いの通信ルールを同期させるための重要な儀式でした。
- SYN: クライアントが「今から話せますか?私の最初の番号は『A』です」とサーバーに伝えます。
- SYN/ACK: サーバーは「OKです。あなたの次は『A+1』ですね。ちなみに私の最初の番号は『B』です」と返信します。
- ACK: クライアントは「了解です。あなたの次は『B+1』ですね」と最終確認を送ります。
この「シーケンス番号」という通し番号をお互いに交換・確認することで、その後のデータがどの順番で送られているかを正確に追跡できるようになります。
3. パケットの構造:何重にも梱包された「送り状」
データがネットワークに送出される際、「カプセル化」というプロセスを経て、何重にもヘッダー(送り状)が付け加えられることを知りました。
- TCPヘッダー: データにまず付けられる、当事者間の管理情報です。シーケンス番号やACK番号、ポート番号(どのアプリ宛かを示す)などが含まれます。
- IPヘッダー: TCPセグメントをさらに包み、最終的な目的地を示すIPアドレスを書き込みます。
- MACヘッダー: IPパケットをさらに包み、**次の中継点(ルーターなど)**までの物理的な宛先(MACアドレス)を書き込みます。
この階層構造があるからこそ、IPは物理的な詳細(EthernetかWi-Fiか)を気にせず、イーサネットは最終目的地を気にせず、それぞれが自分の仕事に集中できるのだと分かりました。
4. インターネットを越える旅:書き換えられる搭乗券
パケットが家やオフィスを出て、インターネットの広大な海へ旅立つとき、不思議なことが起きます。
- IPヘッダー(航空券): 福岡からニューヨークへ向かう航空券のように、最終目的地と出発地が書かれており、旅の途中で決して変わりません。
- MACヘッダー(搭乗券): 「福岡→成田」「成田→ニューヨーク」といった区間ごとの搭乗券のように、ルーターを一つ越えるたびに、新しいものに付け替えられます。
MACアドレスがLANというローカルな範囲でしか通用しない「地域配達員」の住所であり、ルーターを越えるたびに次の配達員へと荷物が引き渡されていくイメージで、長年の疑問が氷解しました。
5. 信頼性と効率を支えるTCPの賢い仕組み
TCPマネージャーは、ただパケットを送り出すだけではありません。通信を円滑に進めるため、常に状況を監視し、様々な調整を行っています。
- シーケンス番号とACK番号: 送ったパケットに番号を振り(シーケンス番号)、受け取った側が「〇番まで受け取りました」と返事をする(ACK番号)ことで、データの欠損を検知します。
- 再送制御 (RTO): ACKが一定時間返ってこなければ、「パケットが迷子になったな」と判断し、同じパケットを再送します。この待ち時間(RTO)は、通信相手との往復時間(RTT)を計測して、常に最適な値に自動調整されます。
- ウィンドウ制御とフロー制御: ACKを待たずに複数のパケットをまとめて送る(ウィンドウ制御)ことで効率を上げつつ、受信側の処理能力(ウィンドウサイズ)を超えないように送信量を調整する(フロー制御)ことで、データの溢れを防ぎます。
これらの仕組みが連携することで、多少不安定なネットワークでも、信頼性の高い通信が維持されていることを学びました。
おわりに
TCP/IPの世界は、それぞれのプロトコルが明確な役割を持ち、階層的に連携することで成り立っている、非常に精巧なシステムでした。「なんとなく」で理解していたネットワークの裏側には、これほど合理的で賢いルールが存在していたことに、深く感動しました。
このアウトプットが、自身の知識の定着と、誰かの「なぜ?」の解消に繋がれば嬉しいです。