diff --git a/docs/manual.md b/docs/manual.md index eba0991..5f84861 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -1234,3 +1234,14 @@ mss, winsize, scale передаются от одной стороны соед mss дублируется в поле `desync.tcp_mss` независимо от наличия conntrack. Значение там уже рассчитано на то, что оно будет использовано для вычисления размера пакета для отсылки. Если вдруг conntrack нет или mss не был согласован сторонами, выставляется значение по умолчанию - DEFAULT_MSS (1220). + +При работе с sequence нужно учитывать их 32-битную беззнаковую природу. +Если к 4294967280 (0xFFFFFFF0) прибавить 100, будет не 4294967380 (0x100000054), а 84 (0x54). +Если вы сложите в LUA эти числа - вы получите 4294967380, потому что там используется представление чисел с разрядностью более 32 и со знаком. +Для операций с sequence и их сравнения рекомендуется использовать C функции u32add и bitand. +Например, выражение `0==bitand(u32add(seq1, -seq2), 0x80000000)` соответствует `seq1>=seq2`. +Но последний простой вариант не будет работать корректно, а первый - будет, если seq1 ушел от seq2 не более, чем на 2 GB. +Большее и не отследить через sequence. Нужно всегда учитывать, что при передаче больших обьемов данных они не могут служить счетчикам. +`p*counter` являются 64-битными счетчикам, поэтому у них этой проблемы нет. + +