okinawa

勉強メモ

ネットワークはなぜつながるのか第2版を読んだメモ

 

参考

とても良い本でした。

www.nikkeibp.co.jp

 

各操作抜粋

各操作の意味がわかったのが、この本を読んで一番良かった点。

(操作)リクエスト・メッセージをF12→ネットワークで見てみる

f:id:dodosu:20210822175600p:plain

大量のリクエス

(操作)自PCのネットワーク詳細の確認

右下のネットのとこクリックネットワークとインターネットの設定

→ネットワークと共有センタ→接続名をクリック→詳細

 

↓こんな感じでIPアドレスやら最寄りのDNSサーバーを設定する。

f:id:dodosu:20210822181433p:plain

(操作)netstat -anoでソケットを見る(TCP担当部分)

f:id:dodosu:20210829094845p:plain

  • ローカルアドレス  自分のIPアドレス : ポート番号
  • 外部アドレス  相手のIPアドレス : ポート番号
  • 状態  通信状態。listening相手からの接続待ち。established通信中。
  • PID  識別番号。タスクマネージャーで調べられる。

(操作)route printでルータの経路表を見る(IP担当部分)

f:id:dodosu:20210909110302p:plain

ゲートウェイの「リンク上」同じネットワーク内にあるので中継いらず、ということ。

 

道順は、インターフェース→ゲートウェイ→宛先、となる。

ASCII.jp:ルーティングの基本動作を見てみよう

 

127.0.0.1localhost。自分自身を表す、ループバックアドレスと言う。

ローカル・ループバック・アドレス(127.0.0.1)とは?:Tech TIPS - @IT

https://wa3.i-3-i.info/word17065.html

(操作)tracert -d で宛先までの道順を見る(IP担当部分)

f:id:dodosu:20210912113116p:plain

IPアドレス8.8.8.8に到達するまでの中継ルーターIPアドレスが表示される。

tracertコマンドでネットワークの経路を調査する【Windows 10トラブル対策】:Tech TIPS - @IT

(操作)arp -aでIPとMACアドレスの対応表を見る(イーサネット担当部分)

f:id:dodosu:20210829112027p:plain

このIPアドレスを持つ機器は、このMACアドレスを持っていますよ、というIPとMACの対応表。 

 

ブラウザ(アプリケーション)のお仕事

URL入力

http:// ウェブサーバー
ftp:// ファイルサーバー URLに入力するとファイルサーバー用ソフトが起動する
mailto:// メールサーバー URLに入力するとメールソフトが起動する

file:// ファイル読み込み

www ワールワイドWEB。インターネットのこと。

例:HTTPプロトコルでWebサーバーにアクセス
http://user:password@www.google.com:80/dir/file1.htm

user ユーザー名(省略可)
password パスワード(省略可)
www ホスト名(ウェブサーバー名)
google.com Webサーバーのドメイン
80 ポート番号(省略可)
dir/file1.htm ファイルのパス名

 

例2:クライアント自身のファイルからデータ読み込み
file://localhost/c:/path/file1.zip

