Потеря пакета во время 3way рукопожатия - PullRequest
2 голосов
/ 22 февраля 2012

Мне нужно выполнить трехстороннюю остановку и дождаться рукопожатия между клиентскими и серверными приложениями, написанными на c ++ (с winsock 2) для назначения.Клиент отправляет SYN.Сервер увеличивает порядковый номер клиента и отправляет SYN-ACK.Клиент увеличивает порядковый номер сервера и отправляет ACK.

Для имитации потери пакетов клиент и сервер подключены к промежуточной программе Router, которая иногда не пересылает пакеты, что приводит к потере.Как мне структурировать операторы sendto (), select (), recvfrom () для учета возможной потери пакетов?

Например, если SYN потерян и время ожидания клиента истекло, отправьте его повторно.Если SYN-ACK потерян, клиент истекает и отправляет SYN.Я понятия не имею, что делать, если ACK потерян все же.

Редактировать: На моем клиенте это выглядит так:

  • Отправка SYN.
  • Цикл, в то время как оператор select () завершается неудачно и повторно отправляет SYN
  • Получает SYN-ACK
  • Отправляет ACK
  • Цикл для возможного повторного получения SYN-ACK, еслиACK был потерян.

Как узнать, когда прекратить зацикливание?

1 Ответ

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

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

Что касается проверки того, к какому отправленному пакету принадлежит ACK, вы проверяете порядковый номер.

Если вы не получили ACK в течение тайм-аута, вы просто повторно отправляете последний пакет. Не имеет значения, какой тип пакета вы отправили, если вы не получили ACK, вы должны отправить его повторно.

...