(レイヤー3レベルで)パケットが破棄されるのは、以下のような場合があります。
1. ルーティングテーブルにルートが無い場合
ルーティングテーブルに宛先IPのルートが無い場合、どこに送ればよいか分からなくなるため、そのNW機器でパケットが破棄されます。 破棄されるタイミングでNW機器からICMPのDestination Unreachable(Network Unreachable)が送信元IPアドレス宛に通知されます。ただし、大抵ルーティングテーブルにはデフォルトルートが入っているため、このケースは稀です。
2. ルーティングテーブル上に存在するNullルートに合致した
あるNW機器上で『この宛先の通信は破棄したい』というとき、ACLで書くこともできますが、Nullルートを設定することでパケットを破棄できます。
例えば192.168.1.0/24宛の通信を破棄したい場合は、『192.168.1.0/24宛のパケットのネクストホップはNullインタフェース』というNullルートを設定すれば良いのです。
このNullルートは、OSPFやEIGRPで集約ルートを設定する際に生成されます。ルーティング・ループを回避するためです。この理由の詳細についてはこちらを参照下さい。
3. IPヘッダのdfビットが立っているのに、MTU値を超えるパケットサイズの場合
MTU値を超えるパケットサイズを転送しようとしたとき、ルータはフラグメンテーションを試みます。ただし、dfビットが立っている場合は、 フラグメンテーション禁止のため、そのNW機器でパケットが破棄されます。破棄されるタイミングでNW機器からICMPのDestination Unreachable (Need Fragmentation but Can’t Fragment)が送信元IPアドレス宛に通知されます。その際、送信元に適切なMTU値を知らせることができます。
しかし、もしこのICMPがアクセスリスト等で拒否されている場合、適切なMTU値を知ることができず、また、宛先に届いたかどうかすら分からないため、タイムアウトまで待ち続けることになります。
4. TTLが0になった場合
ルーティングをする際にはIPヘッダのTTLフィールドの値を1つ減らします。ルータにTTL=1のパケットが入ってきたとき、さらにルーティングが必要になる場合(宛先IPアドレスがそのNW機器にConnectedのNWアドレスではない場合)、 TTL=0となり、そのNW機器でパケットが破棄されます。破棄されるタイミングでNW機器からICMPのTime Exceededが 送信元IPアドレス宛に通知されます。
コマンドプロンプトでpingを打ち、”転送中にTTLが期限切れになりました”、もしくは、”TTL expired in transit”と出てくるのは、このICMPを受け取ったためです。この場合の原因はたいてい、どこかでルーティングループが起こっています。『経由するNW機器が多過ぎる』という可能性もありますが、現在では、あり得ないと考えても良いレベルです。
きちんと確認したい場合は、tracert を使って調査します。
5. NW機器の転送能力のキャパシティを超えたとき
これは当たり前ですが、機器の性能以上のパケットが入ってきたときは、一部のパケットは破棄されます。
関係する性能指標としては、bpsやpps、CPU使用率やメモリ使用率などがあります。
bpsやppsはいわゆるパケットの流量です。詳細はこちらを参照下さい。
CPU使用率は、ハードウェア処理のルーティング、スイッチングには関係ないだろと思う方もいるかもしれませんが、パケットを受信NICから取り出すときや、ヘッダ書き換え処理をしたパケットを送信NICへセットする際には、僅かながらCPUを利用します。なので、CPUが100%稼働していると影響はあります。
また、メモリ使用率についてですが、受信パケットを保存するメモリ領域としては、具体的にはring-bufferと呼ばれるメモリのheap領域を使います。受信バッファをrx-ring、送信バッファをtx-ringと呼びます。
これらの値を変更したい場合は以下コマンドを使います。大きくすれば、パケットロスの可能性は低くなります。
ただし、これらの設定は大きくし過ぎるとパケットロスは減るものの、遅延が大きくなりますのでチューニングの際には注意が必要です。