0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ネットワーク】「パケットが捨てられる」とはどういうことか?ルータとTCPの挙動をコードレベルでイメージする

0
Posted at

大学の講義で「ネットワーク設計」や「フロー制御・輻輳制御」について学んでいる際、「パケット交換方式ではバッファオーバーフローでパケットが廃棄される」という説明が出てきました。

概念としては分かるのですが、**「具体的にどうやって捨てて、どうやって拾うのか?」**という実装レベルのイメージが湧きにくかったので、擬似コードを交えて整理してみました。

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?