大学の講義で「ネットワーク設計」や「フロー制御・輻輳制御」について学んでいる際、「パケット交換方式ではバッファオーバーフローでパケットが廃棄される」という説明が出てきました。
概念としては分かるのですが、**「具体的にどうやって捨てて、どうやって拾うのか?」**という実装レベルのイメージが湧きにくかったので、擬似コードを交えて整理してみました。
1. そもそも「回線交換」と「パケット交換」の違い
パケットが捨てられる理由を知る前に、通信の方式についておさらいします。
回線交換方式(昔の電話など)
- 仕組み: 通信路(席)をあらかじめ予約・占有する。
- メリット: 席を確保するので、通信中は混雑しない。
- デメリット: 席(回線数N)が埋まっていると、新しい人は門前払いされる(呼損)。
- イメージ: 完全予約制のレストラン。満席なら入店すらできない。
パケット交換方式(インターネット)
- 仕組み: データを細切れ(パケット)にして、回線をみんなで共有する。
- メリット: 効率が良い。
- デメリット: 一気にデータが来ると、ルータの一時置き場(バッファ)が溢れてしまう。
- イメージ: 予約不要のフードコート。誰でも入れるが、混みすぎるとトレイを持って立ち尽くす(=バッファオーバーフロー)。
2. 「パケット廃棄」の物理的イメージ
講義資料には「バッファオーバーフローが発生し、パケットが廃棄される」と書かれています。
これは物理的にゴミ箱にポイッとするわけではなく、**「メモリがいっぱいで書き込めないから、処理を放棄してメモリを解放する」**という挙動です。
ルータ(捨てる側)の実装をC言語風の擬似コードで書くと、以下のようになります。
router_logic.c
// ルータの処理イメージ
#define MAX_BUFFER_SIZE 100 // バッファの限界(これ以上は持てない!)
struct PacketQueue {
Packet* packets[MAX_BUFFER_SIZE];
int count; // 現在溜まっている数
};
// パケットが到着したときの処理
bool receive_packet(struct PacketQueue* queue, Packet* new_packet) {
// 【運命の分かれ道】
// 現在の数が、限界容量を超えているかチェック
if (queue->count