マスタリングTCP/IP　第2章　TCP/IP基礎知識

自分の知識の定着を図るためのアプトプットです。詳しくは実際の本を読んでみて下さい！

https://www.amazon.co.jp/-/en/%E4%BA%95%E4%B8%8A%E7%9B%B4%E4%B9%9F-ebook/dp/B0827QNDNT/ref=sr_1_1?adgrpid=48910594010&dib=eyJ2IjoiMSJ9.kB1wpWesImwGFopOwjS_XQn8hT_FkSmFdM7c9FebnVzCTnUqW6XqRK1pZbTkbZfWpEd6Rg3XGtYJblcXIrmM7QObyT4lJUiNT7ofSaGMpTUvQkCKnKIVuWh49cFwDrEpyR88lJH67Qb9J_Rc_1BIALz9t9PKMUzc66PrSfhN05Pc5v70s7jnFBX46ENK0nBWFfyZ3x2Fmem2-Qbf2V5BMwURHtj2QNhCIlOWPq_8CuUCK7sx3WqZlp0bRVsTRPXM1CCAQITEF8C3iB83nACxNgahDugy1glqM_Lv4DjsBWS-M5M72r6d4UgQKOiYXH7pPZn89JbCnvJEOnr8lHrDhaZCJINyuYH9aXllZhnBHaKLna7oUkar7JsaWNgrdyO6Mda2mBVs5vDmiB8d7ObLVWXwYyPGOj-XQ6J41loTfdR_jH6GMo3RCmQ44h-s2J0F.q__f8x4Emr8t3xOijgAA0Tra7lHLkv7SfLGRiJpdQAI&dib_tag=se&hvadid=679073071879&hvdev=c&hvlocphy=1009307&hvnetw=g&hvqmt=e&hvrand=16804345372684970371&hvtargid=kwd-334746806305&hydadcr=27706_14738821&jp-ad-ap=0&keywords=%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0+tcp%2Fip&qid=1735294326&sr=8-1

今回は背景や歴史などあまり実践の内容ではないところが多かったので、省略気味に書きます！

# 2.1 TCP/IP 登場の背景とその歴史
元々は中央集中的なネットワーク構造をしていたが、軍事的に敵からの攻撃によってネットワークが止まり通信できなくなると連絡などができなくなるという理由からアメリカ国防省が開発を進め、迂回路を作ることで攻撃され一部のネットワークが使えなくなっても通信が停止しないようなネットワークを作ろうとした。
その後ARPANET(Advanced Research Projects Agency Network)というネットワークがアメリカの大学と研究機関により作られた。
そしてARPANET内の研究グループによってTCP/IPが開発された。その後10年ほどでTCP/IPの使用が決定され、ARPANETで使う唯一のプロトコルとなった。
ARPANETの内部ではとても重要な役割を果たしていたが、それだけではここまで普及しなかったと思う。ではなぜここまで普及したのだろうか。それは大学や研究所などでOS(Operation System)としてBSD Unix（カルフォルニア大学バークレー校で開発、無料配布されていたUnix）が広く使われていたことにある。このOSの内部にTCP/IPが組み込まれた。そして同じ年にTCP/IPを実装した製品を一般ユーザーに提供し始めた。その後LANが発達すると共にUNIXが普及し始め、TCP/IPによる世界的なネットワークをインターネットと呼ぶ様になった

# 2.3 インターネットの基礎知識
- インターネットとは
  - インターネットとは元々は、複数のネットワークを結んで一つのネットワークにすることを表していた。しかし、今ではその様な意味では使われず、ARPANETから発展し、全世界を接続しているコンピュータネットワークのことを指す。インターネットの対義語でイントラネット（intranet）というものがある。イントラネットはインターネットの技術を使って、会社などの組織内部に閉じた通信サービスを行うことを目的に構築されるネットワークと言う意味で使われることが多い

