Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TCP-соединение, устойчивое к ошибкам в сети, TCP-соединение, устойчивое к ошибкам в с 
:(
    Опции темы
Alexander06
Дата 20.5.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет




Здравствуйте.

Пишем ПО для системы сбора данных, состоящей из 2-х машин.
Первая - сервер. Ожидает подключения клиентов, содержит у себя необходимые клиенту настройки.

Клиент после запуска подключается к серверу, получает от него настройки и после инициализации шлет серверу данные, 
пока не получит какую-либо управляющую команду.

Прием данных на клиенте и сервере организованы одинаково - с помощью функции recv.
В пакетах первые 4 байт занимает размер пакета. Соответственно, при приеме читающий смотрит размер пакета, а потом дочитывает остальное.
Все это в отдельном потоке. В другом потоке крутится функция отправки с помощью send.

В случае какой-либо ошибки, и клиент и сервер разрывают соединение. В случае разорванного соединения клиент пытается подключиться снова.

Вопрос...TCP гарантирует доставку пакетов. Может ли такое случиться, что в случае ошибки соединения (например, вынут кабель) часть пакета потеряется и при повторном подключении вместо того, чтобы читать заголовок с размером пакета, сервер будет читат середину прошлого пакета?

Есть ли какие-то принципы организации подобных, устойчивых соединений?

Спасибо.
PM MAIL   Вверх
REZiaMIX
Дата 20.5.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Цитата

Может ли такое случиться, что в случае ошибки соединения (например, вынут кабель) часть пакета потеряется и при повторном подключении вместо того, чтобы читать заголовок с размером пакета, сервер будет читат середину прошлого пакета?

Дам совет: сервер не должен никогда расчитывать на правильные данные. Прислать могут что угодно , почти все должно проходить проверку!


--------------------
user posted image
PM MAIL   Вверх
sdukshis
Дата 20.5.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



Цитата(Alexander06 @ 20.5.2009,  18:01)

Вопрос...TCP гарантирует доставку пакетов. Может ли такое случиться, что в случае ошибки соединения (например, вынут кабель) часть пакета потеряется и при повторном подключении вместо того, чтобы читать заголовок с размером пакета, сервер будет читат середину прошлого пакета?


Если Вы используете TCP, то такой ситуации практически быть не может, так как при разрыве связи сокет на стороне сервера уходит в состояние TAIM_WAIT для отлавливания оставшихся пакетов. Время его пребывания в режиме TIME_WAIT определяется с помощью эмпирического правила на основе предполагаемого максимального времени жизни пакета в сети обычно от 30 секунд до 2 минут.

Это сообщение отредактировал(а) sdukshis - 22.5.2009, 20:34
PM MAIL   Вверх
REZiaMIX
Дата 21.5.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Цитата(sdukshis @ 20.5.2009,  20:02)
Если Вы используете TCP, то такой ситуации практически быть не может, так как при разрыве связи сокет на стороне сервера уходит в состояние TAIM_WAIT для отлавливания оставшихся пакетов. Время его пребывания в режиме TAIM_WAIT определяется с помощью эмпирического правила на основе предполагаемого максимального времени жизни пакета в сети обычно от 30 секунд до 2 минут.

TIME_WAIT 
smile


--------------------
user posted image
PM MAIL   Вверх
Alexander06
Дата 21.5.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



TIME_WAIT...а если потеря соединения скажем на пару секунд?
У нас как раз длительного отключения не происходит.

Мы контролируем содержимое пакета и в случае ошибки рвем соединение.
Мой вопрос касается именно того, что будет после восстановления соединения.

Наверное надо вводить в пакеты какие-то последовательности бит, чтобы в случае ошибки нащупать начало следующего пакета?
PM MAIL   Вверх
fry
Дата 22.5.2009, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



Для контроля корректности принимаемых данных TCP использует контрольную сумму, проверив которую принимающая сторона передает подтверждение приема данных. Это означает, что если данные пришли (данные возвращены функцией ВВ) значит они корректны. TIME_WAIT необходимо, чтобы после разрыва связи другое соединение с темже IP и портом не получило пакетов, оставшихся от предыдущего соединения. При возникногвении ошибок соединения функции ВВ вернут код ошибки.
Если кода ошибки нет - данные корректны.

Думаю кратковременные разрывы могут и не повлиять на работу приложения вообще.
PM MAIL   Вверх
MAKCim
Дата 22.5.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



Цитата(fry @  22.5.2009,  02:31 Найти цитируемый пост)
Думаю кратковременные разрывы могут и не повлиять на работу приложения вообще. 

а если и повлияют, то есть keepalive probes
на сколько я знаю, по-умолчанию длительность иинервалов между попытками "пинга" растет экспонненциально где-то до 2-х часов

Добавлено через 1 минуту и 31 секунду
Alexander06, 
TCP гарантирует как целостность данных, так и очередность
никакой потери быть не может
на сокет попадют только полностью полученные и проверенные части потока


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
andrew_121
Дата 22.5.2009, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Если ответ получен, отметьте тему закрытой.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0733 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.