Дизайн протокола передачи данных

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

Я использую Qt в Windows.

На данный момент мой дизайн протокола моего приложения (часть для передачи данных) выглядит следующим образом:

  1. Сначала снимите данные для входа.
  2. Запишите первый пакет данных (в сокет) размером 4 килобайта, а затем дождитесь, пока сервер подтвердит, что он получил пакет.
  3. Когда сервер подтвердит получение пакета данных (записав int "1"), запишите следующие 4 килобайта.
  4. Когда все данные будут переданы, отправьте md5-сумму данных, переданных на сервер.
  5. Если сервер снова подтверждает с помощью int 8, передача данных завершается.

На данный момент я не могу получить скорость выше 166 КБ / сек на том же компьютере при передаче через 127.0.0.1. Я пытался прочитать другие конструкции протоколов, но почти нет документации по протоколам передачи данных, которую можно было бы написать для их приложения.

Неправильно ли оформлен протокол, который я опубликовал, или есть какие-то серьезные проблемы? Должен ли протокол ждать подтверждения каждого пакета сервером или я должен записывать его непрерывно?


person user1066991    schedule 28.12.2012    source источник
comment
TCP уже обрабатывает подтверждение (ACK), контрольные суммы и, как правило, адаптивные алгоритмы для размеров полезной нагрузки. Так что все, что вы делаете, кажется излишним. Тем не менее, 166 КБ / с на localhost кажется очень медленным.   -  person Brett Hale    schedule 28.12.2012
comment
Значит я должен постоянно писать в РОЗЕТКУ, не дожидаясь, пока сервер пришлет подтверждение?   -  person user1066991    schedule 28.12.2012
comment
Абсолютно. Стек TCP / IP позаботится об отправке, подтверждении, повторных попытках, упорядочивании и т. Д. Вам нужно беспокоиться только о возвращаемых значениях из вызовы чтения / записи сокета.   -  person Brett Hale    schedule 28.12.2012
comment
Будет ли порядок совпадать с порядком написания? например Я пишу пакет 1-100 в порядке возрастания, будут ли пакеты приходить в том же порядке возрастания? Гарантирует ли TCP это?   -  person user1066991    schedule 28.12.2012
comment
да, TCP - надежный потоковый протокол. Это гарантирует правильную доставку ваших данных. Данные принимаются в том же порядке, в котором вы их отправляете. Хорошее понимание TCP поможет вам всю жизнь: en.wikipedia.org/wiki/Transmission_Control_Protocol   -  person Ahmad Mushtaq    schedule 28.12.2012


Ответы (1)


Во-первых, я бы рекомендовал потратить некоторое время на то, чтобы прочитать о TCP и о Протокол скользящего окна.

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

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

person mvp    schedule 28.12.2012