localhot コンピュータ名(省略可
c:/path/file1.zip ファイルパス


ブラウザに「file:///C:/Users/」と打ったらこんな画面が開いた!!! ほえー初めて知ったわ。ブラウザでこんなことできるんやなあ。

f:id:dodosu:20210822180005p:plain

 

例3:メール

mailto :abc@gmail.com

abc@gmail.com メールアドレス

 

URLの解読

https://www.google.co.jp/
 上記のURLを入力するとブラウザは
 httpプロトコル
 www.google.co.jpというドメイン名のWEBサーバー
 に接続するんだなあと解読する。

ファイル名を省略した場合にどこにアクセスするのか?
 デフォルトをindex.htmlとかmain.htmlとかをウェブサーバーに設定しておく。
 そうするとルートディレクトリにあるindex.htmlにアクセスする。
 ↓こんなふうに解読する。
https://www.google.co.jp/root/index.html

 

HTTPリクエストメッセージの作成

リクエスメッセージに書かれていること

何を URI  https://www.google.co.jp/など
どうする HTTPメソッド GET/POST/PUTSなど

リクエスメッセージの中身

リクエストライン:メソッド・ URI・ HTTPバージョン

メッセージヘッダー:リクエストの付加的な情報

メッセージボディ:クライアントからサーバーに送るデータ。GETの場合は空。POSTの場合はFormに入力した値など。

リクエスト・メッセージに書くURLは1つだけ

画像がある場合は、画像の枚数分リクエストを送っているらしい。
画像に限らずjsファイル、CSSファイルなんかの読み込みにもリクエストを送っていると思う。
1つのページを開くのに大量のリクエストが送られていることの謎が解けた。
↓html以外にも大量のリクエストがある。

f:id:dodosu:20210822175600p:plain

大量のリクエス

(操作)リクエスト・メッセージをF12→ネットワークで見てみる

上記画像のようなものが見れる。

 

DNSサーバーに問い合わせ

ブラウザから最寄りのDNSサーバーにwww.google.comというサーバーのIPアドレスを教えて、と問い合わせる。

IPアドレスの基本
  10進数表記 2進数表記    
IPアドレス 10. 1.    2.   3 00001010.00000001.00000010.00000011
サブネットマスク 255.255.255.0 11111111.11111111.11111111.00000000

サブネットマスク2進数表記の「1」の部分がネットワーク部。

「0」の部分がホスト部

 

例: 10.11.12.13/255.255.255.0
全32ビット中の上位24ビットがネットワーク、下位8ビットがホストであることを示す。

10.11.12.13/24でも同じ意味。上位24がネットワーク部ですよということ。

 

f:id:dodosu:20210823084901j:plain

ドメイン名とIPアドレスを使い分ける理由

ドメイン名の方が人間にはわかりやすいが、データ量が多くなってしまうため。
IPアドレス:32ビット
ドメイン名:数十~255バイト

 

(操作)自PCのネットワーク詳細の確認

右下のネットのとこクリックネットワークとインターネットの設定

→ネットワークと共有センタ→接続名をクリック→詳細

 

↓こんな感じでIPアドレスやら最寄りのDNSサーバーを設定する。

f:id:dodosu:20210822181433p:plain

IPアドレスって怖いから隠すけど、DHCPなら毎回変わるし関係なさそう。

最寄りのDNSサーバーがばれる方が危ないのかなあ。

DNSサーバーの基本動作

クライアントからDNSサーバーへの問い合わせ内容

名前 サーバーやメール配送先
クラス 常に「IN」 INはインターネットを表す。最初はインターネット以外も使う想定だった名残。
タイプ A:IPアドレス MX:メール配送先

 

名前 クラス タイプ
www.google.com IN A

↑www.google.comのIPアドレスは?という問い合わせ。

 

DNSサーバーからクライアントへのレスポンス

名前 クラス タイプ レスポンス
www.google.com IN A 192.0.2.226

↑www.google.comのIPアドレスは192.0.2.226だよというレスポンスが返ってくる。

返ってくるのはレスポンス部分だけ。

 

ドメインの階層

例:www.lab.glasscom.com

comドメインが最上位で、comの中のglasscomの中のlabドメインという順に探す。

DNSサーバーも同じ構造になっていて最上位のDNSサーバーにcomが登録されていて、その下位にglasscocom→labが登録されている。

なので、DNSサーバーを上から順にたどっていくと目当てのドメインに辿り着ける。

 

目的のドメインを探す流れ

クライアント→最寄りのDNSサーバー→ルートDNSサーバー→comDNSサーバー→glasscomDNSサーバー→labDNSサーバー→目的のドメインIPアドレス

※最寄りのDNSサーバーはクライアントに設定しておく。

 

URLからIPアドレスを割り出すことを「名前解決」という。

 

プロトコルスタックにメッセージ送信を依頼する

プロトコルスタックとは?

プロトコルスタックとは、コンピュータ上で、通信を実現するための一連の通信プロトコル群を実装しているモジュール(プログラム部品)のことである。
通信プロトコルは階層的な構造を持っている。 その各階層で、それぞれ異なる役割のプロトコルが機能しており、各プロトコルが連携して初めて通信が実現されてる。 例えば、インターネットで用いられているTCP/IPでは、TCPやIPに加えて、HTTP、EthernetIEEE 802.3)などの通信プロトコルが機能しており、それらが連携して初めて通信機能を実現している。 プロトコルスタックは、一揃い(suite)という意味で、プロトコルスイートと呼ばれることもある。 特にTCP/IPの場合は、「インターネットプロトコルスイート」と呼ばれることも多い。 ちなみに、スタック(stack)とは「積み重なり」といった意味である。

 

