🤷‍♂️

ネットワークの学習法に困っているそこのあなたへ

2023/06/28に公開

対象読者

  • ネットワークについて学びたいけど、どこから始めたらいいか分からない初学者
  • すでにネットワークの基本を理解しているけど、より深い理解を求めている中級者
  • ブラウザーにURLを入力してから画面が表示されるまで何が起きているのかを知りたくてたまらない方

TL;DR

はじめに

今日、私たちの日常生活は無数の「ネットワーク」に支えられています。スマートフォンやパソコンを使って情報を検索したり、SNSで友人とコミュニケーションを取ったりする一方で、その裏側ではインターネットという広大なネットワークが機能しています。それは、文字通り「網」のように、世界中のコンピューターやデバイスを繋げて、情報を素早くやり取りするための基盤となっています。さらに、ネットワーク内の各要素は相互に影響を及ぼし合い、全体として1つの大きな「システム」を形成します。

そんなネットワークの奥深い世界を学ぼうと思いつつも、あまりの広大さと奥深さにどのように学べば良いか困っているのではないでしょうか。本当に必要な知識は何なのか、どのように学習を進めるべきなのかを見極めるのは容易なことではありません。

ここで私がおすすめするのが、「ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識」という書籍です。この書籍は、ネットワークの本質を深掘りし、それがどのようにして私たちの世界を形成しているのかを解き明かします。一読により、私たちが日常的に利用しているネットワークの基本的な機能や、それが全体としてどのように作用しているのかについて理解が深まるでしょう。

この一冊を手に取れば、ネットワーク学習におけるあなたの迷いは一掃され、一歩前進できるはずです。

概要

tour

第1章 Webブラウザ

私たちがインターネットを利用する際、最初に触れるのがWebブラウザーです。情報を検索したり、SNSに投稿したり、オンラインショッピングを楽しんだりする際、すべてブラウザーを通して行われます。この章では、Webブラウザーが情報をどのように取得し、どのように情報を私たちに表示するのかを詳しく学びます。URLの構造やDNSシステム、HTTPリクエストとレスポンス、そしてブラウザーがWebページをレンダリングする方法など、ブラウザーの裏側で何が起こっているのかを理解することで、Webブラウザーの真価が見えてきます。

第2章 プロトコル・スタック、LANアダプタ

Webブラウザーで情報を検索すると、それに対するリクエストがコンピューターの内部を通ってネットワークに送信されます。その際に欠かせないのがプロトコルスタックとLANアダプターです。この章では、データがどのようにパケットに分割され、プロトコルスタックを通じてLANアダプターに送られ、さらにネットワークに送信されるのかを学びます。また、TCP/IPモデルの理解を深め、それがどのようにネットワーク通信を可能にしているのかを理解します。同時に、LANアダプターがどのようにネットワークとコンピューターを接続し、どのようにデータを送受信するのかについても詳しく学びます。

第3章 ハブ、スイッチ、ルーター

ネットワーク内でデータパケットが正確に目的地に到達するためには、ハブ、スイッチ、ルーターといったネットワークデバイスが必要です。この章では、これらのデバイスがどのようにデータパケットの送受信を助け、ネットワークトラフィックを管理するのかを詳しく学びます。特に、データパケットがネットワーク内をどのように移動しどのように目的地に到達するのかを理解することで、ネットワークがどのように効率的に機能するのか、そしてそれがどのように我々のデータ通信の体験を向上させるのかを理解できます。

第4章 アクセス回線、プロバイダ

インターネットに接続するためには、我々のデバイスからプロバイダのネットワークまでの「アクセス回線」が必要です。この章では、DSL、ケーブル、光ファイバー、そしてモバイル接続など、さまざまなアクセス回線の種類とその特性について深く掘り下げます。また、プロバイダーがどのようにこれらの回線を利用してインターネット接続サービスを提供しているのか、そしてそのサービスの特性と限界を理解します。これらの知識は、自分のニーズに最適なインターネット接続を選択するために重要です。

第5章 ファイアウォール、キャッシュサーバー

インターネット接続の安全性と効率性は、我々のオンライン活動において極めて重要です。この章では、安全性を確保するための「ファイアウォール」や、効率性を向上させる「キャッシュサーバー」の仕組みについて詳しく学びます。ファイアウォールがどのように不正な通信を防ぎ、キャッシュサーバーがどのように頻繁にアクセスされるデータを高速に提供するのかを理解します。これらのデバイスがどのように協調して、我々のオンライン体験を安全かつ快適に保っているのかを理解することで、インターネットの裏側で何が起きているのかをより深く理解できます。

第6章 Webサーバー

我々がブラウザーで情報を検索するとき、その情報はどこから来るのでしょうか?それが「Webサーバー」です。この章では、Webサーバーがどのようにして我々のリクエストに応答し、必要な情報を提供するのかを詳しく学びます。また、Webサーバーがどのようにして多数のリクエストを効率的に処理し、我々が求める情報を瞬時に提供するのかについても理解します。これらの知識を通じて、我々が日常的に利用するインターネットの裏側で行われているプロセスを深く理解できます。

実践編

UDP, TCPのソケットプログラミング

書籍の第2章で学習するTCP/IPの理論を活用して、実際にソケットプログラミングを体験してみましょう。これにより、理論が具体的な形となり、UDPとTCPという2つの主要なネットワークプロトコルの違いと特性を深く理解できます。本章では、私自身が体験したUDPとTCPのソケットプログラミングの実践例を共有します。これを皆さんのアウトプットの一例として参考にいただければ幸いです。