- インターネットの構造
  - インターネットは小さなネットワーク同士を接続したものになっている。それぞれのネットワークはバックボーンと呼ばれる基幹ネットワークと、スタブと呼ばれる末端のネットワーク部分から構成されている。ネットワークとネットワークはNOC(Network Operation Center)で接続されており、ネットワークの運用者や運用方針、利用方針などが異なるネットワークを台頭に接続するポイントはIX(Internet Exchange)と呼ばれている。つまり、インターネットを一言で説明すると異なる組織のネットワークがIXによって接続された巨大なネットワークと言える

- ISPと地域ネット
  - インターネットに接続する際はISP(Internet Service Provider)や地域ネットに接続を依頼することになる。会社や家庭のコンピュータをインターネットに接続する場合、インターネットへの接続契約をISPとの間で交わすことになる。なので、ISP同士などでプロバイダが違う場合などはIXで繋がれており、ISP内の組織などはNOCなどで繋がれていて、それらのNOCがバックボーンと呼ばれる期間ネットワークに接続されている

# 2.4 TCP/IPの階層モデル
OSI参照モデルの各層の役割などは前回の記事でまとめたが、TCP/IPで登場するプロトコルも基本的にはOSI参照モデルに当てはめることができる
- ハードウェア（物理層）
  - TCP/IPの階層モデルでは、最下位層に物理的にデータを転送してくれるハードウェアを置いている。通信する媒体は有線や無線など限定しておらず、セキュリティや帯域なども特に制限なく、物理的に接続するもの全般を指している。データの0や1を電圧や電磁波に変換する仕組みを持っている
　　
- ネットワークインターフェース層（データリンク層）
  - ネットワークインターフェース層はイーサネットなどのデータリンクを利用して通信をするためのイターフェースとなる階層。ネットワークインターフェース層とハードウェアをまとめて一つの層として扱う例も多い。またネットワークコミュニケーション層と呼ばれる場合もある。NICを動かすためのデバイスドライバと考えてよい。デバイスドライバとはOSとハードウェアの橋渡しをするソフトウェアのことで、NICなどのハードウェアを拡張スロットに入れたりするだけではそのカードを実際に利用することはできず、その周辺機器を利用するためのソフトウェアも使用しなければならない（普通はハードウェアと共に付属されている）。利用するコンピュータのOSにデバイスドライバをインストールして初めてネットワークインターフェースを利用できる環境が整う（最近ではプラグ&プレイ機能によって、接続するだけで周辺機能を使える場合もあるが、これはOSに初めからそのネットワークインターフェースに対応するデバイスドライバが内蔵されているだけで、デバイスドライバが不必要なわけではない）。また、符号化を用いることで、物理層の伝送誤りを検出、訂正などもしている
　　
- インターネット層（ネットワーク層）
  - インターネット層はIPプロトコルが使用される。OSI参照モデルの第三層であるネットワーク層の役割に相当し、IPは、IPアドレスを元にして最終目的のホストまでパケットを転送する。中継機器としてルーターが動作する
  - IP(Internet Protocol)
    - ネットワークを跨いでパケットを送信し、インターネット全体にパケットを送るためのプロトコル。それぞれのホストを識別するためにIPアドレスという識別子を使用する。このIPアドレスはIPネットワークに接続する全ての機器に異なるIPアドレスを付与する必要がある
    - IPはパケット交換のプロトコルだが、パケットが相手に到達しなかったときはパケットの再送などは行わず、信頼性のないプロトコルと言える（ベストエフォート型などとも言われる。プラスの意味で捉えられがちだが、ここでは保証がされていないという意味で使われている）
  - ICMP(Internet Control Message Protocol)
    - IPパケットの配送中に何か異常が発生してパケットが送信できなくなったときに、パケットの送信元のIPアドレスに異常を知らせるために使用されるプロトコル。ネットワークの診断などでも使用される
  - ARP(Addres Resolution Protocol)
    - パケットの物理的なアドレス（MACアドレス）をIPアドレスから取得するプロトコル
　　
