C #: Как бороться с неупорядоченными TCP-пакетами? - PullRequest
2 голосов
/ 18 апреля 2009

Может кто-нибудь один объяснит, как бороться с неупорядоченными пакетами. Я использую необработанный сокет для захвата пакетов и их анализа по мере их поступления, но некоторые из них поступают в неправильном порядке, например:

  1. Id ........... Флаги
  2. 16390: (PSH, ACK)
  3. 16535: (PSH, ACK)
  4. 16638: (ACK)
  5. 16640: (PSH, ACK)
  6. 16639: (ACK)
  7. 16695: (PSH, ACK)

Пакеты с идентификаторами: 16390, 16535, 16695 являются отдельными пакетами и могут быть обработаны свободно Пакеты с идентификаторами: 16638, 16640, 16639 являются последовательностью пакетов и должны быть помещены в порядке возрастания перед синтаксическим анализом.

Что еще хуже, пакеты с Push-флагом иногда появляются первыми, поэтому я просто передаю их парсеру, а затем пакет, который предшествует, приходит, и парсер просто отбрасывает его как поврежденный.

Есть ли способ с этим справиться?

Ответы [ 4 ]

11 голосов
/ 18 апреля 2009

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

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

Это происходит на транспортном уровне ниже TCP, поэтому любые TCP-соединения никогда не увидят этого. С точки зрения ПТС они всегда в порядке. Поэтому, если вы видите их не в порядке, значит, вы не работаете на транспортном уровне TCP, вы находитесь на более низком уровне.

Кроме того, к вашему сведению ...

  • Данные TCP являются «сегментом»
  • IP-данные - это «датаграмма»
  • Сетевой уровень - это «пакет»

Редактировать: Ссылка, которую вы предоставили, предоставит вам поток дейтаграмм IP, поэтому вам придется обрабатывать поток TCP самостоятельно. Я не буду притворяться, будто это легко, и попытаюсь объяснить это здесь.

5 голосов
/ 18 апреля 2009

TCP гарантирует порядок. Так что я просто предположу, что вы говорите об IP.

Одна вещь, которую вы могли бы попробовать, это поместить пакеты в мини-кучу и затем подождать, пока не будет доступен следующий требуемый идентификационный номер пакета.

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

4 голосов
/ 18 апреля 2009

Почему бы вам не использовать обычный tcp сокет, чтобы они пришли в порядок?

1 голос
/ 15 февраля 2012

Порядковый номер покажет порядок. Он распространяется на 4G, поэтому вам придется учитывать это. И вам придется использовать ту же самую базовую процедуру, которую использует TCP. Буферизируйте неупорядоченные пакеты и удаляйте дубликаты. Sequence Number + Len of payload - это следующий порядковый номер.

TCP / IP Нелистированный том 2 или TCP.c?

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