まず、UDPについて説明します。UDPの主な特性はそのシンプルさです。クライアントがサーバーにデータを送信すると、それが直接送信されます。この送信プロセスを視覚化するために、Wiresharkを使用してUDP通信をキャプチャしました。下画像は、UDPパケットが単純なデータ送信だけを行っていることを示しています。これは、パケットの到着を保証せず、データが失われても再送しないUDPの性質を具体的に示しています。

udp_data_transfer

次に、TCPの特性について説明します。TCPは信頼性の高いデータ通信を実現します。そのため、接続設定、データ送信、接続終了の各段階で特定のプロトコルを遵守します。それぞれの段階をWiresharkのキャプチャ画像で見ていきましょう。

まず、TCPの接続設定です。クライアントがサーバーに接続を求めると、サーバーはそれに応答し、接続を確立します。このプロセスは「3ウェイハンドシェイク」と呼ばれます。下画像は、SYN(同期)パケットの送信とACK(確認応答)パケットの受信によるハンドシェイクを示しています。

three_way_handshake

TCPは信頼性の高い通信を実現するために、各ステップで確認応答(ACK)を必要とします。この要求に応答がない場合、TCPはそのメッセージを再送します。これは接続の確立(SYNパケットの送信)にも適用されます。この再送機構によって、ネットワークの問題や一時的な遅延が生じても、TCPは信頼性の高い接続を維持できます。再送は、必要に応じて複数回行われ、それにより接続の確立、データの送受信、そして接続の終了を確実に行うことができます。以下にその様子を示します。

tcp_retry

続いて、データ送信時には、クライアントがデータを送信し、その到着をサーバーがACKパケットで確認します。ACKパケットが返ってこない場合、データは再送されます。下画像は、データ送信とACKのやり取りを示しています。

tcp_data_transfer

最後に、TCPの接続終了です。接続の終了は、FIN(終了)パケットの交換によって行われます。クライアントがサーバーに接続の終了を通知し、サーバーがそれを確認します。下画像は、このFINパケットの交換を示しています。

tcp_fin

これらのWiresharkのキャプチャ画像を通じて、UDPとTCPの通信プロセスとその違いを具体的に理解できます。UDPの場合、データが直接送信され、その送信が成功したかどうかの確認は行われません。これに対して、TCPでは、接続の確立から終了まで、データの完全な送受信を確保するための手順があります。

それぞれのプロトコルが適している用途を考えると、UDPは速度と効率性が必要なアプリケーション、例えばライブビデオやゲームで使われます。一方、TCPはデータの完全性が必要なアプリケーション、例えばウェブブラウジングや電子メールで一般的に使用されます。

この理論的な知識だけでなく、実際のソケットプログラミングの経験とWiresharkでの視覚的な確認を通じて、これらのプロトコルの違いとそれぞれの特性を理解しました。このような深い理解が、今後のネットワーク関連のプログラミングやトラブルシューティングにおいて、非常に役立つことでしょう。

実際のコードは以下のGithubにありますので、興味ある方は是非覗いてみてください。

https://github.com/bwkw/socket-programming

簡易HTTPサーバー

さて、我々が日常的に使用しているインターネットの大部分はHTTPプロトコルによって動いています。Webページの表示、フォームの提出、画像の読み込みなど、私たちがWebブラウザーで行っているほぼすべてのアクションは、HTTPリクエストとレスポンスによって可能になっています。そして、これらのリクエストとレスポンスを処理するための核心部分に位置するのがWebサーバーです。

そこで次に、実際に簡易的なHTTPサーバーの実装に挑戦しましょう。TCP/IPの知識を活用し、HTTPリクエストを受け取り、適切なHTTPレスポンスを返すサーバーを作成します。これにより、ネットワークの仕組みをより深く理解するだけでなく、HTTPという日常生活で頻繁に使用しているプロトコルの動作を実感できます。

この実装を通じて、ブラウザーがWebサーバーとどのように通信しているのか、またHTTPリクエストとレスポンスがどのように構造化されているのかを深く理解できます。そして、それが全てTCP/IPネットワーク上でどのように伝送されているのかという、見えない部分の理解にもつながります。

実際のコードは以下のGithubにありますので、こちらも興味がある方は是非覗いてみてください。

https://github.com/bwkw/pico-http-server

最後に

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識」は、ネットワーキング技術の基本的な原理から応用までを詳細に説明した教科書的な一冊です。

この本を通じて、ネットワークがどのように機能し、どのように情報が送受信され、またその安全性はどのように確保されるのか、といったことについて理解を深めることができます。

TCP/IP、LAN、光ファイバといった重要なネットワーク技術を理解することは、現代のエンジニアにとって不可欠です。この書籍はそれらを掌握するための優れた指南役となり、インターネットが私たちの日常生活の不可欠な一部である理由、そして自分たちが開発するソフトウェアやシステムがこの巨大なネットワーク上でどのように機能するのかを理解できます。

最後に、この本はただの理論書ではなく、具体的な例と実践的な知識を多く含んでおり、読者が理論を現実の問題に適用することを可能にします。それはエンジニアとしてのスキルを高めるための重要な要素であり、この本が提供してくれる価値の一部です。

Discussion