- トランスポート層
  - この層はOSI参照モデルのトランスポート層と同じ様な役割を持っている。トランスポート層の役割は、アプリケーション間の通信を実現することである。基本的にコンピュータの内部では様々なプログラムが同時に動作しており、どのプログラムとどのプログラムが通信しているかを識別するためにポート番号を用いている。代表的なプロトコルにはTCPとUDPの二つがある
  - TCP(Transmission Control Protocol)
    - コネクション型で信頼性のあるトランスポート層のプロトコル。両端のホスト間でデータの到達を確認して、もし途中でパケットがなくなったり、順番が入れ替わったりしてもTCPが正しく解決し、再送制御などを行ってくれる。また、ネットワークの混雑（輻輳）を和らげるための仕組みなどいろいろな機能が組み込まれていて、信頼性の向上が図られている
    - しかし、コネクションの確立や切断を行うためパケットを7回もやり取りするため転送するデータの総量が小さいときや、データの遅延が許されない時などは向いていない。基本的にはwebブラウジングやファイル転送などで使用されている
  - UDP(User Datagram Protocol)
    - TCPと異なり、コネクションレス型のプロトコルで信頼性のないトランスポート層のプロトコル。UDPはデータが相手に届いているかのチェックや相手のコンピュータがネットワークに接続されているかどうかなどは気にしない。その分、アプリケーションプログラムで確認する必要などがある
    - しかし、パケット数が少ない通信、ブロードキャストの通信やマルチキャストの通信、ビデオや音声などの一部データの欠損が許される通信に向いている
　　
-  アプリケーション層（セッション層以上の上位層）
TCP/IP階層モデルではOSI参照モデルのセッション層からアプリケーション層は全てアプリケーションプログラムの中で実現されると考えられている
TCP/IPのアプリケーションの多くはクライアント/サーバーモデルで作られている。サービスを提供するプログラムがサーバーで、サービスを受けるプログラムがクライアントである
サービスを提供するサーバーはあらかじめ起動している必要があり、クライアントからの要求にいつでも答えられる必要がある
- Webアクセス（WWW： World Wide Web）
  - WWWはインターネットが一般に普及する原動力となったアプリケーションで、ユーザーはマウスやキーボードで操作するWebブラウザ（ChromeやSafariなど）を使用してネットワークの情報を簡単に取得することができるようになった
  - OSI参照モデルではHTTP（HyperText Transfer Protocol）がアプリケーション層のプロトコル、HTML（HyperText Markup Language)がプレゼンテーション層のプロトコル。また、HTTPの通信ではポートは80番を使用する（サーバー側のポート番号が80番であるだけで、送信元のポート番号は動的に割り当てられる（エフェメラルポートともいう）ので、複数タブを開いても異なるHTTP通信が可能になる）
>通信は以下の5つで識別されている
> - 宛先IPアドレス
> - 送信元IPアドレス
> - 宛先ポート番号
> - 送信元ポート番号
> - トランスポート層のプロトコル（TCPやUDP）

- 電子メール（SMTP：Simple Mail Transfer Protocol）
  - 電子メールでよく使われるE-Mailとはelectoronic mailの略字であり、ネットワーク上での郵便の仕組みのようなもの。電子メールでは遠く離れた人にも簡単にメッセージを送ることができるが、その際に使用されているのがSMTPというプロトコル（アプリケーション層）であり、SMTPのポート番号は25番
  - 以前まではテキスト形式でしか送信できなかったが、MIME(Multipurpose Internet Mail Exetensions)という仕様が一般的になり、映像や音声のファイルなど様々な情報が送信できるようになった。これはOSI参照モデルの第六層のプレゼンテーション層のプロトコル