用語検索 - ZDNet Japan

 

IPアドレスが分かったら、宛先にメッセージを送るようにOS内部にあるプロトコルスタックに依頼します。

具体的にはSocketライブラリのプログラムを決められた順番に呼び出して依頼するらしい。

ちょっとここらへんよくわからなかった。

 

イメージとしては

ソケットというのは通信用の出入り口。

まず、Webサーバー側が通信用のソケットを用意してリクエストが来るのを待ち受ける。

ウェブサーバーはソケット常時用意して、常に待ち受けている。

クライアント側は、通信するときだけソケットを作り、ウェブサーバーまでパイプを繋いで通信をする。

通信が終了したら、パイプを外してソケットを抹消します。

  1. ソケットを作る
  2. サーバー側のソケットにパイプを繋ぐ
  3. データを送受信する
  4. パイプを外してソケットを抹消する

これらの動作はブラウザではなく、OS内部のプロトコルスタックの担当。

ブラウザは依頼するだけ。

 

OSのお仕事 TCP/IP プロトコルスタックとLANアダプタを探検

  1. ソケット作成
  2. サーバー接続
  3. データ送受信
  4. サーバーから切断してソケット抹消
  5. IPとイーサネットの送受信動作

 

ここまでの流れ

 URL入力→URL解読→HTTPリクエスト・メッセージの作成

DNSサーバに問い合わせ→プロトコルスタックにメッセージ送信依頼

 

ソケットの実体(イメージ)

本来は概念的なもので実体はない。

実体↓

(操作)netstat -anoでソケットを見る

f:id:dodosu:20210829094845p:plain

  • ローカルアドレス  自分のIPアドレス : ポート番号
  • 外部アドレス  相手のIPアドレス : ポート番号
  • 状態  通信状態。listening相手からの接続待ち。established通信中。
  • PID  識別番号。タスクマネージャーで調べられる。

 

クライアントからサーバーへの接続動作の実際

クライアントがサーバーのソケットに接続→クライアントがTCPヘッダー作成

→IP担当部にわたす→IP担当部がパケット送信

→サーバー側IP担当部が受け取り、TCP担当に渡す→TCPのヘッダーを解析

→該当するソケットを探し出す→TCP担当が返事返す

TCPヘッダー作成→ここからは同じ→切断動作

 

TCPのお仕事

通信の接続、送受信、切断をIP担当に依頼すること?

主にヘッダー情報の作成してIP担当に渡すまで、というこになるのかしら。

 

IPとイーサネットのパケット送受信動作

ここらへんからハードウェアが出てくる。

xxxxというアドレスはxxxx番目のケーブルだ、みたいな。

 

ルーターとハブ

ルーターはIPのルールでパケット運ぶ

ハブはイーサネットのルールでパケットを運ぶ

 

ルーターが経路表を元に、次の宛先ルーターを特定

ルーターがハブ(イーサネット)に依頼

→宛先ルーターMACアドレスを調べて送る

 

どちらもヘッダー情報を参照しているが

