Будут ли данные гарантированно доставлены в том порядке, в котором я их отправляю?

Допустим я три раза на сервере выполняю вызов send

send(sock,"I",sizeof("I"),0);
send(sock,"Y",sizeof("Y"),0);
send(sock,"X",sizeof("X"),0);

На стороне клиента же три раза выполняю вызов recv

recv(sock,buf,sizeof(buf),0);
recv(sock,buf,sizeof(buf),0);
recv(sock,buf,sizeof(buf),0);

Я в сетях не эксперт:( tcp контролирует упорядоченную доставку пакетов, означает ли это то, что отправленные три раза данные сервером придут в том порядке, в котором я их отправил?


Ответы (1 шт):

Автор решения: Fat-Zer

Я в сетях не эксперт:( tcp контролирует упорядоченную доставку пакетов, означает ли это то, что отправленные три раза данные сервером придут в том порядке, в котором я их отправил?

Да, то что контролируется упорядоченная доставка данных именно это и значит. TCP гарантирует это. т.е. Или будут доставлены все данные именно в том порядке в котором они отправлены, или, в случае обрыва соединения, удалённый узел не получит ничего, что идёт после обрыва, а очередной последующий вызов send() на локальном вернёт ошибку.

На практике это означает, что локальный узел присваивает уникальный номер каждому отправленному пакету с данными, так что удалённый узел по этому номеру сможет определить в каком порядке идут данные даже если пакеты придут не по порядку. А для гарантии, что ничего не пропущено, локальный узел ждёт от удалённого пакет-подтверждение, что данные дошли, а если для какого-то пакета оно не будет получено, то локальный узел отправит пакет повторно. Но всё это происходит «под капотом», средствами ОС и практически незаметно со стороны программы.

Но важно, что с программной точки зрения в TCP нет «пакетов»: логически, он представляет двухсторонний поток данных, и эти данные могут доставляться произвольными кусками за раз. т.е. в примере выше первый же recv() может вернуть все данные отправленные всеми предыдущими send(), если буфер имеет достаточный размер или может (в вакуумно-сферическом случае) вернуть только один символ 'I' без завершающего нуля.

→ Ссылка