TCPとOSの基本的な話と、TCPだけではわからない因果の伝搬モデルについて話をした。同期・非同期処理、TCPの双方向通信。 情報通信のために、ネットワークは7層のOSI参照モデル(実際は5層のTCP/IPモデル)に基づいて階層分けして設計される。3層のネットワーク層はIPアドレス同士の通信を担い、4層のトランスポート層は任意のIPアドレスを付与されたマシン上に公開されたポートに対する通信を担う。LinuxなどのOSではポート(80番)とサーバプロセス(httpd)が紐付けられ、トランスポート通信によりプロセス同士が通信可能となる。そしてこれらはOS共通のカーネル機能をアプリケーションが呼び出すことで実現される。 TCPはトランスポート層通信の1実装であり、パケット単位の通信ではなくコネクション(平たく言うと送信元IPアドレス、送信元ポート番号、送信先IPアドレス、送信先ポート番号の組)という概念を導入して通信する。TCPでは、コネクションを開始する側(Active Open、curlなど)と受け取る側(Passive Open、httpdなど)に分けられ、コネクションを確立した後は双方向にデータを通信できる。TCPではどんなメッセージでも通信可能だが、このメッセージ通信にルールを設けるのがアプリケーション層のプロトコルである。HTTPでは、通常Active Open側が”GET / HTTP1.1\n”のようなリクエストメッセージをPassive Open側に投げて、”HTTP/1.1 200OK\n”のようなレスポンスメッセージを返信する。アプリケーション層のプロトコルは通常はOSのカーネルランドではなくユーザランドつまり各プロセス内で実装される。例えば、httpdであればHTTPメッセージの構築やら解析はカーネルではなくhttpdプロセスが担う。 ![[Copy of 2020 07 14 Microservices%E3%81%AE%E5%9B%A0%E6%9E%9C%E6%8E%A8%E8%AB%96%E8%AB%96%E6%96%87%E3%83%BBTCP%E3%81%AE%E5%9B%A0%E6%9E%9C%E4%BC%9D%E6%90%AC/ScreenShot_2020-07-14_at_8.40.20_PM.png]] - 上側のHost Cが死んだ場合、Host BとHost Cにエラーが伝搬されるようにみえる。TCPレベルでの接続ができないという意味では正しい。しかし、Host Cの異常の種類が、TCP接続には支障はないがアプリケーション層ではエラーがあるという状況もありえる。 - 下側のHost Bがキューの動きをするとして、Host AからHost Bへジョブを挿入して、Host Cはキューからジョブを取得する。Host Cで異常が起きても、非同期処理なのでHost Aには伝搬しない。これそもそもHost B → Host Cに矢印書いてるけど、実際のメッセージキューシステムだとHost C(コンシューマ)がHost Bへ接続する気がする。