TCP / IP предотвращает повторение пакетов? - PullRequest
2 голосов
/ 26 сентября 2008

Предотвращает ли TCP / IP несколько копий одного и того же пакета до места назначения? Или это до конечной точки, чтобы слой логики идемпотентности выше этого?

Пожалуйста, используйте ссылки на конкретные абзацы из спецификации TCP / IP, если это возможно.

Ответы [ 8 ]

7 голосов
/ 26 сентября 2008

Задача стека TCP восстанавливать после дублирования пакетов:

TCP должен восстановить данные, которые поврежден, утерян, дублирован или доставлено из строя системой интернет-связи. это достигается путем присвоения порядкового номера каждому октету и требует положительного подтверждения (ACK) от получение TCP. Если ACK не получен в течение тайм-аута интервал, данные передаются повторно. На приемнике последовательность числа используются для правильного заказа сегментов, которые могут быть получены вышли из строя и устранены дубликаты. Ущерб обрабатывается добавление контрольной суммы к каждому переданному сегменту, проверка ее на приемник и отбрасывание поврежденных сегментов.

- RFC 793 - Протокол управления передачей, раздел 1.5

Однако, если это те же самые пакеты с новыми порядковыми номерами, то нет.

5 голосов
/ 26 сентября 2008

TCP использует порядковые номера для обнаружения дублирования в случае повторной передачи, что также предотвратит тривиальные атаки воспроизведения.

Из RFC 793, раздел 3.3 - порядковые номера:

Фундаментальное понятие в дизайне является то, что каждый октет отправленных данных через TCP-соединение имеет последовательность число. Поскольку каждый октет последовательности, каждый из них может быть признал. Подтверждение Используемый механизм является кумулятивным что подтверждение последовательности число X указывает, что все октеты вверх чтобы, но не включая Х были получено. Этот механизм позволяет прямое обнаружение дубликатов при наличии ретрансляции. Нумерация октетов внутри сегмента является то, что первый октет данных сразу после заголовка с самым низким номером и следующим октеты нумеруются последовательно.

Обнаружение дубликатов обеспечит невозможность повторной передачи одного и того же пакета. Порядковые номера также гарантируют, что вставка (а не замена) данных в поток данных будет замечена, поскольку последующие законные пакеты, следующие за поддельными пакетами, будут иметь повторяющиеся порядковые номера, что нарушит поток данных. Это может привести к тому, что эти пакеты будут отброшены как дубликаты, что, скорее всего, нарушит используемый протокол.

Дополнительную информацию об исходной (1981 г.) спецификации TCP / IP можно найти в RFC 793 и во многих других RFC, связанных с расширениями или модификациями протокола TCP / IP.

4 голосов
/ 26 сентября 2008

Да, уровень TCP предотвращает дублирование пакетов. Уровень IP ниже этого не делает.

Подробности в RFC 1122 .

3 голосов
/ 14 февраля 2010

Вы, кажется, беспокоитесь о двух разных вещах:

  1. Какие гарантии обеспечивает надежная доставка по протоколу TCP
  2. Может ли злоумышленник повлиять на процесс моего сервера с помощью повторной атаки

Ответ на 1:

TCP гарантирует надежную и последовательную доставку последовательности байтов. Все данные, которые клиентское приложение отправляет в TCP через write(), будут точно такими же во время read() вызова сервера.

Ответ на 2:

Атаки воспроизведения не работают хорошо с TCP, так как каждое соединение зависит от двух случайных 32-битных чисел, сгенерированных клиентом и сервером соответственно. Чтобы атака с повтором работала, злоумышленник должен угадать порядковый номер, сгенерированный сервером для ложного соединения, которое он инициирует (теоретически у злоумышленника есть шанс 1/2 ** 32 правильно угадать). Если злоумышленник угадает неправильно, он в худшем случае вызовет некоторую буферизацию данных в вашей ОС.

Обратите внимание, что только из-за того, что атака воспроизведения не работает, ничто не мешает злоумышленнику установить законное соединение с вашим сервером и передать любой поток данных, который он хочет, вашему приложению. Вот почему важно всегда проверять ввод .

2 голосов
/ 26 сентября 2008

Уровни ниже TCP могут испытывать несколько пакетов или отброшенных пакетов. Уровни выше TCP не испытывают повторения или отброшенных пакетов.

1 голос
/ 14 мая 2009

