記録帳

クラウド、データ分析、ウイスキーなど。

TCP/IPを理解する

クラウド、データ分析の熱が落ち着いて、「基本的なITの知識を知ろう」のターンが回ってきました。
となると、手を出すのはネットワークですよね。
積読になっているこの本を読んで、ざっくり理解したので記事にします。

TCP/IPとは何か?

TCP/IP」という言葉は2つの意味を持ちます。

  1. TCPとIPという2つのプロトコルのこと。
  2. TCPやIPを使うときに必要になるプロトコル群の総称のこと。

そもそもプロトコルとは、コンピュータ同士で通信する際の手順や規格、つまりは約束事のこと。
IPやTCPというプロトコルがある(そもそもIPもTCPも最後のPはProtocol)一方で、それらはインターネットにおいて代表的なプロトコルであったため、それらに関係あるプロトコル群も含めてTCP/IPと呼ぶようになったようです。

例えるなら、マクドナルドの「ハンバーガー」ですかね。
メニューとしてのハンバーガーもあれば、バーガー系を総称してハンバーガーとも呼ぶ。そういうノリでしょうか。

ちなみに、2つ目の意味で言ったときに含まれるほかのプロトコルは、以下のようなものがあります。

なぜTCP/IPは普及したのか?

今では一般的に使われているTCP/IPですが、数あるプロトコルの中でなぜこれが爆発的に普及したのでしょうか。
それは、この2つが大きな原因でした。

  • パケット通信に対するモチベがめちゃくちゃ高かったため
  • UNIXがめちゃくちゃ普及したため

パケット通信に対するモチベ

1960年代の軍事技術が始まりでした。軍事的に、戦場の人々に作戦を伝えるための通信は非常に重要です。
さらに、通信ルートを誰かが壊しても、別ルートで通信できること(今でいう可用性)が非常に重要でした。
確かに、それが自分の生死に関わるとなれば必死に研究しますよね。
またその後、軍事利用でなくとも、回線コストを下げる目的でも活発に研究されたそうです。
パケット通信ができれば、複数のユーザーが1つの回線を共有できます。これができないと、それぞれのユーザがそれぞれ専用線を引かないとやり取りできません。

さて、このようなモチベーションから、なんやかんやあって1975年にTCP/IPは誕生しました。誕生してからも具体的な仕様は検討が続き、結局1982年にTCP/IPの仕様が決まりました。
このとき、TCP/IPを生み出したのは大学や研究機関でした。同じくこのころ、大学や研究機関が開発して利用していたもの…それはUNIXというOSです。
そのため、UNIXにはTCP/IPが実装されるようになりました。これが、次の理由につながります。

UNIXの普及

1980年代は、各企業を中心にUNIXマシンをつなげてやり取りすることが広まっていった時代です。
そのUNIXにはTCP/IPが実装されているので、ネットワーク構築にはこのTCP/IPを利用するのが自然ですよね。
このようにして、TCP/IPUNIXとともに普及していったのでした。

ちなみに、このころ(1980年代)からTCP/IPによる世界的なネットワークをインターネットと呼ぶようになりました。
その後は、1990年代に入って一般家庭にもインターネットが普及していきます。利用者数は爆増しましたが、TCP/IPは研究ネットワークとして長い間運用され磨き上げられていたおかげで、利用することができています。

IPの具体的な約束事とは?

大きくは以下の3つです。

  1. IPアドレスというアドレスを用いる
  2. 経路制御(ルーティング)でパケットを終点ホストまで届ける
  3. IPパケットは分割、再構築する

IPアドレスというアドレスを用いる

これは、馴染みのある言葉だと思います。ネットワーク層であるIPでは、IPアドレスを用いて通信します。
IPアドレスの形式は、ホスト利用するデータリンクの種類によらず、同じ形式です。
(データリンク:ネットワーク層より1つ下の層。現在はイーサネットが主流)
今後、別のデータリンクが出てきても関係なくIPアドレスは利用できます。つまり、うまく抽象化ができているということです。

経路制御(ルーティング)でパケットを終点ホストまで届ける