- ファイル転送（FTP：File Transfer Protocol）
  - ファイル転送とは異なるコンピュータのハードディスク上に存在するファイルを自分のコンピュータのハードディスク上に転送したり、逆の操作のことを言う。その際に用いられるのがFTPであり、ファイル転送の際にはバイナリモードやテキストモードを選ぶことができる。その際サーバーで使用される（受け取り側）受け待ちポートは21番が使用され、サーバーがクライアントにデータを送信するようのポートに20番が使用される。また、より安全なプロトコルにSFTP (Secure File Transfer Protocol)と言うものもある
- 遠隔ログイン（TELNETとSSH：TELetypewriter NETwork、Secure Shell）
  - 遠隔ログインとは遠く離れたコンピュータにログインしてそのコンピュータでプログラムを走らせることができるようにするための機能。TELNETやRSH(Remote SHell)などは暗号化されていないプロトコルで、SSHなどは暗号化されていて、安全に通信することができるプロトコル
  - Windows環境でリモートのコンピュータにアクセスする際はRDP(Remote Desktop Protocol)というプロトコルが使われる。暗号化されていて安全で、GUIなども提供しており、リモートデスクトップの画面もある。一方、SSHは主にLinuxやUnixの環境でリモートシェルにアクセスすることを目的に使用され、リモートのコンピュータにCLIでアクセスし、操作することができる。ポート番号は22番を使用される
- ネットワーク管理（SNMP：Simple Network Management）
  - TCP/IPではネットワークの管理にSNMPというプロトコルが使用される。SNMPで管理されるルーターやブリッジ、ホストなどはエージェントと呼ぶ。SNMPでネットワーク機器を管理するプログラムをマネージャと呼ぶ。このエージェントとマネージャの通信で使用されるプロトコルがSNMP（アプリケーション層）である。
  - SNMPではネットワークインターフェースの情報や通信パケットの量、異常なパケットの量、機器の温度の情報など様々な情報を格納している。それらはMIB(Management Information Base)という共通格納形式によって格納される（プレゼンテーション層）

# 2.5 TCP/IPの階層モデルと通信例
```txt:パケットヘッダ
┌─────────────────┌─────────┌──────────┌────────┐
| イーサネットヘッダ | IPヘッダ | TCPヘッダ | データ  |
└─────────────────└─────────└──────────└────────┘
```
- イーサネットヘッダ
TCP/IP: ネットワークインターフェイス層
OSI: データリンク層
データの単位：フレーム
　　
- IPヘッダ
TCP/IP: インターネット層
OSI: ネットワーク層
データの単位：パケット
　　
- TCPヘッダ
TCP/IP: トランスポート層
OSI: トランスポート層
データの単位：セグメント
　　
- データ
TCP/IP: アプリケーション層
OSI:セッション層
　　プレゼンテーション層
　　アプリケーション層
データの単位：メッセージ

各層によりデータの単位、呼び方が異なるので注意！

ヘッダはプロトコルごとに細部までその仕様が決められており、PPP, IP, TCPなどのサービスを提供する機器の開発者はこの仕様に従う義務がある

#### 「おはようございます」というメッセージをAさんがBさん宛に電子メールで送信するときを例に流れを見てみる

ユーザの操作
1. 宛先を指定（アプリケーション層）
2. 本文を書く（アプリケーション層）
3. 送信　　　 （アプリケーション層）

アプリケーション，OS，デバイスの処理
1. UTF-8で符号化   　　　　　　　　　　　(プレゼンテーション層)
2. 送信のタイミング調整　　　　　　　　 (セッション層)
3. TCPの接続確立  　　　　　　　　　　　 (トランスポート層)
4. 送信先ポートの指定 　　　　　　　　　 (トランスポート層)
5. 送信先IPアドレス指定　　　　　　　　　(ネットワーク層)
6. 最初の中継地点のMACアドレスを調べる（データリンク層）
7. データを信号に変換　　　　　　　　　　（物理層）

この時に、元のデータに対してTCPヘッダやIPヘッダ、イーサネットヘッダを順につけてデータを物理層を通じて送信される

