はじめに
本記事は、Coursera の Network Systems Foundations モジュール「Link Layer」で学んだ内容を整理した学習記録です。
1. DNS(Domain Name System)
DNS の役割
- IP アドレスは人間にとって覚えにくい
例:142.250.69.206→youtube.com - また大規模サービスは 1 つの IP ではなく複数サーバを持つ
→ DNS は「ホスト名 → IP アドレス」を解決する分散データベース
DNS は階層構造(例:cs.princeton.edu)
edu (トップレベルドメイン)
└── princeton (ドメイン)
└── cs (サブドメイン)
DNS 問い合わせの流れ(キャッシュなし)
[ブラウザ]
↓
[ローカル DNS(PC / ルーター / ISP)]
↓
[Root DNS]
↓
[TLD DNS (.edu など)]
↓
[権威 DNS (princeton.edu)]
↓
IP アドレス返却
Resource Record(RR)
(name, value, type, TTL)
| Type | Name | Value | 用途 |
|---|---|---|---|
| A | ホスト名 | IP アドレス | 最終回答 |
| NS | ドメイン | 権威 DNS 名 | 「次はここに聞いて」 |
→ 途中の応答は NS、最終応答が A
Root DNS
- 13 系列存在(A〜M)
AnyCast とは?
-
複数のサーバーが同じ IP アドレスを共有し、BGP により最も近いものへルーティングされる仕組み
-
DNS Root・CDN・Google Public DNS などで採用
-
地理的に近い・ネットワーク的に近い経路が自動で選ばれる
2. ソケットプログラミング(Transport 層との橋渡し)
ソケットとは?
- アプリケーションと OS ネットワーク機能の境界インターフェース
- fetch() / axios() / curl などが内部で利用
サーバーのフロー
socket() ソケット作成
bind() ポート番号を OS に登録
listen() 接続待ち
accept() 接続受付(ここでブロック)
send/recv データ通信
close() ソケット終了
クライアントのフロー
socket()
connect() → ここで 3-way handshake
send/recv
close()
なぜ client も server も socket() する?
- 各プロセスは通信の“入り口”としてソケットが必要
- 接続されると OS 内部で 新しい接続専用ソケット が生成される
→accept()が返すのは “通信専用の別ソケット”
ポート番号はいつ決まる?
- bind() 時点
- まだ通信は開始されていない(connect 以前)
- 開発環境では 3000 / 5000 / 8080 など衝突しない番号を使う
3. HTTP(アプリケーション層の代表プロトコル)
特徴
- リクエスト → レスポンス 形式
- サーバーは原則 ステートレス
HTTP メッセージ形式
例:リクエスト
GET / HTTP/1.1
Host: example.com
例:レスポンス
HTTP/1.1 200 OK
Content-Type: text/html
<html>...</html>
HTTP バージョン比較
| Version | 特徴 |
|---|---|
| HTTP/1.0 | リクエストごとに TCP 接続 |
| HTTP/1.1 | Persistent Connection(接続再利用) |
| HTTP/2 | 多重化(大量の並列リクエスト高速化) |
| HTTP/3 | TCP ではなく QUIC を使用 |
4. gRPC
gRPC とは?
- 高速な RPC(Remote Procedure Call)フレームワーク
- IDL(Interface Definition Language)として Protocol Buffers
- HTTP/2 上で動作し高速・軽量・型安全
通信構造
Client → Stub → (HTTP/2 + Protobuf) → Stub → Server
.proto ファイルの例
service Echo {
rpc echo(Message) returns (Message);
}
message Message {
string message = 1;
}
JSON vs Protobuf
| 特性 | JSON | Protobuf |
|---|---|---|
| 形式 | 文字列 | バイナリ |
| サイズ | 大きい | 小さい |
| パース | 遅い | 速い |
| 人間可読性 | あり | なし(ただし効率的) |
参考文献
- Coursera:Network Systems Foundations