という違いがある。

 

ちなみにIPアドレスはLANアダプタに付与する。

1つのPCにLANアダプタが複数あれば、その数だけIPアドレスがある。

 

プロトコルの流れ:TCP→IP→イーサネット

という順番で依頼していく。

という認識でいいじゃろか。

 

(操作)route printでルータの経路表を見る

f:id:dodosu:20210909110302p:plain

ゲートウェイの「リンク上」同じネットワーク内にあるので中継いらず、ということ。

道順は、インターフェース→ゲートウェイ→宛先、となる。

ARPはIPを元にMACを調べる

ARPはサブネット内のPC全部に「XXXというIPはいますか?いたらMACアドレス教えて」と伝える。

全員に聞く仕組みをブロードキャストという。

 

(操作)arp -aでIPとMACアドレスの対応表を見る

f:id:dodosu:20210829112027p:plain

このIPアドレスを持つ機器は、このMACアドレスを持っていますよ、というIPとMACの対応表。 

 

IPのお仕事

  • IPヘッダーの作成:TCPヘッダーを元に最終目的を知り、それを元に経路表から、次のルータの宛先をヘッダー情報に組み込む
  • MACヘッダーの作成:ARPMACアドレスを割り出し、その情報をMACヘッダーに組み込む。

 此処から先はイーサネットのお仕事。

 

 LAN機器のお仕事 ハブ、スイッチ、ルーター、ケーブル

※ここから先は雑まとめになります。疲れた。

  1. ケーブルとリピーターハブの中を信号が流れる
  2. スイッチングハブのパケット中継動作
  3. ルーターのパケット中継動作
  4. ルーターの付加機能

LAN機器の重要な役割は、信号を劣化させないこと。

 

電話局、プロバイダのお仕事

ADSLとか光ファイバのお話。

サーバー側のLANのお仕事

  • Webサーバー
  • ファイアーウォール
  • 負荷分散
  • キャッシュサーバー

のお話。

 

Webサーバーは社内にあるとは限らない。

データーセンターにあったり、クラウド上にあったりするよ。

ファイアーウォールの仕組み

パケットフィルタリングはパケットのヘッダー情報を元にフィルターする。

IPアドレスMACアドレス・ポート番号など。

例:Webサーバーは送信元ポート番号80以外は遮断する。

Webサーバーのお仕事

サーバーアプリケーションの構造

アパッチやらNginxのこと。

サーバーは複数のクライアントと同時に通信を実行する。

でも、これを1つのプログラムで実現するのは大変。

なので、クライアントが接続してくる都度、新たにプログラムを起動する。

複数のプログラムを同時起動するということ。

 

だから、プログラマーが作るプログラムは1つのクライアント処理だけを意識して作れば良い!

プログラムとクライアントは常に1対1ということになる。

 

ちなみに、接続のたびに新しいプログラムを起動するのはOSのお仕事。

OSがマルチスレッドで頑張ってるんやね。

まとめ

大雑把にMVCでのリクエスト→レスポンスの流れをまとめてみた。

 

  1. ユーザーがリクエスト送信
  2. ブラウザがHTTPリクエストを作成
  3. DNSサーバーに問い合わせて、URLから宛先IPアドレスを解析
  4. ルーターが経路表を元に宛先IPまでの順路を割り出す
  5. arpでネットワーク内の機器に「このIPアドレスをもつ人いますか?」と聞く
  6. 「私が持っています。MACアドレスはXXXXです。」と返答が来る
  7. 5と6を繰り返してWebサーバーにたどり着く
  8. Webサーバーがリクエストごとにプログラムを起動する
  9. apサーバーがリクエストをControllerで受け取る
  10. ControllerがModelに値をセット
  11. ModelがDBに値をセット
  12. DBが結果を返す
  13. Controllerがレスポンスを返す
  14. クライアントがレスポンスを受け取る
  15. ブラウザが画面をレンダリングして表示!