【学習記録】『HTTPの教科書』第１章　読書メモ　〜N予備校の復習を添えて〜

N予備校「Webアプリ入門編」を勉強していて、HTTPを体系的に学べる教材が欲しいなと思ったため『HTTPの教科書』を購入した。

N予備校を復習しつつ、『HTTPの教科書』から学んだこと・それと関連するN予備校の復習事項・理解が浅く今後の課題としたいところをメモし学習記録とする。

ITパスポートで概要に触れた内容と結構被っていたので、エントリーレベルの資格とはいえやっぱり勉強しておいてよかった。

<h5>第一章</h5>
・インターネットのネットワークはTCP/IPというプロトコル（約束事）に従って動いている。

<h6>TCP/IPの４つの層</h6>

　・アプリケーション層：アプリケーションで使う通信の動きを決める（HTTPなど）
　・トランスポート層：ネットワークで接続されているコンピュータ間のデータの流れを提供（TCPなど）
　・ネットワーク層：パケットの移動を扱う。どのような経路で相手にパケット（通信するデータ）を送るか決める（IPなど）
　・リンク層：ネットワークに接続するハードウェアを制御する（Etharnetなど)

<h6>情報のカプセル化</h6>
送信側は、データがアプリケーション層〜リンク層まで、階層を渡っていくたびに、必要なヘッダが増えていく。

HTTPデータ　→　TCPヘッダー　→　IPヘッダー　　　→　Ethernetヘッダー
　　　　　　　　HTTPデータ　　　TCPヘッダー　　　　IPヘッダー
　　　　　　　　　　　　　　　　　HTTPデータ　　　　TCPヘッダー
　　　　　　　　　　　　　　　　　　　　　　　　　　　HTTPデータ

受信側は、リンク層〜アプリケーション層まで、階層を渡っていくたびにヘッダーを外し、情報を受け取る。

Ethernetヘッダー　　→　IPヘッダー　　　　→　　TCPヘッダー　　→　HTTPデータ　
IPヘッダー　　　　　　　　TCPヘッダー　　　　　　HTTPデータ
TCPヘッダー　　　　　　　　HTTPデータ
HTTPデータ

・情報を階層化する目的＝階層ごとに役割を分けることで、設計が楽になる。仕様変更が楽になる。

<h6>IPプロトコル（ネットワーク層）</h6>
IPプロトコルは、個々のパケットを相手まで届ける役割

・IPアドレス：各ノードに付けられたアドレスのこと
※ノードとは・・・ネットワークに繋がっている機器１つ１つのこと

・MACアドレス：ネットワークカードに割り当てられた固有のアドレス。
※ネットワークカードとは・・・パソコンやプリンタなどをネットワーク（イーサネット、すなわちLAN）に接続するためのカードのこと

・ARP（Address Resolution Protocol)：データを送る宛先のIPアドレスを元にMACアドレスを調べられる約束事

<h6>DNS(Domain Name System)（アプリケーション層
）</h6>
ドメイン名からIPアドレスを調べる・IPアドレスからドメイン名を調べるサービス。（ちなみにHTTPと同じアプリケーション層に属している）

ドメインとは・・・インターネットのコンピュータやネットワークにつけられる識別子で、インターネットの住所のようなもの。名前・文字列で表している

IPアドレスとは・・・インターネットのコンピュータやネットワークにつけられる識別子で、インターネットの住所のようなもの。数字で表している


<h6>N予備校２章７項「通信とネットワーク」--------------------------------</h6>
この項目はカプセル化された情報のネットワーク層についての話だったんだなと再認識。

・ネットワーク層：パケットの移動を扱う。どのような経路で相手にパケット（通信するデータ）を送るか決める（IPなど）

○Linuxのコンソールにて

「sudo tcpdump src サイトのドメイン -X」

↓

サイトから送られてくるパケットを見ることができる。
サイトからの通信を待機中。

※
・sudo（スードゥー） : 「管理者として実行する」コマンド
PostgreSQLを立ち上げる時のコマンド、「sudo su postgres」でも使う

・tcpdump : TCPという取り決めで通信（トランスポート層にTCPを利用）している時の、パケットの中身を見るコマンド