この仕組みを使うことで、自宅から地球の裏側のブラジルのサーバまでパケット通信ができます。
そもそも、インターネットは全世界にあるたくさんのルータをバケツリレーのようにして通信しています。
そのルータは膨大な量あり、かつどんどん変化します。なので、最初から「ブラジルまでのルートは、ルータA→ルータB→…」と決められません。

そのため、ルーターごとにルーティングテーブルという表を持たせておきます。
ルーティングテーブルとは、「最終地点がxxであれば、次はルーターXに飛ぶ」という対応表です。
パケット通信をする際は、各ルーターのルーティングテーブルを見て、次はどのルーターに飛ぶかを適宜判断して、進んでいくのです。

IPパケットは分割、再構築する

パケット通信に利用するデータリンクには、最大転送単位(MTU)というのが定められています。
つまり、送信する際の最大の容量が決まっているということです。パケットがそれより大きいと、本来は送れません。
そこで、ルーターでパケットを分割して送り、最後に受信したホストが再構築して元通りにします。
ちなみに、ルーターは分割だけして、再構築は行いません。

ただ、できれば分割はしたくないのが本音です。分割すると、そのうちの1つでもかければ復元できないからです。
そのため、できるだけMTUに引っかからないギリギリの大きさで送りたい。そのギリギリの大きさを特定するために、経路MTU探索という技術が使われています。
これは、最近では多くのOSで利用されています。

TCPの具体的な約束事とは?

大きくは以下の5つです。
TCPについては少し細かいので、それぞれの内容の説明はここには書きません。
ただ、IPがとにかく相手ホストへ届けるための約束事だったのに対して、TCPきちんと届けるための約束事である、という点が重要です。

  1. ポート番号という番号を用いる
  2. 途中でパケットが喪失した場合再送させる
  3. 分割されたパケットの順序を制御する
  4. 通信相手がいるかどうかコネクションを制御する
  5. ネットワークが混雑しないようにパケットの送信料を調整する

TCPUDPの違いは?

どちらもトランスポート層プロトコルですが、一長一短があります。
そのため、利用目的に応じて使い分ける必要があります。
一言でいうと、TCPは信頼性のある通信を提供し、UDPは信頼性よりも速い通信を提供します。

この違いは、人と人とが対話するIP電話やテレビ電話を使うとわかりやすいです。
TCPはコネクション型(相手の応答を待ってから通信開始する)で、かつデータが途中で失われたときに再送処理を行ってくれます。
IP電話に利用すると、音声の再生がスムーズにいかず遅れが生じたりします。その代わり、音声品質は高いです。
UDPコネクションレス型(相手の応答確認せず通信開始する)で、再送など細かい処理はアプリケーションが担います。
IP電話に利用すると、多少パケットが失われて音声が乱れる場合がありますが、遅延は起こらず会話ができます。

このように、IP電話やテレビ電話といったリアルタイム性を重視する場合はUDPが適しています。
逆に、youtubeの動画再生など数秒遅延しても良い場合は、TCPが適しています。

所感

なんとなくTCP/IPやインターネット、イーサネットなどの言葉を使っていましたが、だいぶ理解が進みました。
特に「プロトコル」というのがずっとふわふわしていましたが、利用するアドレスの種類やヘッダフォーマット、再送やコネクションの確認方法など約束事の集合体だと理解すれば腑に落ちました。

また、初期のころ別々の規格で作っていて通信できなかった→標準化で楽にできるようになった、という流れのところは、データのサイロ化にも適用できないかな?と思いました。
今は、データがDBに入っていたりストレージに入っているという違いや、csv、parquet、ただのファイルといった違いでうまくやり取りできていません。
これらをETLなどで処理していますが、標準化することでスムーズに流通させられないものか…。これがSnowflakeの目指している世界なのかもしれません。

あとは、TCPUDPの違いは分かりやすく説明されていたかなと思いました。具体的なIP電話の例は分かりやすい。
ただ、たまに(特にgoogleのmeet?)音声は聞こえるけど10秒くらい遅延しているときがあるように思います。
この時は、TCPを使ってしまっているのか?などちょっと気になりました。

以上、私の理解まとめになります。細かいところは本を読んでチェックや!