Web
2019-08-24 TSG 初心者分科会 Web特講 第1回
@hakatashi
第1回 Webの仕組みを理解する
自己紹介
- 博多市(@hakatashi)
- 自称フロントエンドエンジニア
Agenda
- Webプログラミングとは
- ネットワーク
- Webブラウザの登場
- サーバーを支える技術
- 最新技術動向
- 実習 (時間があれば)
Webプログラミングは大変
- ネットワーク
- バックエンド
- データベース
- フロントエンド
- JavaScript
- CSS
- HTML
- 設計思想
- アーキテクチャパターン
- セキュリティ
学ばないといけない技術領域が広い、かつ多種にわたる
どの技術一つとっても激重で
極めるのに時間がかかる
今回の目的
今回の講義 (第1回) は、そんな広大なWebの世界を
ひととおり眺めて、そもそも
Webサイトがどういう仕組みで動いているのかを
大雑把に理解することが目的
ネットワーク
インターネットは通信
- 「インターネット」のことを考える前に、
まずは1台のコンピューターと1台のコンピューターの
通信を考えてみる - そこらへんに転がってるLANケーブルを持ってきて
ファイルを送信したとする - ケーブルの中を流れているのは電気信号 (1000BASE-Tなど) だが、
今回はそのレベルの話はしないとして、 - 中を流れている「データ」は一体何?
インターネットはIP通信
- 現在、インターネットを支える通信のほとんどが
IPと呼ばれる仕組みを利用している- →そもそもIPは Internet Protocol の略
- インターネットを利用する端末には
IPアドレスと呼ばれる番号が付与され、
通信先を識別するために用いられる- 例: 160.16.228.30
- インターネット上でやりとりされるデータは、
みな「送信元のIPアドレス」や
「送信先のIPアドレス」などの情報を記した
固定のフォーマットに整形されて運ばれる。
このフォーマットをIPフレームと呼ぶ
第10回 IPパケットの構造とIPフラグメンテーション (2/3):基礎から学ぶWindowsネットワーク - @IT
https://www.atmarkit.co.jp/ait/articles/0304/04/news001_2.html
IPフレーム
アプリケーションを識別する
- インターネットを成立させるためには、
端末が識別できるだけでは不十分。
一つの端末には複数のサービスが動いていて、
それらを識別する仕組みが必要。
これがTCPやUDPと呼ばれる仕組みである - TCPやUDPはポート番号と呼ばれる番号で
そのデータの通信先の「サービス」を指定する。- HTTPはTCPの80番、HTTPSはTCPの443番、
DNSはUDPの53番など
- HTTPはTCPの80番、HTTPSはTCPの443番、
- TCPやUDPは (原則として) IPフレームの「上で」動作する。
すなわち先程のIPフレームのデータ部分に乗せられる
フォーマットであり、「通信先のポート番号」や
「通信元のポート番号」などを記した固有のヘッダーを持つ。
このフォーマットをTCPセグメント・UDPセグメントと呼ぶ
16. TCP/IP - TCP・UDPセグメント - インターネット技術講座
https://sites.google.com/site/networkinglecture/1_internet/16_tcpip03
TCPセグメント
TCPの仕組み
- TCPとUDPの違いは、一言で言えば「複雑さ」である
- TCPは複雑、UDPは簡単
- TCPもUDPも両方よく使われるが、実際のインターネット通信で
目にする機会が多いのはTCP- HTTP/3が来ると変わるかも
- UDPがデータを送りつけるだけの単純な通信を行うのに対して
TCPは端末間にコネクションを確立してから通信を行う。 - 実際の通信環境では、パケットの喪失や着順の錯誤がありうる。
これらにアプリケーションレベルで対応するのは大変なので、
TCPのレイヤーで対応する仕組みになっている。
逆に言えば、UDPを用いる場合これらへの対応を自分で
実装する必要がある。 - 一般に、コネクションを確立するための手続きを
ハンドシェイクと呼び、特にTCPが用いているハンドシェイクの
仕組みを、3ウェイハンドシェイクと呼ぶ。
ASCII.jp:「スリーウェイハンドシェイク」の手順、わかっていますか?|ネットワークがクイズでわかる! 誰が正解?「TCP/IP」
https://ascii.jp/elem/000/000/619/619702/
3ウェイハンドシェイク
通信を物理的に伝搬する
- 一度低レイヤーの話に戻る。
IPアドレスは「端末」を識別するアドレスだが、
物理的に通信を伝搬するには、「マシン」レベルで
通信相手を識別しないといけない。- 一つのマシンが毎回同じIPアドレスを
持つとは限らない。
- 一つのマシンが毎回同じIPアドレスを
- このために、一台のマシンには必ず固有の
MACアドレスを持つ。- Mac OS とは全く関係がない
- このMACアドレスを用いて物理的な通信を行うのが
イーサネットであり、IPフレームは通常この「上に」
乗せられて通信が行われる。 - MACアドレスとIPアドレスは通信する際には
通常1対1で対応する。これを対応付ける仕組みが
ARPである。
イーサネットフレーム
ASCII.jp:Ethernetのフレーム構造を理解しよう (1/3)|入門Ethernet
https://ascii.jp/elem/000/000/427/427324/
TCP/IP
- まとめると、通常のインターネット通信で
送られるデータは、以下のようなフォーマットに
包まれ、カプセル化されている。- イーサネット: 物理的なマシンを識別
- IP: 通信相手としての端末を識別
- TCP or UDP: 通信対象のアプリケーションを識別
- 実際に相手に贈りたいデータ
- これらをまとめた一つの通信単位としてのデータを
パケットと呼ぶ。 - また、同時に使われることが多いこれらの技術を
まとめてTCP/IPスイートもしくはIPスイートと
総称することが多い。
TCP/IPのパケット
記憶術で覚えるイーサネット②イーサネットフレーム、MACアドレス – ランスルネット
http://www.runsurunet.com/2017/05/17/%E2%91%A1%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0/
(簡易化された) OSI参照モデル
OSI参照モデル(おーえすあいさんしょうもでる)とは - コトバンク
https://kotobank.jp/word/OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB-1905
をもとに作成
イーサネット通信
IP通信
TCP/UDP通信
本当にやりたい通信
さらに詳しく?
- ここまでで述べたのがインターネットを支える
TCP/IP通信の基礎の基礎。 - 実際にはもっと複雑な技術がここから絡んでくる
- IPマスカレード、輻輳制御、TCP再送請求、
シーケンス番号、PPPoE、ゲートウェイ、
サブネットマスク、ブロードキャストアドレス、
IPv4、IPv6、ICMP、IPsec、MSS、
Well-known Ports、チェックサム、フラグ、
広域インターネット、無線通信など⋯⋯
- IPマスカレード、輻輳制御、TCP再送請求、
- だが、Webを軽く触るだけなら必要ないので省略
- 興味ある人はネットワークの勉強をしよう!
Webブラウザの登場
Webブラウザ
- これらの通信技術が進む以前の1960年代、
単なる文字情報だけじゃない、いろんなメタ情報を
含んだテキストで通信することが考えられる。
ハイパーなテキストなので、ハイパーテキストと呼ぶこれだけは言わせてもらいたいんだが、
名前をつけた人 (Theodor Nelson) はアホだと思う
- のちにインターネットが整備されるとともに生まれた
このハイパーテキストを記述するための言語の一つが
HTML (Hyper Text Markup Language)、
これを伝送するために発明されたプロトコルが
HTTP (Hyper Text Transfer Protocol) である。 - そして、インターネット越しに伝送されたHTMLを
クライアントが専用のブラウザー (閲覧用ソフトウェア) で
閲覧する、という発想が生まれることになる。
このようなブラウザーを通常ウェブブラウザーと呼ぶ。
HTMLの例
HTML is <big>Sugoi!</big>
HTTPの例
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sun, 25 Aug 2019 00:45:01 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 8706
Access-Control-Allow-Origin: *
Cache-Control: max-age=600
X-Proxy-Cache: MISS
X-GitHub-Request-Id: CB16:702F:2AE3EB:2E3810:5D60AA86
Accept-Ranges: bytes
HTML is <big>Sugoi!</big>
GET /hakatashi/sugoi.html HTTP/1.1
Host: tsg.ne.jp
User-Agent: curl/7.55.1
Accept: */*
リクエスト
レスポンス
これらが実際には
先ほど説明したTCP/IPフレームの内部で
伝達される
HTMLはセマンティクス
- HTMLはタグと呼ばれる記法で文書のメタ情報を
記述する。- このへんはSGMLやXMLといったGMLの系譜を
知ってないとちゃんと理解できないけど、
その辺はまるっと省略 - 関係ないけど伊藤計劃の『ハーモニー』最高なので
絶対読んでくれよな~~~~~~
- このへんはSGMLやXMLといったGMLの系譜を
- HTMLが表現するのは文書のセマンティクスである。
その多くが見た目に関するものなので混同されがちだが、
「ここは強調されるべき箇所」「ここは箇条書き」
などの「意味」をマークアップで示すのみであって、
それがどう表示されるべきかに関しては何も規定しない。- 実を言うとHTML5以前はこのあたりが仕様でも
混同されていたが⋯⋯
- 実を言うとHTML5以前はこのあたりが仕様でも
CSSの登場
- HTMLやHTTPが広く使われるようになると、
「ウェブページの見た目を細かく制御したい」
といった要望が現れてくる。
このために発明されたのがスタイルを記述するシート、
すなわちスタイルシートであり、これを
HTMLの上に「適用」することで見た目を制御させる。 - 現在は、CSS (Cascading Style Sheet) と呼ばれる
フォーマット以外はほぼ用いられない。 - HTMLがセマンティクスを表現するのに対して、
逆にCSSは「見た目の情報」しか表現しない。- つまり、記述的な意味を持たない。
CSSの例
HTML is <big>Sugoi!</big>
body {
background-color: red;
}
big {
display: inline-block;
transform: rotate(-30deg);
}
HTML
CSS
JavaScript
- ブラウザの普及が進むと、今度はブラウザ上で
簡単なスクリプトを実行する要求が生まれ始めた。
このために発明された「ブラウザ上で動作する」
スクリプト言語がJavaScriptである。- よく言われるが、Javaとは (ほとんど) 関係ない。
- 最初は「ボタンをクリックしたら〇〇を表示」
のような、Webページに単純なギミックを実装するのに
用いられていたが、時代が下るとともに言語・ブラウザともに
進化が進み、現在ではブラウザゲームのような
複雑なソフトウェアまでブラウザ上で実行できる。- コードの規模は数万行~数百万行程度にまでなる
- このようにクライアント上のWebブラウザが
先端技術化・複雑化する傾向は現在でも続いている。
JavaScriptの例
document.querySelector('big').onclick = function() {
this.textContent = [
'sugoi!', 'amazing!', 'happy!', 'ojigineko!',
][Math.floor(Math.random() * 3)];
}
JavaScript
HTMLと外部リソースの関係
- HTMLとCSSとJavaScriptは完全に別言語だが、
HTMLの内部にCSSやJavaScriptを
記述することができる。 - また、CSSやJavaScriptを別ファイルとして
保管し、HTML上にその場所を記述することもできる。 - このように、現代のウェブサイトはHTMLだけで
完結せず、複数のリソースを取得してはじめて
ウェブページとして表示可能な状態になる。
サーバーを支える技術
Webサーバー
- TCP/IP通信は本来1対1だが、HTTPなどの通信において
主にHTMLなどのリソースを「提供する側」の
役割を持つ端末のことをサーバーと呼ぶ。- 特にWebではWebサーバーと呼ぶことが多い。
- Webサーバーの機能を実装するソフトウェアを
Webサーバーソフトウェアと呼ぶが、
これを単にサーバーと言っても通じる。 - (後者) サーバーは、OSの機能にアクセスして
TCP接続を待ち受け、HTMLを規定のフォーマット (HTTP) で
送信してくれれば、ぶっちゃけなんでもいい。
例えば1番単純なWebサーバーはC言語で次のように
実装することができる。
Webサーバーの例
#include <sys/types.h>
#include <sys/socket.h>
int main() {
struct sockaddr_in clientaddr;
socklen_t addrlen;
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
listen(listenfd, 1000000)
int client = accept(listenfd, (struct sockaddr *)&clientaddr, &addrlen);
send(client, "HTTP/1.1 200 OK\r\n\r\nHello!", 21);
shutdown(client, SHUT_WR);
close(client);
}
サーバーソフトウェア/
フレームワーク
- しかし毎回こういった接続処理や
コネクションの管理を記述するのは大変なので、
特定の目的に用いられるサーバーソフトウェアや
サーバーフレームワークが世の中には多く
実装されており、
Webプログラミングではそれらを用いて
サーバーの機能を実装することが多い。
ファイルサーバー
- 複雑な処理をせず、クライアントの要求に対し
固定されたファイルを送信するだけのサーバー- このような要求の内容によって変化しない
コンテンツのことを静的コンテンツと呼ぶ。
- このような要求の内容によって変化しない
- 複雑な処理をしないと言ったが、現在では
ユーザー認証・速度制御・CGI・プロキシなど
複雑な処理を同時に行うことも多い。 - 著名なソフトウェア
- Apache (アパッチ)
- 古き良きファイルサーバー
- NginX (エンジンエックス)
- ApacheのC10K問題に対処するために開発された
- Apache (アパッチ)
PHP
- Webサーバーを実装するために開発された
プログラミング言語。 - 埋め込み記法によってWebアプリケーションを
直感的に記述できるのが売り。 - 現在では複雑化するWeb環境に対応できておらず
若干レガシーに感じられることが多いか
<?php session_start(); ?>
<!DOCTYPE html>
<title>PHP Test</title>
<?php if (date('D') == Fri) { ?>
<p>Happy Friday!!!!!</p>
<?php } else { ?>
<p>I'm unhappy</p>
<?php } ?>
金曜日なら「Happy Friday」と表示するWebサイトを実装したPHPコード
その他の言語
- C, Python, Ruby, Perl など、いずれも
汎用的に使えるプログラミング言語だが、
Webサーバーを実装するためにもよく用いられる。- 特に最近ではJavaScriptの汎用実行環境である
Node.jsを用いてサーバーが実装されるなど、
JavaScriptのクライアントからサーバーへの
移動現象 (?) が起きている。
- 特に最近ではJavaScriptの汎用実行環境である
- これらの言語を使用してサーバーの開発を行う際には、
言語の標準ライブラリや外部ライブラリ、
そしてWebサーバー用のフレームワークを
用いることが多い。 - その中でも特によく用いられるものについて解説する。
Ruby on Rails
- Rubyという言語を世界に広げた一大役者。
現在ではRubyの用途の半分以上を占めており、
RoRと略されることも。 - MVCというデザインパターンを採用した
Webフレームワークの一種であり、
Railsの「流儀」に則ってビジネスロジックを
書くことによって
簡潔かつ拡張性の高いWeb開発を行うことができる。- この「Railsの流儀に則る」ということを
on the rail (レールに乗る) と表現することも
- この「Railsの流儀に則る」ということを
- デザインパターンとかビジネスロジックっていうのは
第2回で話すよ、たぶん
その他、よく使われる
Webフレームワークなど
- PHP
- CakePHP
- Laravel
- Python
- Django
- Pyramid
- Ruby
- Sinatra
- Ruby on Rails
- Node.js
- Express.js
- Fastify
最新技術動向
Webブラウザの複雑化
- Webブラウザの進化によって、
これまでサーバーで処理していたこと、
デスクトップアプリケーションでないとできなかったことが、
ブラウザ上でできるようになってきている- PWA
- ブラウザへのインストール
- デスクトップ通知
- キャッシュ制御
- 各種WebAPIの拡充
- センサーへのアクセス
- カメラ
- WebVR
- PWA
- 同時にセキュリティへの懸念も増大している。
詳しくはつばめ先生に聞いてみよう。
通信のリアルタイム化
- これまでリクエストを送って返ってきて
そのまま⋯⋯という流れだったWebが、
どんどんリアルタイム通信に寄せられていっている- WebRTC
- P2Pの映像・音声配信
- WebSocket
- ソケット通信に似た、
サーバーとのリアルタイム通信
- ソケット通信に似た、
- WebPush
- サーバーからいつでもプッシュ通知を送る
- WebRTC
JavaScriptの進化
- JavaScriptは、当初大規模な利用を想定されておらず
言語として明らかに劣っている部分がたくさんあった - しかしその後多くの協議を経て言語自体に
多くの改善が加えられ、今では新しい言語と
比較しても申し分ない完成度の言語となっている。 - 使用によって標準化されたJavaScriptのことを
ECMAScriptと呼び、現在では1年おきに新バージョンが
リリースされている。 - ECMAScriptの策定手順が他の言語と大きく違うのは、
コミュニティベースの提案や改善が多く取り入れられ
仕様策定前にパブリックなコメントが
多く寄せられる点である。そのため変な仕様や
変な挙動が入りにくいという利点がある。
複雑化するクライアントサイドに
対処するためのライブラリ
- ブラウザの進化により
これまでのデスクトップアプリケーションのような
複雑な機能を実装することができるようになるとともに
フロントエンドのコードがどんどんと複雑化していった。 - 近年これらに対応するためのライブラリが多く発明され、
さまざまな技術が注目を浴びている- 仮想DOMとデータバインディング
- React, Vue, Angular...
- ステート管理
- Redux, Flux, Vuex...
- 変数のイミュータブル化
- Immutable.js
- 仮想DOMとデータバインディング
JavaScriptを記述する
環境の変化
- AltJS
- TypeScript
- Rust
- リソースのコンパイルと一元化
- Browserify
- Webpack
- Rollup
実習
- HTMLを書いてみよう
- MDNでいろんなタグを調べて好きに書いてみよう
-
https://developer.mozilla.org/ja/docs/Web/HTML/Element
- <a>
- <strong>
- <ul>, <ol>, <li>
- <img>
- <ruby>
おわり
初心者分科会 Web特講 第1回 Webの仕組みを理解する
By Koki Takahashi
初心者分科会 Web特講 第1回 Webの仕組みを理解する
2019-08-25 2016年度TSG第1回Web分科会
- 1,593