Это действительно зависит от того, как вы получаете ваши данные - хотя технически протокол не должен давать вам дубликаты (то есть пакеты с одинаковой контрольной суммой tcp), другие факторы могут привести к тому, что вы увидите дубликаты - например, сетевое оборудование, которым вы являетесь с помощью; также, если вы используете снифферы для просмотра потоков tcp, а не просто для чтения открытого сокета в своем приложении, возможно получить дублирующие пакеты от снифферов, даже если у реальных потоков tcp, которые они отслеживали, не было дублированных пакетов.

Чтобы привести пример из реальной жизни. В настоящее время я работаю над некоторым анализом tcp внутренних сетей для крупной фондовой биржи, и данные, на которые я обращаюсь, поступают от нескольких анализаторов и собираются вместе. Таким образом, извлекая данные, я обнаружил, что мне нужно выполнить ряд предварительных этапов, включая поиск и удаление дубликатов. Например, в только что прочитанном потоке из примерно 60 000 пакетов данных я обнаружил и удалил 95 дублированных пакетов.

Стратегия, которую я здесь использую, заключается в том, чтобы сохранять скользящее окно 10 последних контрольных сумм tcp и игнорировать пакеты, которые соответствуют этим контрольным суммам. Обратите внимание, что это хорошо работает для пакетов PSH, но не так хорошо для пакетов ACK - но я все равно меньше беспокоюсь об этом.

Я написал специальную коллекцию для отслеживания этого скользящего окна контрольных сумм tcp, которая может быть полезна для других:

/// <summary>
/// Combination of a double-linked-list and a hashset with a max bound; 
/// Works like a bounded queue where new incoming items force old items to be dequeued; 
/// Re-uses item containers to avoid GC'ing;
/// Public Add() and Contains() methods are fully thread safe through a ReaderWriterLockSlim;
/// </summary>
public class BoundedHashQueue<T>
{
    private readonly int _maxSize = 100;
    private readonly HashSet<T> _hashSet = new HashSet<T>();
    private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
    private readonly Item _head;
    private readonly Item _tail;
    private int _currentCount = 0;

    public BoundedHashQueue(int maxSize)
    {
        _maxSize = maxSize;
        _head = _tail = new Item();
    }

    private class Item
    {
        internal T Value;
        internal Item Next;
        internal Item Previous;
    }

    public void Add(T value)
    {
        _lock.Write(() =>
            {
                if (_currentCount == 0)
                {
                    Item item = new Item();
                    item.Value = value;
                    _head.Next = item;
                    item.Previous = _head;
                    item.Next = _tail;
                    _tail.Previous = item;
                    _currentCount++;
                }
                else
                {
                    Item item;
                    if (_currentCount >= _maxSize)
                    {
                        item = _tail.Previous;
                        _tail.Previous = item.Previous;
                        _tail.Previous.Next = _tail;
                        _hashSet.Remove(item.Value);
                    }
                    else
                    {
                        item = new Item();
                        _currentCount++;
                    }
                    item.Value = value;
                    item.Next = _head.Next;
                    item.Next.Previous = item;
                    item.Previous = _head;
                    _head.Next = item;
                    _hashSet.Add(value);
                }
            });
    }

    public bool Contains(T value)
    {
        return _lock.Read(() => _hashSet.Contains(value));
    }
}}
1 голос
/ 26 сентября 2008

Я не знаю о повторении пакетов, но я никогда не сталкивался с этим при использовании TCP / IP, и я знаю, что он гарантирует, что все пакеты приходят и в правильном порядке, поэтому я не могу понять, почему «т.

0 голосов
/ 26 июля 2009

Вы не до конца понимаете проблему. Смотрите эту ссылку: http://en.wikipedia.org/wiki/Transmission_Control_Protocol

На этой странице написано:

"Временные метки TCP, определенные в RFC 1323, помогают TCP вычислять время кругового обхода между отправителем и получателем. Опции временной метки включают 4-байтовое значение временной метки, где отправитель вставляет свое текущее значение своих часов временной метки, и 4-байтовое значение метки времени ответа эха, когда получатель обычно вставляет самое последнее полученное им значение метки времени. Отправитель использует метку времени эхо-ответа в подтверждении для вычисления общего прошедшего времени с момента отправки подтвержденного сегмента. [2]

Временные метки TCP также используются, чтобы помочь в случае, когда порядковые номера TCP встречаются со своими ограничениями 2 ^ 32 и «оборачиваются» пространством порядковых номеров. Эта схема известна как защита от последовательных номеров с переносом или PAWS (подробности см. В RFC 1323). "

С уважением, Джойнт (Польша)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...