Проектиране на протокол за пренос на данни

Пиша протокол за прехвърляне на гигабайти данни през мрежа с помощта на TCP, за да се опитам да се науча малко за програмирането на протоколи. Не съм сигурен как да проектирам този протокол за прехвърляне, за да прехвърлям данните по най-бързия и най-ефективен начин.

Използвам Qt на Windows.

В момента моят дизайн на моя протокол за приложение (частта за прехвърляне на данни) е както следва:

  1. Първо снимайте данните за вход.
  2. Запишете първия пакет данни (в гнездото) от 4 килобайта и след това изчакайте сървърът да потвърди, че е получил пакета.
  3. Когато сървърът потвърди получаването на пакета данни (като напише int "1"), запишете следващите 4 килобайта.
  4. Когато всички данни бъдат прехвърлени, изпратете md5sum на прехвърлените данни към сървъра.
  5. Ако сървърът потвърди отново с int 8, прехвърлянето на данни завършва.

В момента не мога да постигна скорости, по-високи от 166KB/сек на същия компютър при прехвърляне през 127.0.0.1. Опитвах се да прочета други дизайни на протоколи, но едва ли има документация за протоколи за пренос на данни, която човек може да напише за тяхното приложение.

Дизайнът на протокола, който публикувах, грешен ли е или страда от сериозни проблеми? Трябва ли протоколът да чака всеки пакет да бъде потвърден от сървъра или трябва да го пиша непрекъснато?


person user1066991    schedule 28.12.2012    source източник
comment
TCP вече обработва потвърждение (ACK), контролни суми и обикновено адаптивни алгоритми за размерите на полезния товар. Така че всичко, което правите, изглежда излишно. Все пак 166KB/s изглежда изключително бавно на localhost.   -  person Brett Hale    schedule 28.12.2012
comment
Значи трябва постоянно да пиша в SOCKET без да чакам сървъра да изпрати потвърждение?   -  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 и за Протокол за плъзгащ се прозорец.

Мисля, че има 2 причини, поради които внедряването ви е толкова бавно: първо, чакате потвърждение за всеки пакет - много бавно, трябва да използвате плъзгащ се прозорец. Второ, използвате MD5 контролна сума. Няма нищо лошо в това, но TCP вече прилага някои основни контролни суми и прилагането на MD5, което използвате, може да бъде много бавно.

И накрая, типичен начин да разберете защо нещо работи много бавно е да използвате профилиране.

person mvp    schedule 28.12.2012