В [предыдущей статье][1] я рассказал как создать сервер и клиент на Python 3, используя встроенные сокеты. Но у этого приложения было много недостатков, которые я попытаюсь исправить в этой и последующих статьях. Так какими же недостатками обладает наше приложение?
* Отсылается один единственный пакет, длина которого не может превышать заранее заданной границы в 1 Кбайт.
* Приложение без проверки передаёт аргумент, принятый из сети, в оболочку (URL).
* Недостаток функциональности. Мы не можем, например, скачать все изображения с Хабра, или скачать отдельный хаб.
Сегодня я расскажу как решить первую проблему, а заодно и немного о TCP.
##### Описание протокола
Мы использовали «голый» протокол TCP для передачи данных между сервером и клиентом. TCP — это потоковый протокол, он передаёт данные последовательным набором байт. Передавая команду с аргументами по сети в первой версии нашего приложения мы читали только 1024 байт данных из принятого пакета. Но что делать, если данные не помещаются в 1024 байт? Выход только один — разбить данные на несколько пакетов на одном хосте и «склеить» их в один кусок при получении на другом хосте. Но как узнать когда заканчивается одна команда (с её аргументами) и начинается другая? Для этого нам нужно нужно знать, какова длина всего передаваемого сообщения. Так как заранее узнать длину сообщения у нас не получиться, придётся передавать её в одном из пакетов. Разумеется, делать это лучше в самом начале первого пакета. Выделив под хранение длины сообщения всего 4 байта, мы сможем передать сообщение длиной свыше 4 млрд символов! Длина сообщения — это информация о нём, то есть, часть заголовка, заголовка нашего протокола. Какого протокола спросите вы? Если верить Википедии, то
> Протокол передачи данных — набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами.
Мы договорились, что будем передавать данные в нескольких пакетах по TCP, а в начале данных первого пакета будет храниться длина всего сообщения в байтах. Таким образом мы разработали наш простой протокол! Нужно помнить, что наш протокол основан на TCP, а значит, обладает теми же особенностями, что и последний. [Читать дальше →][2]
[1]:
http://habrahabr.ru/post/268993/
[2]:
http://habrahabr.ru/post/269019/#habracut