Open5

ネットワークはなぜつながるのか【ログ】

mrnmrn

【1章】

<全体の流れ>

ユーザーがブラウザにURLを入力
→(ブラウザが)URLの意味に従って、「リクエスト・メッセージ」を作成 (Webサーバに何をして欲しいか伝える)
→ ブラウザはWebサーバのIPアドレスを調べる(URLの中に、Webサーバのドメイン名が書いてあるので、それをDNSサーバに問い合わせてIPアドレスを調べる)
→ WebサーバのIPアドレスをOSに通知する
→ (ルールに従って)OSに依頼し、Webサーバに向けてメッセージ送信してもらう


<1.1 HTTPリクエスト・メッセージを作成する>

  • URLは、http://だけではなく、ftp:やfile:など様々な種類がある
     → ブラウザの機能は、Webサーバにアクセスするクライアントだけではなく、ファイルをダウンロード/アップロードするFTPのクライアント機能やメールのクライアント機能などがある。(クライアント:サービスや機能を使う側のコンピュータのこと)よって、webサーバへアクセスする時はhttp、FTPサーバならftp:というようになる

  • URLの先頭(http:, ftp:など)はHTTP、FTPというプロトコルを使うという意味で捉える

  • http://www.lab.glasscom.com/dir1/file1.html」の意味とは、HTTPプロトコルを使ってWebサーバにアクセスし、「www.lab.glasscom.com」という名前のWebサーバ上にある「/dir1/file1.html」という名前のファイルにアクセスするという意味

  • HTTPプロトコルとは、クライアントとサーバがやり取りするメッセージ内容や手順を定めたもの

    • クライアントからサーバへのリクエスト・メッセージ;「何を(URIという)」「どうして(メソッド:GETなど)」欲しいのかを書く
  • リクエスト・メッセージがWebサーバに届いたら、その中にある内容と?、URIとメソッドに従って動作する→ 「レスポンス・メッセージ」に格納

  • レスポンス・メッセージの中身:「ステータス・コード(404 Not Foundなど)」→ ヘッダーやページのデータと続く

  • GETやPOSTメソッドの詳細 ←ポートフォリオのコードでも確認する


<1.2 WebサーバのIPアドレスをDNSサーバに問い合わせる>

  • ブラウザがHTTPのメッセージを作成→OSにWebサーバに向けて送信してもらう
  • OSに頼む前にやるべきこと:URL中に書いてあるサーバのドメイン名からIPアドレスを調べてからOSに依頼しなければいけない
  • インターネットや社内のLAは、TCP/IPの考え方に基づいて作られている
  • TCP/IPは、サブネットという小さなネットワークをルーターで接続することによって、全体のネットワークが出来上がっている
  • サブネットとは、ハブに何台かのパソコンが接続されたもの
  • サブネットが「住所の丁目に相当するもの」で、それぞれのコンピュータが「番地に相当するもの」
  • 住所の丁目に相当する番号を「ネットワーク番号」と呼び、番地に相当する番号を「ホスト番号」と呼び、このアドレスを「IPアドレス」という
  • IPアドレスによって、アクセス先が判断された後、「メッセージを送信→サブネット内のハブが、送信元から一番近いルーターまで届ける→ルーターがメッセージを届ける相手を見定めて次のルーターを判断→(最初とは異なる次のサブネットの)ハブがそのルーターまでメッセージを届ける」を繰り返してメッセージが届く
  • (TCP/IPとIPアドレスを説明できるようにする)
  • URLの中にIPアドレスではなく、サーバの名前を書く理由
  • ルータの負荷が増えてしまい、データを運ぶ動作に余分な時間がかからないようにするため。
  • IPアドレスを調べる方法は、最寄りのDNSサーバに問い合わせるだけ( = DNSサーバに対してクライアントとして動作するということ)
  • DNSリゾルバ:DNSクライアントに相当するもの
  • リゾルバを呼び出せば(プログラム中に記載するだけ)、DNSサーバに問い合わせてくれる

<1.3 世界中のDNSサーバーが連携する>
1.2の仕組みをもっと詳しく

  • サーバのIPアドレスを調べる時、クライアント(DNSリゾルバ?)は、「名前」「クラス」「タイプ」の3つの情報をDNSサーバに送る
  • DNSサーバは、サーバ内に登録されたドメイン名とIPアドレスの対応表を調べて、IPアドレスを回答する
  • 「www.lab.glasscom.com」の場合、comというドメインの下に、glasscomというドメインがあり、その下にlabというドメインがあり、そのドメインの中にwwwという名前がある
  • ルート・ドメインのDNSサーバをインターネットに存在するDNSサーバ全部に登録する
  • IPアドレスを調べた後→アクセス先のwebサーバにメッセージを送信するように、「OS
    内部にあるプロトコル・スタック」に依頼する(Socketライブラリのプログラム部品を決められた順番で呼び出すことによって、プロトコル・スタックに伝える仲介役をする)
