理由は、2 番目の IP フラグメントに UDP ヘッダーが含まれていないためだと思います (TCP の場合も同じだと思います)。そのため、libpcap はフィルター Express udp ポート 20000 を使用してそれらをキャプチャできません。
はい、そうです。
を試すと、ポート 20000との間のパケットと、最初のフラグメント以外の IP フラグメントudp port 20000 or (ip[6:2] & 0x1fff) != 0
がキャプチャされます。これは理想的ではありませんが、libpcap フィルターが使用するフィルター メカニズム (OS カーネルの一部) がパケット間の履歴を維持しないため、libpcap フィルターでできることはこれだけです。特定の IP ID が、同じ IP ID、フラグメント オフセット 0、およびポート 20000 の UDP ヘッダーを持つ別のパケットと同じフラグメントの一部である場合。
(また、Linux の少なくとも一部のバージョンでは、IP データグラムのフラグメントを逆の順序で送信することに注意してください。これは、受信者が最初に最後のフラグメントを確認できるようにするためであり、再構築されたパケットのサイズをより頻繁に正確に推定できるようにするためです。 . これにより、TCP または UDP ヘッダーのフィールドをチェックするフィルターを使用して、IP パケットのすべてのフラグメントをキャプチャすることがさらに難しくなります。)