Надежный UDP в C # - PullRequest
       27

Надежный UDP в C #

5 голосов
/ 07 сентября 2011

В Интернете есть несколько статей о том, как сделать UDP надежным. Я не смог найти один на C #. Поэтому, возможно, я смогу реализовать свой алгоритм.

из исследований в Интернете, я считаю, что у udp есть две проблемы:


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

если вам интересно узнать, почему я хочу сделать udp надежным и почему я не использую tcp, то взгляните на этот вопрос . Поверьте мне, я так долго пытался делать tcp punch holing.

В любом случае, возможно, уже есть библиотека, которую я могу использовать с c #, которая позволит мне сделать это. Поскольку я заметил, что смог найти библиотеку, я думал о следующем алгоритме:


«Представьте, что есть компьютер A и компьютер B, и компьютер A - это тот, который отправляет файл на компьютер B»;

вот шаги, о которых я думал:


1) компьютер A открывает файл для чтения и, скажем, он составляет 5000 байт. это означает, что компьютер A должен будет отправить 5000 байтов на компьютер B, убедившись, что байты не потеряны, и в правильном порядке.


2) компьютер A получает первые 500 байтов файла и получает хэш этих байтов. так что теперь у компьютера А есть две вещи: хэш этих 500 байтов, а также байты. (Хеш будет эффективным алгоритмом, таким как md5, чтобы убедиться, что данные получены в правильном порядке. Это md5 (1,2,3)! = md5 (2,1,3))


3) изображение хэша этих первых 500 байтов получается kj82lkdi930fi1.


4) компьютер B должен прослушивать хэш и байты.


5) компьютер A отправляет хэш на компьютер B. и он также отправляет 500 байтов. как только он отправляет сообщение, оно начинает ждать ответа.


6) компьютер B теперь должен получить хэш и байты. компьютер b выполняет тот же алгоритм md5 на принятых байтах. если этот результат равен полученному хешу, он отвечает A на {1,1,1,1,1,1}, в противном случае отвечает {2,2,2,2,2,2,2}


6.5) давайте предположим, что компьютер B получил данные в правильном порядке, поэтому он отвечает {1,1,1,1,1,} и сохраняет хеш-код в памяти или массиве.


7) компьютер A должен ждать ответа для отправки следующих 500 байтов. скажем, что он получает {1,1,1}. поскольку он получил 1, он знает, что может продолжить и отправить следующие 500 байтов с новым хеш-кодом этих 500 байтов.


8) компьютер A отправляет следующие 500 байтов со своим хеш-кодом.


9) давайте представим, что компьютер B не получил данные, поэтому он не отвечает назад A. Компьютер B все еще будет ожидать байтов и хэша


8) поскольку компьютер A не получал 1,1,1,1,1 или 2,2,2,2,2 в течение разумного периода времени, A отправит те же байты и снова хеширует во второй раз.


9) давайте предположим, что компьютер B получает хеш и байты, но байты, полученные в другом порядке. когда компьютер B вычисляет хеш для этих байтов, тогда этот хеш не будет соответствовать полученному хешу. в результате он ответит обратно {2,2,2,2,2,2}


10) если компьютер A получает 2,2,2,2,2,2, он отправляет те же байты и хэш. если по какой-то причине он не получил 2,2,2,2,2, то через некоторое время он отправит те же байты и хэш. давайте представим, что компьютер А получает 2,2,2,2,2


11) компьютер A отправляет те же байты и хэш в 3-й раз.


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


13) давайте представим, что компьютер A не получил ответ 1,1,1,1 от B. Затем он отправит те же байты в четвертый раз.


14) проверки компьютера Bхэши, и если он равен последнему принятому, то он снова отвечает на 1,1,1,1, не записывая эти байты в файл.


15) алгоритм продолжает работать до тех пор, пока файл не будет передан.


.

.

.

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

Так как вы думаете, я должен начать реализацию этого алгоритма?я должен увеличить и отправить больше байтов каждый раз.Я имею в виду отправить 1000 вместо 500?В интернете есть множество статей, в которых рассказывается о нескольких методах, но очень немногие из них дают вам рабочий пример того языка, который вы хотите.В этом случае мне нужно это в C #.

1 Ответ

2 голосов
/ 20 октября 2011

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

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

Также взгляните на эту сетевую библиотеку UDP http://code.google.com/p/lidgren-network-gen3/

...