mrnmrn

【2章】
<2.1 ソケットを作成する>

  • OSに組み込まれたネットサーク制御用ソフトウェア(プロトコル・スタック)とネットワーク用のハードウェア(LANアダプタ)がブラウザから受け取ったメッセージをサーバに送り出す動き

  • TCP/IPモデルは4層だけど、それを一旦置いといて読み進めていく

    • アプリケーション:ネットワーク・アプリケーション(アプリケーションの下にはSocketライブラリがあり、その中のリゾルバがDNSサーバに問い合わせる)
  • OS:プロトコル・スタック

    • TCPやUDPというプロトコルを使って、データの送受信を行う
    • IPというプロトコルを使って、パケットを通信相手まで運ぶ
  • ドライバ・ソフト:LANドライバ

  • ハードウェア:LANアダプタで実際の送受信動作を行う


  • ソケットとは、「プログラムとネットワークを繋げるもの」だが一体はなく、「制御情報を記録したメモリ領域」のこと
  • プロトコル・スタックはソケットに記録された情報を参照しながら動く
  • 上でやったように、ブラウザはTCPプロトコルを使ってデータの送受信をするように依頼をする
  • 整理:
    • TCP(トランスポート層)は、インターネット上での信頼性の高いデータ転送を提供する基盤。TCPがあるから、信頼性のあるデータ転送ができる
    • HTTP、FTP、SSHなど(アプリケーション層)は、背後でTCPが動いている
  • ブラウザがソケットを呼び出す→ プロトコル・スタックはソケットを一つ作成する(ソケット1つ分のメモリー領域を確保して、そこに初期状態であることを記録する )
  • ソケット情報は「ディスクリプタ」として、今後アプリケーションとやり取りする

<2.2 サーバに接続する>

-必要なこと

  • サーバのIPアドレスやポート番号をプロトコル・スタックに知らせる
  • クライアント側からサーバ側に通信動作の開始を伝える
  • クライアントとサーバが互いにやり取りするための制御情報をパケットの先頭部分(ヘッダー)に付加する(今回は特にTCPヘッダー)
  • 通信動作に用いる制御情報
    • ヘッダーに書き込まれる情報
    • ソケット(プロトコル・スタックのメモリ領域)に記録される情報
  • アプリケーションがsocketライブラリのconnectを呼び出す→connectに、サーバー側のIPアドレスとポート番号を書く→TCPに伝わり、TCPはTCPヘッダーを作成し、サーバー側のTCP部分と制御情報をやり取りする(IPを通して届けられる)

<2.3 データを送受信する>
上のサーバに接続する動作が終わり、connectからアプリケーションに制御が戻ったら、次はデータ送受信動作

  • アプリケーションがwriteを呼び出して、送信データをプロトコル・スタックに渡す
  • 受け取ったプロトコル・スタックが送信動作を実行
    • プロトコル・スタックは受け取ったデータの中身を知らない。そして、すぐに送信するのではなく、バッファ・メモリに貯めて次のデータが渡されるのを待つ
  • MTUとMSS
  • TCPには送信したパケットが相手に正しく届いたか確認する機能もある
    • 送信側はシーケンス番号も送る
    • 受信側がACK番号を返答することによって、送信側とやり取りする
    • つまり、「シーケンス番号」と「ACK番号」でパケットが受信側に届いたことを確認する
  • TCPはACK番号が返ってくるまでの時間を無駄にしないために、「ウィンドウ制御」という方式にしたがって、次々と連続して複数のパケットを送信する
    -ここまでは、ブラウザからの依頼を受け、プロトコル・スタックがHTTPリクエスト・メッセージを送る一連の動作説明(タイトルは送受信だけど、いわゆる送信の過程?)

<2.4 サーバから接続して、ソケットを抹消>
アプリケーションが送信すべきデータを送り終わった後

  • データが送り終わった側から切断フェーズに入る
  • (例:サーバー側から)アプリケーションがSocketライブラリのcloseを呼び出す→サーバ側のプロトコル・スタックがTCPヘッダーを作って、そこに切断情報をセット→IPにお願いして、クライアントに送信してもらう→サーバー側のソケットに切断動作に入った情報を記録
  • 図2.12がわかりやすい
    -2.2~2.4までがまとまっててわかりやすい↓