#### パケットの送信処理
- アプリケーションの処理
  - ここではアプリケーションプログラムを実行してメールを作成する。メールアプリを起動してメールの受取人などを指定してメッセージをうち、送信する。その後TCP/IPによる通信が開始される
  - まず、アプリケーションプログラムでは符号化の処理が行われる。今回だとUTF-8やISO-2022-JPといった規則に基づいて符号化される。これはOSIのプレゼンテーション層に相当する役割
  - 次にメールを実際に送信するのだが、メールソフトによってはメールをすぐに送信せずに複数のメールをまとめて送信したり、送信ボタンを押したらまずメールをまとめて受信してから送信する機能があったりと様々である。このような通信のコネクションをいつ確立してデータを送信するかを管理するのがOSIのセッション層に相当する
  - そしてTCPのコネクションが確立されたらそれを利用してメールのデータを送信する。ここまでの処理が済んだデータに対して次のトランスポート層がさらに様々な加工をしていく
　　
-  TCPモジュールの処理
   - TCPはアプリケーションの指示（セッション層）によってコネクションを確立してデータを送信したり、コネクションを切断したりする。TCPでは信頼性のあるデータ転送を実現するために、アプリケーションから渡されたデータの前にTCPヘッダをつける。ここには送信ホストと受信ホストのポート番号やそのパケットが何バイト目なのかを示すシーケンス番号、データが壊れていないかを確認するチェクサムなどが含まれる。そしてこれらのTCPヘッダをつけられたデータがIPに送られる
  　　
-  IPモジュールの処理
   - IPではTCPから渡されたデータ（TCPヘッダのついたデータ）を一つの塊のデータとして扱う。このように、TCPヘッダの前にはIPヘッダが続き、その前には次のイーサネットヘッダが続いていく
   - IPヘッダには宛先のIPアドレスや送信元のIPアドレス、IPヘッダの次に続くデータがTCPなのかUDPなのかといった情報が含まれる
   - IPパケットが完成したら、経路制御表（ルーティングテーブル）を参照して、IPパケットを次に受け渡すルーターやホストを決定する。そして、その機器が接続されているネットワークインターフェースのドライバにIPパケットを渡して実際の送信処理をしてもらう。宛先のMACアドレスがわからない場合はARPを利用してMACアドレスを調べることができる。MACアドレスがわかったらイーサネドライバにMACアドレスとIPパケットを渡して送信処理をしてもらう
  　　
-  ネットワークインターフェース（イーサネットドライバ）の処理
   - IPから渡されたIPパケットはイーサネットドライバからみると単なるデータに過ぎない（IPモジュールにTCPからデータが送られてきた時と同じ）。イーサネットのヘッダには宛先と送信もとのMACアドレス、イーサネットのヘッダに続くデータのプロトコルを示すイーサネットタイプが書き込まれる
   - 以上の処理をして作られたイーサネットのパケットが物理層によって相手先に運ばれる。送信処理中にFCS（Frame Check Sequence）が計算されパケットの最後につけられる。これはノイズなどによりパケットが破壊されたことを検知するためのもの

#### データリンクを流れる時の処理
デバイスの処理
1. 送信先IPアドレスを見て経路制御(ネットワーク層)
2. その都度，中継地点のMACアドレスを調べる（データリンク層）
3. データを信号に変換（物理層）
4. 有線・無線媒体中を伝送（物理層）
5. 信号をデータに変換（物理層）
6. イーサネットのヘッダをとる(データリンク層)
7. 送信先のホストに届くまで1-6を繰り返す

