📄 ネットワークプロトコル
1. Please describe TCP、HTTP、HTTPS、WebSocket
-
TCP(伝送制御プロトコル): TCP は信頼性の高いコネクション型プロトコルで、インターネット上の2台のコンピュータ間でデータを確実に伝送するために使用されます。データパケットの順序と信頼性を保証します。つまり、ネットワーク状況に関わらず、データは完全な状態で目的地に到達します。
-
HTTP(ハイパーテキスト転送プロトコル): HTTP はハイパーテキスト(つまりウェブページ)を配信するためのプロトコルです。TCP プロトコルの上に構築されており、ブラウザとサーバーが通信する方法を提供します。HTTP はステートレスであり、サーバーはユーザーに関する情報を保持しません。
-
HTTPS(安全なハイパーテキスト転送プロトコル): HTTPS は HTTP の安全なバージョンです。SSL/TLS プロトコルを使用して HTTP データ伝送を暗号化し、交換されるデータの安全性を保護し、中間者攻撃を防止することで、データのプライバシーと整合性を確保します。
-
WebSocket: WebSocket プロトコルは、クライアントとサーバー間に永続的な接続を確立する方法を提供し、接続確立後に双方がリアルタイムの双方向データ伝送を行えるようにします。これは従来の HTTP リクエストとは異なり、従来の HTTP リクエストでは各伝送ごとに新しい接続を確立する必要があります。WebSocket はリアルタイム通信や高速なデータ更新が必要なアプリケーションに適しています。
2. What is Three Way Handshake?
スリーウェイハンドシェイクとは、TCP/IP ネットワークにおいて、サーバー側とクライアント側の間で接続を確立するプロセスを指します。このプロセスでは3つのステップを経て、双方の受信能力と送信能力が正常であることを確認し、同時に初期シーケンス番号(ISN)を通じてデータの同期と安全性を確保します。
TCP Message Type
ステップを理解する前に、各タイプのメッセージの主な機能を理解する必要があります。
| Message | Description |
|---|---|
| SYN | 接続の開始と確立に使用され、デバイス間のシーケンス番号の同期にも使用 |
| ACK | 相手方に SYN の受信を確認するために使用 |
| SYN-ACK | 同期確認、自身の SYN を発行すると同時に ACK を送信 |
| FIN | 接続の終了 |
Steps
- クライアント側がサーバー側との接続を開始し、SYN メッセージを送信して、通信を開始する準備ができていることと、送信するシーケンス番号を通知します。
- サーバー側が SYN メッセージを受信した後、クライアント側にレスポンスを準備します。受信した SYN シーケンス番号に +1 して ACK で返送し、同時にサーバー側自身の SYN メッセージも送信します。
- クライアント側がサーバー側のレスポンスを確認し、双方が安定した接続を確立して、データ伝送を開始します。
Example
Host A がサーバーに TCP SYN データを送信します。その中にはランダムなシーケンス番号が含まれ、ここでは 1000 と仮定します。
Host A ===(SYN=1000)===> Server
Server は Host A から受け取ったシーケンス番号に対してレスポンスを返す必要があるため、シーケンス番号 + 1 とし、同時に自身の SYN を送信します。
Host A <===(SYN=2000 ACK=1001)=== Server
Host A は Server の SYN を受信した後、確認のシーケンス番号を返す必要があるため、Server から受け取ったシーケンス番号 + 1 を送信します。
Host A ===(ACK=2001)===> Server
2回のハンドシェイクだけで十分か?
- スリーウェイハンドシェイクの目的は、クライアントとサーバー双方の送受信能力が正常であることを確認することです。2回のハンドシェイクだけでは、サーバーがクライアントの受信能力を判断できなくなります。
- 第3のハンドシェイクがないため、クライアントはサーバーのシーケンス番号を受け取れず、確認の送信もできなくなり、データの安全性に疑問が生じる可能性があります。
- 弱いネットワーク環境では、データの到着時間に差異が生じる可能性があります。新旧のデータの到着順序が乱れた場合、第3のハンドシェイクの SYN 確認なしに接続を確立すると、ネットワークエラーが発生する可能性があります。
ISN とは?
ISN の正式名称は Initial Sequence Number で、受信側に自身のデータ送信時のシーケンス番号を伝えるために使用されます。これはランダムに動的生成されるシーケンス番号で、第三者の侵入時に推測されることを防ぎ、メッセージの偽造を防止します。
スリーウェイハンドシェイクで、いつからデータ伝送が可能か?
第1回と第2回のハンドシェイクの目的は双方の送受信能力を確認することであり、データの伝送はできません。第1回のハンドシェイクでデータ伝送が可能だと仮定すると、悪意のある第三者が大量の偽データを伝送し、サーバー側のメモリ空間を消費してキャッシュさせ、攻撃の機会を与える可能性があります。
第3回のハンドシェイク時のみ、双方が同期確認を完了し、接続状態にあるため、データの伝送が許可されます。
Reference
3. Please describe the HTTP caching mechanism
HTTP キャッシュメカニズムは、HTTP プロトコルにおいてウェブデータを一時的に保存(または「キャッシュ」)する技術で、サーバーの負荷軽減、遅延の低減、ウェブページの読み込み速度の向上を目的としています。主なキャッシュ戦略には以下のものがあります:
-
強制キャッシュ(Freshness):
ExpiresまたはCache-Control: max-ageレスポンスヘッダーを設定することで、データが特定の期間内は新鮮であるとみなし、クライアント側はサーバーに確認せずに直接使用できます。 -
検証キャッシュ(Validation):
Last-ModifiedとETagレスポンスヘッダーを使用して、クライアント側がサーバーに条件付きリクエストを送信し、データが未変更であれば 304(Not Modified)ステータスコードを返して、ローカルキャッシュデータの使用を許可します。 -
ネゴシエーションキャッシュ(Negotiation):
Varyレスポンスヘッダーに依存する方式で、サーバーがクライアント側のリクエスト(Accept-Languageなど)に基づいて、異なるバージョンのキャッシュコンテンツを提供するかどうかを決定します。 -
キャッシュなし(No-store):
Cache-Control: no-storeが設定されている場合、データはキャッシュされるべきではなく、毎回のリクエストでサーバーから最新のデータを取得する必要があります。
キャッシュ戦略の選択は、データの種類や更新頻度などの要因によって決定されます。効果的なキャッシュ戦略は、ウェブアプリケーションのパフォーマンスを大幅に向上させることができます。
Service Worker
個人的な経験として、Web App に PWA を設定した後、基本的なスタイルやロゴ、さらにはオフライン用の offline.html を準備して service-worker.js に登録しておくことで、ユーザーがオフライン状態であっても、このキャッシュメカニズムを通じて現在のウェブサイトやネットワークの状態を把握でき、一定レベルのユーザー体験を維持できます。