Edited at

curlコマンドからネットワークを理解する 第一章: TCP/IP Protocol Suiteを理解する

More than 1 year has passed since last update.


この記事の概要

ネットってどうやって動いているんだろう?

僕はwebアプリケーションエンジニア歴が3年くらいなのですが、3年前の始めたてのころはネットワーク上をhtmlファイルが飛んでくるものだと思っていました(笑)

OSやそもそものコンピューターの仕組みを少しは理解した今も、この単純な質問に自信をもって答えられません。

この疑問への答えをcurlコマンドからスタートし、追っていきます。


はじめに抑えておきたいこと

色んなことに言えることなのですが、エンジニアの世界でなにかが分からないときに、

そのなにかがそもそも複雑というのももちろんそうなのですが、

そのなにかが目に見えないという理由がすごく大きいと思っています。

実際に目で見て、触れて、試せるものを理解するのは比較的簡単ですが、

エンジニアが主に相手にするのは1と0の世界、ビットの世界、情報の世界で目に見えるものといえば、

CPU, メモリ, HDD, 流れる電気と記憶された磁気などなど、とても少ないです。

いま自分が分からないのは実装の話なのか、それとも仕様の話なのか、

物理的な話なのか、仮想的な話なのか、あるいは思想の話なのか、

抽象具象の文脈をきっちり把握したほうが理解しやすいです。

今回の記事は、ネットの話なのでプロトコル(仕様)の話も出るには出るのですが、

それは色んな場所で説明されていてかつあんまりおもしろくもないので、

プロトコルはどこで実装されているのか、パケットはどう流れているのかなど、

実際に目で見て分かるようにしていきたいと思います。


目次


第一章: TCP/IP Protocol Suiteを理解する

ざっくりとした全体像を説明します。

全体像を把握するのがまず大事だと思うからです。

それぞれのプロトコルの詳細を知りたい方は参考文献を参照してください。


TCP/IP Protocol Suiteの意味

ネットワークで実現したいことは、コンピューター間の通信、つまりコミュニティケーションです。

相手に伝え、相手が言っていることを理解するには、お互いになにかしらの約束事を決めておく必要があります。


  • 日本語

  • UML

  • メートル法

  • Restful API & JSON

上記はそのなにかしらの約束事の例です。

まったく同じことがコンピューター同士のコミュニティケーションでもいえます。

そしてプロトコルというのはこのなにかしらの約束事, つまり仕様です。

仕様なので、あまり深く考えず、ふーんそういう風に頭のいい人達が決めたんだー、と素直に受け入れるのが大事です。

HTTPプロトコルはhtmlなどのコンテンツを送受信するための仕様

SMTPプロトコルはメールの送信をするための仕様

FTPプロトコルはファイルの転送をするための仕様

などなど、目的に応じてプロトコルがたくさんあります。

そして TCP/IP Protocol Suiteというのは、メインのTCPプロトコル/IPプロトコルを軸に、

その周辺にあるプロトコル(HTTPなど)も含めた集合を指す言葉です。

ここで下記の2つの疑問から、もう少し深くみていきます。


  1. プロトコルの集合を指すのはわかったが、それぞれのプロトコルはどのように関連しているのか?

  2. プロトコルが仕様ということは、その実装はどこでされているのか?


プロトコルの集合を指すのはわかったが、それぞれのプロトコルはどのように関連しているのか?

ここで大事なことは2つです


  1. 上のレイヤーは下のレイヤーに依存している

  2. 各レイヤーはパケットを共通のデータ構造とする


上のレイヤーは下のレイヤーに依存している

下記の図のように、TCP/IP Protocol Suiteの関連は表現できます。

tcp_ip.jpg

たとえばhtmlファイルを取得するにも、メールを送信するにも,ファイルを転送するにも,

相手を特定することが必要になります。そしてこの相手を特定することに関する仕様がIPプロトコルです。

このようにHTTP/SMTP/FTPはそれぞれがIPに依存しています。


各レイヤーはパケットを共通のデータ構造とする

下記の図のようにレイヤー間のやり取りは、そのままパケットの受け渡しとして表現できます。

packet.jpg

各レイヤーが、その役割に応じて情報を書き込み/読み込みをして、次のレイヤーに渡します。

このパケットというものを理解することで、ネットワークが理解できると思っています。

プログラムの基本であるデータ構造ロジックでいえばデータ構造にあたるものがパケットです。

データ構造を理解すれば、ロジックもだいたいわかります。

(厳密にパケットというとIPパケットのことを指すようですが、ここでいっているのは図のようなデータ構造のことをいっています。)


プロトコルが仕様ということは、その実装はどこでされているのか?

仕様があれば、実装もあるはずです。

下記の表にプロトコル/実装の関係があります。

Linuxを前提としています。

プロトコル
実装しているもの/実装されている場所

TCP
OS

IP
OS

HTTP
Apache, Nginx, Google Chrome

SMTP
Postfix

FTP
vsftpd

TLS/SSL
openssl

大事なことは、OSはTCPプロトコル, IPプロトコルとそれより下のレイヤーしか実装していない

ということだと思います。それより上のレイヤーは、OSにもともと実装されているわけではなく、

別々の/個別のソフトウェアとして実装されており、通常それをyumなどでインストールすることで初めて使えるようになります。

opensslとか、なんとなく入れていたパッケージが実はこういう風につながってくるのが分かると思います。


参考文献


参考文献

インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

マスタリングTCP/IP 入門編 第5版

Eli The Computer Guy, Understanding Switches

ネットワークエンジニアとして

Linuxカーネルの基本機能