・サイトのドメイン：www.XXXXXXX.jp　のように書かれる。
ドメインはインターネット上の住所のようなもの。ドメインをコンピューターにわかりやすい形に直したものがIPアドレス。

・-X:より詳細にパケットの中身を記述するオプション

○もう一つLinuxウィンドウを開ける、または、tumuxによってLinuxのタブをもう一つ増やし、

「curl https://サイトのドメイン/(←サイトのURL)」

↓
ウェブサイトの内容がコンソールに出力される。
tcpdumpを実行しているコンソールにパケットの詳細が出力される

※curlコマンド：指定したURLのサイトの内容をコンソールに表示するコマンド。便利。（参考：「curl コマンド 使い方メモ」 https://qiita.com/yasuhiroki/items/a569d3371a66e365316f）

↓

パケットの中身を見ると、これらがどのIPアドレスから送られてきて（送信元）、どのIPアドレスに送られるか（送信先）が書かれている。

<h6>----------------------------------------------------------</h6>
<h6>TCP（トランスポート層）</h6>
TCPは大きなデータを送信しやすいよう分割し、確実に相手に届いたか確認する役割

・確実に相手に届いたか確かめる・・・「スリーウェイハンドシェイク」方法による。


<h6>URIとURLの違い</h6>
●URI：リソースを識別するための文字列全般を表す。

例）
・電話番号は携帯電話を識別するためのURI
・URLはサイトを識別するためのURI
・MACアドレスはネットワークカードに繋がっている機器を識別するためのURI


●URL：リソースの、ネットワーク上の場所を表す

N予備校の何章だったか忘れたけれど、先生がいきなり、私がURLと認識していたもののことを、URIって呼び出して混乱した思い出。つまるところ、URIという大きなカテゴリの中にURLがある、ということ

<h6>N予備校２章７項「通信とネットワーク」--------------------------------</h6>

TCPプロトコルでは、相手のIPアドレスがどれくらい離れたところにあるか、通信可能なのかわからないままにデータを送信している。
↓
●pingコマンド：データを送りたい（＝ネットワーク疎通をしたい）ホストがどれくらい離れているか、通信可能なのか調べられる

curlコマンドを実行し、
「ping ドメイン名」

を実行。ドメインと、自分のIPアドレス間の通信にかかる時間と通信可能かどうかがわかる

●TTL（Time To Live):パケットが存在することのできる期間
TTLはルーターを経由するごとに１減り、０になるとパケットは消滅する。
<h6>----------------------------------------------------------</h6>

●サーバーのアドレス
○完全修飾絶対URI
例）
https:// www.kantei.go.jp /
HTTPSスキーム　＋　ドメイン

で構成される。

ここでのドメインがサーバーのアドレス。
サーバーのアドレスはIPv4アドレスか、IPv6アドレスでもありうる。

ドメイン＝IPアドレス


●サーバーのポート
サーバーの接続先となるネットワークポート番号を指定する。指定しなかった場合はデフォルトのポートが使用される。

<h6>N予備校２章8項「サーバーとクライアント」--------------------------------</h6>
●サーバーを立ててみる

・ncコマンド:TCPの読み書きを行うコマンド。
ネットワークの様々な場面で役立つ。webサーバーからの情報取得、簡易webサーバーの設置、メールの送信などを行う。

例１）
コンソールに
「while :; do (echo "Thank you for your access!") | nc -l 8000 ; done」

↓

「(echo "Thank you for your access!") | nc -l 8000」
ローカルホストの8000番ポートにアクセスしたら「"Thank you for your access!"」と表示する、というncコマンド

「while :; do 〜 done」は、〜の処理をずっと繰り返す、というシェルスクリプト

例２）
コンソールに
「nc nnn.ed.jp 80」
↓
「nnn.ed.jp」 というホスト名で表されるサーバーの 80 番ポートに接続する、 という nc コマンド


・ポート：TCP通信の取り決めの一つ。ポート番号としていずれかの数値を設定して通信を行う。ここでは8000番が使われている。


<h6>----------------------------------------------------------</h6>