シーケンス番号の連続性チェックのやりかた

UDP パケットとかドロップが起き得るデータにシーケンス番号を振っておいて、受け側でドロップがないか検査したりすることはよくあると思いますが、そのよくあるはずの検査アルゴリズムの知識がなかったので、頭をひねった結果をメモ。

int[] seq = new int[]{
        (int) 0xfffffff8L, (int) 0xfffffff9L, (int) 0xfffffffaL, (int) 0xfffffffbL,
        (int) 0xfffffffcL, (int) 0xfffffffdL, (int) 0xfffffffeL, (int) 0xffffffffL,
        0, 3, 4, 6, 7, 8, 9, 10, 13, 19, 20, 21, 22, 24, 27, 42, 43, 44, 45, 46, 47};

for (int i = 0; i < seq.length; i++) {
    if (i == 0) {
        System.out.printf("%2d %2d %08X%n", i, seq[i], seq[i]);
    } else {
        int diff = seq[i] - seq[i-1];
        if (diff == 1) {
            System.out.printf("%2d %2d %08X 連続%n", i, seq[i], seq[i]);
        } else {
            System.out.printf("%2d %2d %08X 脱落 %d 個%n", i, seq[i], seq[i], diff - 1);
        }
    }
}

現シーケンス番号と前のシーケンス番号との差分をみてやれば、符号の有無や、ラップアラウンドに関係なく検知できるはず。
シーケンス番号半周分(Short.MAX_VALUE とか Integer.MAX_VALUE とか)落ちるとかそんなのは無しで。
diff が負の場合は順序の入れ替わりなのでソートして再検査するか破棄するか。