パケットが流れる時には先頭にイーサネットのヘッダが付き、その後ろにIPヘッダが付く。さらにその後ろにTCPヘッダやUDPヘッダなどがつき、その後ろにはアプリケーションのヘッダが続く。そしてパケットの最後にはイーサネットトレイラ（FCS）が付く。
それぞれのヘッダには宛先と送信元のアドレス、上位層のプロトコルが何か、を示す情報が必ず入っている。それぞれのプロトコルの階層ごとにパケットを送信するホストやプログラムを識別するための情報が決められており、イーサネットではMACアドレスが、IPではIPアドレスが、TCP/UDPではポート番号が識別子として利用される。アプリケーションでも電子メールのメールアドレスのように、アドレスが使われることがあり、それらのデータはそれぞれの階層のヘッダに格納されてから送信される。（通信の際には送信先と送信元のMACアドレス、IPアドレス、TCP/UDPでのポート番号の5つで通信を区別している）これらのヘッダに書かれている識別子を各層ごとに確認して処理を行なっている。
また、デバイス処理の6でイーサネットのヘッダを取ったあとは、IPアドレスから経路制御表を利用して次のMACアドレスにデータを送信するが、その際にイーサネットヘッダを被せることをフレーム化と言う。TCPヘッダやIPヘッダを被せることはパケット化などと言うが、レイヤーによって言い方が異なるだけで同じ概念である

#### パケットの受信処理
受け取ったホストでは送信ホストと全く逆の処理を行う
アプリケーション，OS，デバイスの処理
1. 信号をデータに変換    　　　　　　　 　（物理層）
2. TCPかUDPか判定　　　　　 　　 　 　（ネットワーク層）
3. チェックサム，ポート番号の判定　　　（トランスポート層）
4. メッセージを格納しセッションを切断　（セッション層）
5. 符号を解読 　　　　　　　　　　　　　（プレゼンテーション層）
6. メッセージを保存 　　　　　　　　　　（アプリケーション層）

ユーザの操作
1. 受信ボタンを押す
2. 届いたメールを読む

- ネットワークインターフェース（イーサネットドライバ）の処理
  - イーサネットのパケットを受け取ったホストはまず、イーサネットヘッダの宛先MACアドレスが自分宛かどうかを調べ、自分宛でないときはそのパケットを捨てる。もし、自分宛であった場合はイーサネットタイプフィールドを調べてイーサネットプロトコルが運んでいるデータの種類を調べる。今回だとIPを運んでいるので、IPを処理するルーチン（決められた処理を行うプログラム）にデータを渡す。ARPなど他のプロトコルの場合はそれのルーチンにデータをわつことになる
- IPモジュールの処理
  - IPのルーチンにIPヘッダ以降の部分が渡されるとそのままIPヘッダを処理する。ここでもネットワークインターフェースと同様に、宛先IPアドレスが自分のホストのIPアドレスならそのまま受理して上位層のプロトコルを調べる。そしてTCPならTCPの処理ルーチンにIPヘッダを除いたデータを送る
  - ルーターなどの場合は受信するIPパケットの宛先はほとんどが自分宛ではないので経路制御表から次に送るホストやルーターを調べて転送処理を行うことになる
- TCPモジュールの処理
  - TCPではチェックサムなどを計算してヘッダやデータが壊れていないかを確認する。そしてデータが順番通りに送られているかを確認する。また、ポート番号を調べて、通信を行っているアプリケーションを特定する
  - データが正しく届いて時にはそれを確認するための、確認応答を送信元のホストに返す。この確認応答が来るまで送信元ホストはデータを繰り返し送信する。データが正しく受信された場合にはポート番号で識別したアプリケーションプログラムにデータが渡される
- アプリケーションの処理
  - 受信側のアプリケーションは送信側が送信したデータをそのまま受信することになる。受信したデータを解析し、B宛のメールであることを知る。もしBのメールボックスが存在しない場合は送信元のアプリケーションに受取人がいないとエラーを返す（アプリによる）
  - 今回のように正しくデータが送信できた場合は処理が正常に終了したことを送信元のアプリケーションに伝え、途中でディスクがいっぱいになったりしてデータを格納できない場合は以上終了としてメッセージを送信する。これらの操作によってBのディスプレイ上に「おはようございます」というメールが表示される