Передача сообщений TCP/IP

Настройка, программирование, распределённые вычисления

Модераторы: Olej, bellic, vikos

mcrandy
Активист
Сообщения: 18
Зарегистрирован: 21 янв 2013, 12:51
Контактная информация:

Re: Передача сообщений TCP/IP

Непрочитанное сообщение mcrandy » 09 фев 2013, 12:55

Недостаток способа: длина + поле указанной длины байт (2-й способ, как вы его назвали) состоит в том, что:
- клиент-серверные системы обычно предназаначены работать долго, на многих миллионах последовательных посылок...
- но если при таком способе вы каким-то образом рассинхронизируетесь хоть на 1 байт с началов ваших сообщений - то вы уже никогда больше не восстановите работу вашей системы без перезагрузки.
А что значит рассинхронизация на хоть 1 байт? Как она может произойти?
Вот клиент посылает одно сообщение с его длиной в начале, сервер получает поток и по первым (к примеру) 4-м байтам этого потока узнает длину сообщения и принимает его целиком.
Затем приходит второе сообщение по тому же принципу, затем третье, ведь все они идут последовательно. Как в этой схеме может произойти "авария?"

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Передача сообщений TCP/IP

Непрочитанное сообщение Olej » 27 янв 2015, 19:56

mcrandy писал(а): А что значит рассинхронизация на хоть 1 байт? Как она может произойти?
Вот клиент посылает одно сообщение с его длиной в начале, сервер получает поток и по первым (к примеру) 4-м байтам этого потока узнает длину сообщения и принимает его целиком.
Затем приходит второе сообщение по тому же принципу, затем третье, ведь все они идут последовательно. Как в этой схеме может произойти "авария?"
Как она может произойти?
В результате ошибки выполнения кода: либо передающего, либо принимающего... будет каким-то образом передано в начале пакета не 4 байт, а 3 или 5...

То, что вы описываете - всё абсолютно правильно, но в предположении, что у вас всё безукоризненно и никогда не может возникнуть ошибка. А я знаю знаменитую фразу классика IT Э.Дейкстры: "Нет ни одной программы, не содержащей ошибки, они различаются только тем, сколько ошибок уже выявлено". Стоит вам ошибиться, например, в длине пакета (пакет больше или меньше) - и система погибнет навсегда. А с разделителем вы всегда можете восстановить начало следующего сообщения. В этом случае система становится устойчивой.

P.S. Это именно разделитель получается, при непрерывном потоке пакетов вы можете считать его как угодно: концом текущего пакета, или началом следующего ;-)


Тема поднималась пользователем Olej 27 янв 2015, 19:56.

Ответить

Вернуться в «Сети»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 14 гостей