<2.5 IPとイーサネットのパケット送受信動作>
TCP部分は、上の各フェーズでIP部分に依頼して、やり取りするデータをパケットの姿にして相手に届けてもらった。IPがどのようにして、パケットを相手に送信するかをやっていく

  • パケット:宛先を示すヘッダーとデータから構成
  • パケットを最寄りの中継装置に送信→中継装置がヘッダーを調べて、パケットの行き先を判断
  • TCP部分がIP部分にパケット送信を依頼(データにTCPヘッダーをつける)→ IP部分は、さらに「IPヘッダー」と「MACヘッダー」をつける→ 出来あがったパケットをLANアダプタなどのハードウェアに渡す
  • IPヘッダーの中身:宛先IPアドレス、送信元IPアドレスなど
  • MACヘッダー:イーサネットは、TCP/IPとは違う仕組みでパケットの宛先を判断するので、その時用
    • 中身は、宛先MACアドレス、送信元MACアドレス、イーサ・タイプ
    • 内容物が何なのかをイーサ・タイプで示す
    • ARPで宛先ルーターのMACアドレスを調べる
  • イーサネットについて
    • 多数のコンピュータが様々な相手と自由に安価に通信するために考案された通信技術
    • コンピュータが信号を送信すると、ケーブルを伝わってネットワーク全体に信号が流れ、全員に信号が届く
    • 信号の先頭部分に宛先アドレス(MACヘッダー内)を書いておく→該当する機器はパケットを受信し、その他の機器はパケットを棄てる
    • 今では、スイッチング・ハブを使用した形態がイーサネットと呼ばれている(この系チアでは全員に信号が届かず、宛先MACアドレスで示す機器だけに信号が流れる)
    • 宛先MACアドレス、送信元MACアドレス、イーサ・タイプの性質を持つのがイーサネットだと思えばよい
  • LANアダプタ:IPが作ったパケットであるデジタル・データを電気や光の信号に変換して、ネットワークのケーブルに送り出す

<2.6 UDPプロトコルを用いた送受信動作>
UDPは一旦飛ばして、3章へ

mrnmrn

【3章:ケーブルの先はLAN機器だった】
ケーブルに送り出したパケットが、ネットワーク機器を経由してインターネットに進んでいく過程

<3.1 ケーブルとリピータ・ハブの中を信号が流れていく>

  • パケットのヘッダーに記載された制御情報と中継装置内部にある表で目的地を判断して、パケットを中継していく
  • 郵便局員と同様、中継装置はデータ部分は見ない
  • クライアント・パソコンがLANに接続されていることを想定→「リピータ・ハブ、スイッチング・ハブ、ルーター」を経由
  • LANアダプタのPHY(MAU)回路で電気信号に変わったパケットは、ツイストペア・ケーブルに入っていく
  • ケーブルの長さが長くなるほど、信号は弱くなる→ ツイストペア・ケーブル(より対線)には雑音の影響を抑える工夫
  • 信号がリピータ・ハブに届いたら、LAN全体に信号がばらまかれる
  • リピータ・ハブ:イーサネットの基本となる仕組みをそのまま実現したもの
  • MDIとMDI-X
  • リピータ・ハブのPHY(MAU)回路の受信部に届いた信号は、そこからリピータ回路に入る→リピータ回路のコネクタ部分から出ていき、リピータ・ハブに接続した機器全部に届く→信号を受信した機器は、宛先が該当すれば受信してパケットが届く

<3.2 スイッチング・ハブのパケット中継動作>

  • スイッチング・ハブ:イーサネットのパケットをそのまま目的地に向けて中継するように作られている
  • スイッチング・ハブは、MACアドレス・テーブルでMACアドレスを調べて、該当するポートから信号を送信する
  • スイッチング・ハブはリピータ・ハブと異なり、同時に複数のパケットを中継できる

<3.3 ルーターのパケット中継動作>

  • リピータ・ハブ、スイッチング・ハブを経由したパケットは、ルーターへ、次のルーターへ中継されていく
  • ルーターの内部構造:中継部分とポート部分
    • 中継部分がパケットの中継先を判断、ポート部分がパケットを送受信する
    • ルータの中継部分はIP部分と同じで、ポート部分はLANアダプタと考えてよい
  • まず、ポート部分でパケットを受信→ルータの中継部分で、「IPヘッダーに記載されている宛先IPアドレスと中継先を登録したテーブル」から中継先を判断 →ポートにパケットを移して、パケット送信動作
  • スイッチング・ハブと異なるところ:ルータの各ポートには「MACアドレス」と「IPアドレス」が割り当てられているので、送信元となってパケットを送信する
  • ルーターのテーブルは、ルーティング・テーブルまたは経路表と呼ばれる
  • スイッチング・ハブがMACヘッダーに記載されている宛先MACアドレスで中継先を判断するのに対して、ルーターはIPヘッダーに記載されている宛先IPアドレスで中継先を判断する
  • ルーターで中継するパケットの宛先MACアドレスには、そのルータのポートに割り当てられたMACアドレスが書いてある→なので、パケットを受信したら、MACヘッダーを棄てる
  • 3.3.3~あたりから少し飛ばす

<3.4 ルーターの付加機能>
上までがルータの基本的な機能で、ここからはさらに重要な機能を2つ
「アドレス変換」と「パケット・フィルタリング機能」について

mrnmrn

【【6章:Webサーバに到着し、応答データがWebブラウザに戻る】
パケットとは、通信しやすくするためにデータを細切れにしたもの

LANアダプタとは
ルーターとは