1. 👋 はじめに
前回の基礎編では、プロトコルとポート番号の基本・HTTP/HTTPS・SSH・FTP・メール系プロトコル・DNSを学びました。
今回は 応用編 として、より深い内容を解説します!
基礎編で「TCPとUDPの違いは応用編で!」と伏線を張っていましたね。
いよいよその謎を解き明かします🎉
この記事を読めば:
- ✅ TCPとUDPの違いがわかる
- ✅ OSI参照モデルとプロトコルの関係がわかる
- ✅ 開発でよく使うポート番号がわかる
- ✅ ファイアウォールとポート開放の仕組みがわかる
- ✅ ポートスキャンとセキュリティの基礎がわかる
2. 🔄 TCPとUDPの違い
まず「トランスポート層」を理解しよう
TCP と UDP は「データをどうやって届けるか」を定めたプロトコルです。
どちらもインターネット通信の土台となる重要な存在です。
TCP(Transmission Control Protocol)
TCPとは「確実にデータを届けることを保証するプロトコル」です。
【TCPの特徴:手紙の配達記録のようなもの】
送信側 受信側
│ │
│──── ① 接続要求(SYN)────────────>│
│<── ② 接続確認(SYN-ACK)──────────│
│──── ③ 接続完了(ACK)────────────>│
│ │
│ ← 3ウェイハンドシェイク完了 → │
│ │
│──── ④ データ送信 ────────────────>│
│<── ⑤ 受信確認(ACK)──────────────│
│──── ⑥ 届いてないデータを再送 ─────>│
│ │
3ウェイハンドシェイクとは?
TCPが通信を始める前に行う「接続確立の手順」です。
① SYN :「通信してもいいですか?」
② SYN-ACK :「いいですよ!あなたも受け取れますか?」
③ ACK :「はい、受け取れます!では始めましょう」
→ この3ステップで「確実に通信できる」ことを確認してからデータを送る
💡 フラグ名の正式な意味
フラグ 正式名称 意味 SYNSynchronize(同期) 接続リクエスト「通信を同期しよう」 SYN-ACKSynchronize-Acknowledge 接続許可&確認「了解、こちらも同期しよう」 ACKAcknowledge(確認応答) 確認完了「了解、通信開始!」
ACKは「確認応答」の略で、データを受け取ったことを相手に伝えるフラグです。
Wiresharkなどのログ解析ツールでも、このフラグ名がそのまま表示されます。
| TCPの特徴 | 説明 |
|---|---|
| ✅ 信頼性が高い | データが届いたか確認する(ACK) |
| ✅ 順序を保証 | バラバラに届いても正しい順序に並べ直す |
| ✅ 再送制御 | 届かなかったデータを自動で再送する |
| ⚠️ 速度は遅め | 確認作業があるため、UDPより遅い |
TCPを使う代表的なプロトコル:
HTTP/HTTPS・SSH・FTP・SMTP・POP3・IMAP
UDP(User Datagram Protocol)
UDPとは「速さを優先して、確認なしにデータを送るプロトコル」です。
【UDPの特徴:ポスティングチラシのようなもの】
送信側 受信側
│ │
│──── データを送りっぱなし ─────────>│
│──── データを送りっぱなし ─────────>│
│──── データを送りっぱなし ─────────>│
│ │
× 確認なし・再送なし・順序保証なし ×
| UDPの特徴 | 説明 |
|---|---|
| ✅ 速度が速い | 確認作業がないため高速 |
| ✅ オーバーヘッドが少ない | データ量が少なくて済む |
| ❌ 信頼性が低い | データが届かなくても再送しない |
| ❌ 順序を保証しない | 届く順番がバラバラになることがある |
UDPを使う代表的なプロトコル:
DNS・動画ストリーミング・オンラインゲーム・VoIP(音声通話)
TCPとUDPの使い分け
| TCP | UDP | |
|---|---|---|
| 信頼性 | ✅ 高い | ❌ 低い |
| 速度 | ⚠️ 遅め | ✅ 速い |
| 順序保証 | ✅ あり | ❌ なし |
| 再送制御 | ✅ あり | ❌ なし |
| 向いている用途 | Webページ・メール・ファイル転送 | 動画・音声・ゲーム・DNS |
【使い分けの考え方】
「データが確実に届くことが最優先」→ TCP
例:Webページ・ファイルダウンロード・メール
→ 1バイトでも欠けると困る!
「多少欠けてもいいから速さが最優先」→ UDP
例:ビデオ通話・オンラインゲーム・音楽ストリーミング
→ 1フレーム欠けても気にならない!遅延の方が困る!
💡 DNSがUDPを使う理由(基礎編の復習)
DNSの問い合わせは「example.comのIPは?」という小さなデータのやりとりです。
速さが最優先で・再送が必要なほど大きなデータではないため、UDPが選ばれています。
3. 🏗️ OSI参照モデル
OSI参照モデルとは?
OSI参照モデル(Open Systems Interconnection)とは
「ネットワーク通信を7つの層(レイヤー)に分けて整理したモデル」です。
バックエンドのレイヤードアーキテクチャと同じ考え方ですね!
【OSI参照モデルの7層】
┌─────────────────────────────────────────┐
│ 第7層:アプリケーション層 │<── HTTP・FTP・SMTP・DNS
│ 第6層:プレゼンテーション層 │<── 暗号化・文字コード変換(TLS)
│ 第5層:セッション層 │<── 通信セッションの管理
│ 第4層:トランスポート層 │<── TCP・UDP・ポート番号
│ 第3層:ネットワーク層 │<── IP・ルーティング
│ 第2層:データリンク層 │<── MAC アドレス・イーサネット
│ 第1層:物理層 │<── ケーブル・電気信号・Wi-Fi
└─────────────────────────────────────────┘
各層とプロトコルの対応
| 層 | 名前 | 主なプロトコル | 役割 |
|---|---|---|---|
| 第7層 | アプリケーション層 | HTTP・HTTPS・FTP・SMTP・DNS | ユーザーが直接使うサービス |
| 第6層 | プレゼンテーション層 | TLS・SSL | 暗号化・データ形式の変換 |
| 第5層 | セッション層 | TLS(一部) | 通信セッションの開始・維持・終了 |
| 第4層 | トランスポート層 | TCP・UDP | データの転送方法・ポート番号 |
| 第3層 | ネットワーク層 | IP・ICMP | IPアドレスによる経路制御 |
| 第2層 | データリンク層 | イーサネット・Wi-Fi | MACアドレスによる機器間通信 |
| 第1層 | 物理層 | - | 電気信号・光・電波の送受信 |
ポート番号はどの層に属するのか?
ポート番号は「第4層:トランスポート層」で使われます。
第3層(ネットワーク層):IPアドレス
→ 「どのコンピュータ(マンション)に届けるか」
第4層(トランスポート層):ポート番号
→ 「そのコンピュータのどのアプリ(部屋)に届けるか」
この2つの組み合わせで「宛先」が完全に決まります。
💡 「第4層まで」を理解すれば実務で十分!
エンジニアとして必ず知っておくべきは第3・4・7層です。
第1・2層はネットワークエンジニアが主に扱う領域です。
📘 コラム:実際の現場では「TCP/IPモデル(4層)」も使われる!
OSI参照モデルは「概念としての7階層」ですが、
実際のインターネット実装では TCP/IPモデル(4層) がベースになっています。
TCP/IPモデル 対応するOSI層 主なプロトコル アプリケーション層 第5〜7層 HTTP・DNS・SMTP トランスポート層 第4層 TCP・UDP インターネット層 第3層 IP ネットワークインターフェース層 第1〜2層 イーサネット・Wi-Fi 実務では「L4スイッチ」「L7ロードバランサー」のように、
OSI参照モデルの階層番号(Layer 4 / Layer 7)を使って会話することが多いです。
「L7で振り分ける」と聞いたら「アプリケーション層レベルで処理する」という意味です。
4. 🛠️ 開発でよく使うポート番号
💬 開発中の「
Address already in use」エラーの正体開発中に以下のエラーを見たことはありませんか?
Error: listen EADDRINUSE: address already in use :::3000これは「すでに別のプロセス(以前起動したアプリなど)がポート3000を使っているため、部屋(ポート)に入れない」状態です。
解決方法:
- 以前のプロセスを終了する(
Ctrl+Cやkillコマンド)- 別のポート番号(3001など)を指定して起動する
フロントエンド・バックエンド開発
| ポート番号 | 用途 | 代表的なツール |
|---|---|---|
3000 |
フロントエンド開発サーバー | React・Next.js・Node.js |
3001 |
バックエンドAPI(フロントと同時起動時) | Express・NestJS |
4000 |
GraphQL開発サーバー | Apollo Server |
5173 |
Vite開発サーバー(デフォルト) | Vite |
8000 |
バックエンド開発サーバー | Python(FastAPI・Django) |
8080 |
汎用Webサーバー | Java・Spring Boot |
8888 |
Jupyter Notebook | Python |
データベース・ミドルウェア
| ポート番号 | サービス |
|---|---|
3306 |
MySQL・MariaDB |
5432 |
PostgreSQL |
6379 |
Redis |
27017 |
MongoDB |
9200 |
Elasticsearch |
5672 |
RabbitMQ(メッセージキュー) |
よくある開発構成の例
【フロントエンド + バックエンド + DBの典型的な構成】
ブラウザ
↓ http://localhost:3000
React(ポート3000)
↓ http://localhost:8000/api/v1/users
FastAPI(ポート8000)
↓ localhost:5432
PostgreSQL(ポート5432)
5. 🔥 ファイアウォールとポート開放
ファイアウォールとは?
ファイアウォールとは「許可されていない通信をブロックする仕組み」です。
「防火壁」という意味で、不正アクセスから守ります。
【ファイアウォールのイメージ】
インターネット
↓
┌─────────────────────┐
│ 🔥 ファイアウォール │ ← ここで通信を検査
│ │
│ 許可:443(HTTPS) │ → ✅ 通す
│ 許可:22(SSH) │ → ✅ 通す
│ 拒否:それ以外 │ → ❌ ブロック
└─────────────────────┘
↓
サーバー
ポート開放とは?
ポート開放とは「ファイアウォールで特定のポートの通信を許可すること」です。
【ポート開放の例:Webサーバーを公開する場合】
必要なポート:
✅ 80 (HTTP) → 開放する
✅ 443 (HTTPS) → 開放する
✅ 22 (SSH) → 開放する(サーバー管理用)
不要なポート:
❌ 3306(MySQL) → 閉じたまま(外部からDBに直接アクセスさせない!)
❌ 6379(Redis) → 閉じたまま(同上)
❌ その他すべて → 閉じたまま
⚠️ DBのポートは絶対に外部に開放してはいけません!
MySQL(3306)やPostgreSQL(5432)を外部に公開すると、
攻撃者に直接DBにアクセスされる可能性があります。
DBへのアクセスはバックエンドアプリを経由するだけにしましょう。
💡 「じゃあローカルのGUIツールから本番DBを見たいときはどうするの?
DBeaverやTablePlusなどのGUIツールから本番DBに接続したいとき、
DBのポートを外部公開するのはNG。
実務では SSHトンネル(ポートフォワーディング) を使います。【SSHトンネルのイメージ】 ローカルPC ──SSH接続(22番)──→ サーバー ↓ サーバー内部でDBに接続(5432番) ↓ ローカルのDBクライアントから 本番DBを安全に操作できる! localhost:5432 でアクセスできるDBポートは閉じたまま・SSHトンネル経由で安全に接続するのが実務の常識です。
インバウンド・アウトバウンド
インバウンド(受信):外からサーバーへの通信
例:ユーザーが https://example.com にアクセスする
→ 443番ポートのインバウンドを許可する
アウトバウンド(送信):サーバーから外への通信
例:サーバーが外部APIを呼び出す
→ 基本的にすべて許可することが多い
6. 🔍 ポートスキャンとセキュリティ
ポートスキャンとは?
ポートスキャンとは「どのポートが開いているかを調べる行為」です。
セキュリティ診断でも使われますが、攻撃の下調べにも使われます。
【攻撃者のポートスキャンの流れ】
① ターゲットのサーバーに対して
全ポート(0〜65535)にアクセスを試みる
② 応答があったポートを記録
「22番(SSH)が開いている!」
「3306番(MySQL)が開いている!」← 危険!
③ 開いているポートの脆弱性を調べて攻撃
セキュリティのベストプラクティス
① 必要最低限のポートだけ開ける
❌ 悪い例:すべてのポートを開放
✅ 良い例:443・22・80 だけ開放(必要なものだけ)
② SSHのポートを変更する
❌ デフォルトのまま:ポート22
→ 攻撃者が自動スキャンで真っ先に狙う
✅ 別のポートに変更:ポート2222 など
→ 自動スキャンによるログの肥大化を防ぎやすくなる
⚠️ ポート変更だけではセキュリティ対策として不十分です!
ポート変更の主な効果は「自動スキャンによるログの肥大化を防ぐこと」であり、隠蔽によるセキュリティ(Security by obscurity)にすぎません。
根本的な対策は以下の2つです:
- パスワード認証を無効化する
- 公開鍵認証を必須にする
ポート変更はあくまで「補助的な対策」として位置づけましょう。
③ IP制限をかける
✅ SSHは特定のIPアドレスからのみ許可
→ 自分のIPアドレス以外はSSH接続できない
→ 万が一パスワードが漏れても不正ログインを防げる
④ 不要なサービスを停止する
✅ 使っていないポートで動くサービスは停止する
→ 攻撃面積(アタックサーフェス)を最小限にする
7. 🔒 HTTPS の裏側:TLS ハンドシェイク
TLSとは?
TLS(Transport Layer Security)とは「通信を暗号化するプロトコル」です。
HTTPSの「S(Secure)」を実現しているのがTLSです。
【TLSハンドシェイクの流れ(簡略版)】
クライアント サーバー
│ │
│── ① 対応している暗号方式を送る ──>│
│<── ② 使う暗号方式・証明書を返す ───│
│── ③ 証明書を検証 ───────────────>│
│ (本物のサーバーか確認) │
│──── ④ 暗号化キーの交換 ──────────>│
│<── ⑤ 暗号化通信開始の合図 ─────── │
│ │
│ ✅ 以降はすべて暗号化された通信 │
SSL証明書とは?
SSL証明書 = 「このサーバーは本物です」という信頼の証明書
ブラウザのアドレスバーの🔒マーク
→ SSL証明書が有効 = 通信が暗号化されている
SSL証明書がない(http://のみ)
→ ブラウザが「安全でない」と警告を表示
💡 SSL証明書は Let's Encrypt で無料取得できます!
かつてはSSL証明書の取得に費用がかかりましたが、現在は Let's Encrypt という無料の認証局を使って誰でも無料でHTTPS化できます。
8. 📋 プロトコルとポート番号 完全まとめ表
ウェルノウンポート(0〜1023)
| プロトコル | ポート | TCP/UDP | 用途 | 暗号化 |
|---|---|---|---|---|
| FTP(データ) | 20 | TCP | ファイル転送(データ) | ❌ |
| FTP(制御) | 21 | TCP | ファイル転送(制御) | ❌ |
| SSH / SFTP | 22 | TCP | リモート接続・安全なファイル転送 | ✅ |
| SMTP | 25 | TCP | サーバー間メール転送 | ❌ |
| DNS | 53 | TCP/UDP | ドメイン名解決 | △ |
| HTTP | 80 | TCP | Web通信 | ❌ |
| POP3 | 110 | TCP | メール受信(ダウンロード) | ❌ |
| IMAP | 143 | TCP | メール受信(サーバー管理) | ❌ |
| HTTPS | 443 | TCP | 暗号化Web通信 | ✅ TLS |
| SMTPS | 465 | TCP | SSL/TLSメール送信 | ✅ |
| SMTP(STARTTLS) | 587 | TCP | メールクライアント送信 | ✅ |
| IMAPS | 993 | TCP | 暗号化IMAP | ✅ |
| POP3S | 995 | TCP | 暗号化POP3 | ✅ |
登録済みポート(1024〜49151):開発でよく使うもの
| ポート | サービス | 説明 |
|---|---|---|
| 3000 | React・Next.js | フロントエンド開発サーバー |
| 3001 | Express・NestJS | バックエンドAPI |
| 3306 | MySQL・MariaDB | データベース |
| 4000 | Apollo Server | GraphQL |
| 5173 | Vite | フロントエンドビルドツール |
| 5432 | PostgreSQL | データベース |
| 6379 | Redis | インメモリDB・キャッシュ |
| 8000 | FastAPI・Django | Pythonバックエンド |
| 8080 | Spring Boot | Javaバックエンド |
| 8888 | Jupyter Notebook | Pythonデータ分析 |
| 27017 | MongoDB | NoSQL データベース |
9. 🎯 まとめ
| 概念 | 一言で言うと |
|---|---|
| 🔄 TCP | 確実にデータを届けることを保証するプロトコル |
| ⚡ UDP | 速さ優先・確認なしでデータを送るプロトコル |
| 🏗️ OSIモデル | ネットワーク通信を7層に分けて整理したモデル |
| 🔥 ファイアウォール | 許可されていない通信をブロックする仕組み |
| 🔍 ポートスキャン | どのポートが開いているかを調べる行為 |
| 🔒 TLS | HTTPSの暗号化を実現するプロトコル |
TCP vs UDP 最終まとめ
確実さが必要 → TCP
Web・メール・ファイル転送・SSH
速さが必要 → UDP
動画・音声・ゲーム・DNS
セキュリティの鉄則
① 必要なポートだけ開ける
② DBのポートは絶対に外部公開しない
③ SSHのポートはデフォルトの22番から変更する
④ 通信はHTTPSを使って必ず暗号化する
⑤ 不要なサービスは停止する
ポートとプロトコルを理解することは、
「インターネットの言葉を理解すること」です。
開発・インフラ・セキュリティ、どの分野でも必ず役立つ知識です💪
💬 質問や感想があれば、コメント欄でお気軽にどうぞ!
👍 役に立ったら、いいね&ストックをお願いします!
🎓 ここまで読んでくださって、本当にありがとうございました!
🔗 シリーズ記事
- 【基礎編】プロトコルとポート番号の基本
- 【応用編】TCP・UDP・OSIモデル・セキュリティ(この記事)