Как я могу проверить, что пакет TCP получил ACK в C #? - PullRequest
5 голосов
/ 08 декабря 2009

После отправки некоторых данных tcp методами блокировки / неблокирования, такими как:

Socket.Send() or Socket.SendAsync()

Как я могу узнать, что мои данные получили сообщение ACK?

Может ли .NET знать, были ли данные TCP успешно отправлены?

Ответы [ 7 ]

12 голосов
/ 08 декабря 2009

Единственный способ узнать наверняка - это реализовать какое-то подтверждение на уровне приложения. Пакет «ACK» на уровне TCP вообще не представлен на уровне приложения, поэтому вам нужно использовать нечто большее.

5 голосов
/ 08 декабря 2009

Вы заставляете другой конец отвечать на это.

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

3 голосов
/ 09 декабря 2009

Эта информация недоступна в библиотеках классов .net. У меня были такие же соображения, когда я начал работать над этим сканером портов в C #. Я использовал оболочку .NET для libpcap (после установки соответствующего драйвера), SharpPcap (http://sourceforge.net/projects/sharppcap/), для получения такой информации. Пакеты ACK получены через интерфейс SharpPcap (вызывая нативный libpcap интерфейс прозрачно).

Мое приложение - NScanner Port Scanner / Sweeper, и вы можете найти код в codeplex, ссылаясь на мое простое использование вышеупомянутой библиотеки (http://nscanner.codeplex.com/).

Надеюсь, я помог.

2 голосов
/ 09 декабря 2009

«Я пытаюсь сосредоточиться на том, как узнать, когда ваши данные были приняты другой стороной соединения».

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

Возьмем HTTP в качестве примера протокола потоковой передачи. Сервер отправляет поток данных клиенту. Больше нет дополнительных ACK прикладного уровня, и серверу на самом деле все равно, когда и как именно поступает его поток данных. Это очень эффективно для каналов с высокой задержкой.

Теперь сравните это с SMB! Вместо потоковой передачи файла данные разделяются на блоки. Каждый успешно переданный блок данных фиксируется на прикладном уровне. Это дает вам больше контроля, однако эффективно уничтожает протокол в сетях WAN (см. «Продукт с задержкой пропускной способности»).

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

1 голос
/ 10 апреля 2010

Я рекомендую использовать Pcap.Net .

Вы можете легко анализировать пакеты, используя эту библиотеку в C #, а затем легко проверять значения пакетов.

Вы также можете легко создавать и отправлять пакеты.

0 голосов
/ 08 декабря 2009

Если вы действительно уверены, что вам нужно знать подробности об уровне пакетов вашего TCP-соединения, то в дополнение к созданию TCP-сокета для отправки вам необходимо, чтобы ваше приложение использовало winpcap API для просмотра необработанного трафика. , Вы можете установить фильтр только для приема пакетов, относящихся к конкретному IP, комбинации портов, которая определяет вашу удаленную сторону.

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

0 голосов
/ 08 декабря 2009

Уровень TCP будет повторно посылать пакет, пока не получит успешный ACK.

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

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