ステートフルとステートレス
セッションの状態の話
セッションとは:通信における開始から終了まで(ログインからログアウトまでを指すことが多い)
https://wa3.i-3-i.info/word1791.html
トランザクションの話も出てくる
トランザクションとは:「商品を渡して、代金を受け取る」のように「ここからここまでワンセット」になっている処理のこと(DBとかでよく耳にした)
https://wa3.i-3-i.info/word16325.html
ステートフル
サーバがクライアントのセッションの状態を保持する
セッションの状態によってリクエストに対するレスポンスが変わる
何度も繰り返し使うもの
毎回同じサーバを使ってユーザーの要求を処理する
ウィンドウの場所、ユーザー設定、最近のアクティビティなどを追跡する
例:オンラインバンキング, 電子メール
ステートフルなプロトコル(何を保持しているか?どんなコネクションかに注目)
FTP, TCP, BGP, OSPF, EIGRP, SMTP, SSH
ステートレス
サーバがクライアントのセッションの状態を保持しない
セッションの状態によらずリクエストに対するレスポンスが変わらない
過去のトランザクションに関する情報や参照は保持されない
単一の要求に対して単一の応答をする
ステートレスなプロトコル
HTTP, UDP, IP, DNS (UDPの性質を使っているこれらもたぶんそうDHCP, NTP, SNMP)
HTTP
HTTPは状態を保持できないからセッション管理でユーザーを特定しよう!みたいな話になる(cookieとかの話ここ)
「HTTPはステートレスだからセッション管理が必要」を詳しく解説 | OFFICE54
UDP
コネクションが確立しているかどうかを確認する状態(ステート)がない(逆に3ウェイハンドシェイクをするTCPはステートフル)
参考
https://www.redhat.com/ja/topics/cloud-native-apps/stateful-vs-stateless
TCPとUDPの違いは
TCP(Transmission Control Protocol)の特徴
- コネクション型プロトコル
通信相手とコネクションを確立することで相手に通信が届いていることを確認させ、コネクションを確立させる。
※TCPにおけて使用されるコネクションの確立のことを3ウェイハンドシェイクという - (コネクションを確立するため)信頼性が高い
事前にコネクションを確立し、双方で送受信できていることを都度確認している。 - 制御機能を備えている
ネットワークの状況によっては正しくデータが伝送されないケースがある。そのためウィンドウ制御やセグメントの再送制御、送信するセグメントの量の制御などが用意されている - 重複を排除する
重複を排除することでデータが1つであることを保証する
TCPのサーバポートの例
HTTP:TCP80番ポート
SMTP:TCP25番ポート
TCPが使われているサービス
- Web通信
- メール通信
- ファイル転送
後で見る
TCP vs RTP:何故RTPが必要なのか?:Geekなぺーじ
第13回 データグラム通信を実現するUDPプロトコル:基礎から学ぶWindowsネットワーク(1/4 ページ) - @IT
C言語-ソケットプログラミング_UDPソケット CapmNetwork
トランスポート層の仕事 - ネットワークエンジニアを目指して
UDP(User Datagram Protocol)の特徴
UDPヘッダーを付与したデータの通信単位をUDPデータグラムという
UDPのサーバポートの例
DNS:UDP53ポート
UDPが使われているサービス
TCPとUDPの主な特徴6つ|代表的なポート番号や使い分ける方法も紹介 | テックマガジン from FEnetインフラ
UDPヘッダのフォーマットとサイズの基本 | IT情報サイト ”ITアベイラボ”
OSとは何か説明する
OSとは
複数のプログラムを同時に安定動作させ、ハードウェアコンポーネントを効率的に使えるよう抽象化するためのプログラム。
OSの構成
ブートローダ
PC起動時によびだされ、OSなどを動かす仕事をしているプログラム。
PCの電源を入れる→BIOS起動→ブートローダ起動→OS起動
カーネル
ハードウェアとソフトウェアをつなぐソフトウェア
- リソース管理
- プロセス管理
アプリケーションの実行を許可し、ハードウェア抽象化などの機能でサポートする - メモリ管理
ユーザープロセスの要求に応じて安全なメモリアクセスを提供 - デバイス管理
ドライバが物理的にデバイスにアクセスするための入出力ポートやメモリ空間を用意する - システムコール
デーモン
Windowsでは「サービス」とよばれる
利用者の操作とは無関係に処理を行うバックグラウンドプロセスの一種で、別のプログラムや機器、通信相手など外部からの要求を受け付けて処理を実行したり、あらかじめ設定されたタイミングで自律的に特定の処理を実行したりする。
systemd, syslogd, tcpd, httpd, sshdなど
シェル
ユーザからの入力をPCに伝えるプログラム
ユーザが入力したコマンドをシェルが解釈しカーネルに伝え、
カーネルはシェルから伝達された要求に応えてプログラムの操作を行い、その結果をシェルに返す。
返ってきた結果をシェルが解釈し、ユーザ側に出力する
-----
カーネル←シェル←ユーザ
カーネル→シェル→ユーザ
-----
デスクトップ環境
ツールバー、ファイル、背景画像などから成り立つ。
デスクトップ環境のおかげで画面表示でのPC操作環境が快適に行える。
アプリケーション
様々な情報やプログラミングを組み合わせ、OSの機能を拡張していく事ができ、PC操作が快適に使えるようにしてくれるようにプログラムされたソフトウェア
OSの機能
- タスク管理
- メモリ管理
- ファイル管理
- 周辺機器の管理
- APIの提供
参考
PCの電源を入れたら何が起こるのか
- PCの電源スイッチを入れる
- マザーボード上のCPUが動き、ROMの中にあるBIOSというプログラムが動く
- BIOSがキーボード・HDD・グラフィックボードなどを初期化する(POST(Power-On Self-Test))
- ハードディスクからOSを起動するプログラムを取り出してRAM(メインメモリ(主記憶装置(作業用の領域)))にロードする(ブート・ストラップ)
- CPUが「メイン・メモリ」からWindowsのプログラム・データの処理命令を<フェッチ>して(=取り出して)、その命令内容をデコードする(解釈する(CPUが理解できる機械語))
- CPUがデコードした命令内容を実行していくことで、プログラム(Windows OS)が開始される
OSが立ち上がるまでの処理の流れ
- 演算・制御装置である「CPU」が、Windows OSのプログラム・データ(=ソフトウェア)を、「ハード・ディスク」から取得して、作業用の「メイン・メモリ」の上にロード(=展開)する
- CPUが「メイン・メモリ」からWindowsのプログラム・データの処理命令をフェッチして(取り出して)、その命令内容をデコードする(解釈する(CPUが理解できる機械語))
- CPUがデコードした命令内容を<実行>していくことで、プログラム(=Windows OS)が開始される
https://atmarkit.itmedia.co.jp/fdotnet/dotnetwork/dotnetwork01/dotnetwork01_02.html#runprogram
CPUの基本動作
- フェッチ
- メモリから命令を読み込む
- デコード
- 読み込んだ内容を解釈する
- 実行
- 命令に従って演算を行う
http://www2.kobe-u.ac.jp/~tnishida/course/2012/IS/3.CPU.pdf
メモ
BIOS(バイオス):「Basic Input Output System」の略。パソコンのマザーボードに搭載されており、電源を入れて最初に起動するプログラムです。コンピューター内を初期化し、接続されているディスプレイやキーボードなどの周辺機器を読み込んで利用できる状態に整え、それから外部記憶装置(ストレージ)からOSを実行します。
ブートまたは ブートストラップ:コンピュータの電源を入れてからOSが起動するまでの処理の流れ
ブートローダ:このブート処理を行うソフトウェアのことである。
ROMは「ブート・プログラム」と「ROMローダ・ルーチン」というプログラムが記憶されている。
ブート・プログラム:マザーボード上のチップやメモリ、接続されている周辺装置などを初期化する。
ROMローダ・ルーチン:ディスク装置の先頭セクタを読み込む処理をする。
参考
http://www.cs.reitaku-u.ac.jp/infosci/os-kiso/os2003/text02-1.pdf
プロキシとは何か説明する
プロキシとは何か
インターネットを接続する際にネットワークの内部と外部をつなぐ代理をする。
フォワードプロキシ
クライアントとWebサーバの間に位置し、伝言する役割。(クライアント側に位置する)
クライアントはフォワードプロキシに要求し、フォワードプロキシがWebサーバに要求する。
フォワードプロキシはWebページからページを受け取りクライアントへ返す。
メリット1:Webサーバにアクセスしたのが誰かが分からない
フォワードプロキシありとなしを比較する。
フォワードプロキシなしの場合、WebサーバはクライアントPCの情報が分かる。
フォワードプロキシありの場合、Webサーバはプロキシサーバの情報が分かる。
-----
フォワードプロキシなし
クライアント → Webサーバ
クライアント ← Webサーバ
フォワードプロキシあり
クライアント → プロキシサーバ →→→ Webサーバ
クライアント ← プロキシサーバ ←←← Webサーバ
-----
例えば、悪意のあるWebサイトがアクセス元である私たちの情報がばれてしまうのを防ぐことができます。
メリット2:接続先の制限
フォワードプロキシありとなしを比較する。
フォワードプロキシなしの場合、悪意のあるサイトへアクセスできる
フォワードプロキシありの場合、悪意のあるサイトへアクセスを防止する
フォワードプロキシなし
クライアント → 悪意のあるサイト
フォワードプロキシあり
クライアント → プロキシサーバ ✖→→→ 悪意のあるサイト
-----
リバースプロキシ
クライアントとWebサーバの間に位置する。(Webサーバ側に位置する)
Webサーバの負荷分散が役割。
-----
クライアント →→→ リバースプロキシサーバ → WebサーバA
→ WebサーバA(複製)
-----
キャッシュサーバ
訪問したWebページを一時的に保持することで、応答時間が速くなる。
ログを残すことができる。
Webサーバへの負荷を減らせる。
再度読んで理解したい↓。
ログを取得できる
プロキシの設定
PCが使用するプロキシサーバを設定することができる。
目的
社内のTeamsでSharePointが見れない方がいた。
wifiやVPNで社内のネットワークにつなぐと見れるが社内のランケーブルでつなぐと見れなかった。
調査したところプロキシの設定がダメだったらしい。
参考文献
Webブラウザでwww.example.comを入力しWebサイトが表示されるまでの流れを説明する
ブラウザにwww.example.comを打ち込んだとき、裏側では何が行われているか
- クライアントがクライアントPCのWebブラウザにURLを入力する
- URLに含まれるドメインをDNSサーバに問い合わせる
- DNSサーバでドメインからIPアドレスを特定する
- DNSサーバからIPアドレスが送信される
- 取得したIPアドレスのWebサーバにデータを要求
- Webサーバは要求した内容に応じて、保存しているコンテンツ(HTML,CSS,画像など)を返す
- Webサーバから返されたデータをWebブラウザで表示する
ブラウザからDNSサーバに問い合わせる前にやっていること
- クライアントPCがブラウザのキャッシュに「www.example.com」のIPアドレスが残っているか調べに行く
- ブラウザにキャッシュが残っていない場合はhostsファイルを調べにいく
Windows:C:\Windows\System32\drivers\etc\hosts
CentOS:/etc/hosts
DNSサーバに問い合わせてIPアドレスを受け取るまでを深堀する
DNSサーバに問い合わせてwww.example.comのIPアドレスを取得する順番
- クライアントPCがDNSキャッシュサーバに「www.example.com」のIPアドレスは何か問い合わせをする
- ブラウザがクライアントPCのOSとして備わっている機能のスタブリゾルバを呼び出す
- スタブリゾルバがDNSのキャッシュサーバに「www.example.com」のIPアドレスは何か問い合わせをする
- キャッシュサーバがルートサーバへ「www.example.com」のIPアドレスは何か問い合わせをする
- ルートサーバがキャッシュサーバへ「com」の情報を管理するDNSサーバのいずれか(a.dns.com, b.dns.com, ...)に問い合わせるよう回答する
- キャッシュサーバが回答の中から1つ選んだ「com」のDNSサーバに「www.example.com」のIPアドレスは何か問い合わせをする
- 「com」のDNSサーバはキャッシュサーバに「example.com」のDNSサーバの情報を回答する
- キャッシュサーバが回答の中から1つ選んだ「example.com」のDNSサーバに「www.example.com」のIPアドレスは何か問い合わせをする
- 「example.com」のDNSサーバはキャッシュサーバに「www.example.com」のIPアドレスを回答する
- キャッシュサーバはクライアントPCにIPアドレスの情報を回答する
JPNICの記事で紹介している「名前解決の仕組み」が分かりやすい
キャッシュサーバがすでに「www.example.com」のIPアドレスを得ている場合(DNSサーバからIPアドレスを得た場合)
【図解】ドメインとは?をわかりやすく解説します - カゴヤのサーバー研究室
キャッシュを使う
クライアントPCがすでにwww.example.jpのIPアドレス情報を取得している場合、そのIPアドレスを用いてWebサーバにデータを要求する
キャッシュサーバがwww.example.jpのIPアドレス情報を取得している場合、クライアントPCはキャッシュサーバに対して問合せし、IPアドレスを取得する
WebブラウザとWebサーバとのやり取りを深堀する
- WebブラウザがWebサーバに対してTCPのコネクションを確立する
- Webブラウザが該当するIPアドレスのWebサーバにHTTPリクエストを送信してWebページのデータを要求
- Webサーバが受信したHTTPリクエストを解析
- WebサーバがWebブラウザに要求されたデータをHTTPレスポンスとして送信
- Webブラウザが受信したデータを解析してWebページとして表示
TCPのコネクション(3 way handshake)
コネクションを確立する。
- 接続元が接続先へ通信路を確保するために、データ転送の許可要求を出す「SYN(シン):1, ACK(アック):0」のパケット
- 接続先が接続元に許可と許可要求を出す「SYN:1, ACK:1」のパケット
- 接続元が接続先に許可を出す「SYN:0, ACK:1」のパケット
図にすると以下のようになる。
-----
ノード1 ノード2
CLOSED LISTEN
---SYN-->
SYN_SENT
ESTABLISHED <-ACK+SYN--
SYN_RCV
---ACK--> ESTABLISHED
-----
コマンドでTCPコネクションを確立すると以下のようになる。
sudo tcpdump host www.example.com and port 80
このやり取りをすますと、PC上でESTABLISHEDという状態になる。
ネットワークの接続一覧は「netstat」コマンドで表示できる。
https://wa3.i-3-i.info/word15428.html
※終了するときはコネクションを切断する
TCPのフラグ(コントロールフラグ)
URG(Urgent):緊急に処理すべきデータが含まれている
ACK(Acknowledgement):確認応答番号のフィールドが有効であること
PSH(Push):受信したデータをバッファリングせず、アプリケーションに渡す
RST(Reset):コネクションが強制的に切断されること
SYN(Synchronize):コネクションの確立を要求する
FIN(Fin):コネクションの正常終了を要求する
Webサーバとのやりとりを深堀する
TCPコネクションを確立する
通常はHTTPのウェルノウンポートの80番(HTTPSであれば443番)を指定し接続を要求する
HTTP接続が可能になったら、WebサーバはURLで指定されたファイルなどのリソースを取得しクライアントに返信する
メモ
URLとドメイン
ホスト名:www
ドメイン名:example.co.jp
FQDN:www.example.co.jp
jp:トップレベルドメイン
co:セカンドレベルドメイン
example:サードレベルドメイン
ドメイン名はどの部分?|ドメイン基礎知識|Zenlogic - 株式会社IDCフロンティアのレンタルサーバー
ホスト名とIPアドレスの例
ホスト名:www.google.co.jp
IPアドレス:172.217.161.67
SSL/TLSとは何か
- インターネット上でのやりとりを暗号化するプロトコル
- OSI参照モデルのセッション層に位置し、それより以下の層は保護しない
- SSLは他のプロトコルと組み合わせて使用する
- SSLの脆弱性が修正された新しいものがTLS
SSLで使用する技術
ハイブリッド暗号方式
盗聴対策。
共通鍵のデメリットである鍵の配布を公開鍵暗号化方式で実施。
- Webサーバは公開鍵と秘密鍵を作成
- Webサーバは公開鍵を公開し、秘密鍵を保管
- Webブラウザは共通鍵のもとを公開鍵で暗号化して送る
- Webサーバは共通鍵のもとを秘密鍵で復号
- WebサーバとWebブラウザは共通鍵のもとから共通鍵を生成
- Webブラウザはアプリケーションデータを共通鍵で暗号化
- Webサーバはアプリケーションデータを共通鍵で復号
メッセージ認証コード(MAC)
改ざん対策。
データとMAC鍵(共通鍵)を比較する。
ハッシュ関数に共通鍵の要素が加わるため、改ざんの検知と相手の認証をする。
ディジタル証明書
なりすましや否認対策。
相手が通信したい相手であることを保証する。
SSL通信の種類
他のプロトコルと組み合わせて使用することでプロトコルでの通信を保護する。
TLSハンドシェイク
・・・後日、またまとめたいと思います。