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

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

Я использую QT на окнах.

В данный момент мой дизайн моего прикладного протокола (часть, чтобы передать данные) следующие:

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

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

Дизайн протокола то, что я отправил неправильно или страдающий от некоторых серьезных проблем?
Протокол должен ждать каждого пакета, который будет подтвержден сервером, или я должен писать его непрерывно?

Во-первых, я рекомендовал бы провести некоторое время при чтении о [TCP](https://en.wikipedia.org/wiki/Transmission_Control_Protocol), и о [Протокол раздвижного окна](https://en.wikipedia.org/wiki/Sliding_Window_Protocol).

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

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