Общие принципы надежной передачи данных
В этом разделе мы рассмотрим общие принципы надежной передачи данных. Проблема надежной передачи данных является одной из центральных для компьютерных сетей и проявляется не только на транспортном, но также на сетевом и прикладном уровнях. Большинство принципов, изложенных ниже, реализованы в протоколе TCP; мы убедимся в этом в следующем разделе.
На рис. 3.7 приведена схема надежной передачи данных. Служба надежной передачи данных обслуживает канал, по которому осуществляется надежная передача сообщений верхних уровней коммуникационной модели. При надежной передаче не происходит искажений битов, то есть изменений их значений с 0 на 1 или наоборот; кроме того, данные доставляются в том порядке, в котором они были отправлены. Именно такая модель обслуживания используется протоколом TCP.
Главная проблема обеспечения надежной передачи данных протоколом транспортного уровня заключается в том, что протокол более низкого уровня может не поддерживать надежную передачу. Подобная ситуация характерна для протокола TCP, который использует службу ненадежной передачи протокола сетевого уровня IP. Тем не менее эта проблема может касаться не только транспортного, но сетевого и даже канального уровней: они используют службы передачи данных сетей и отдельных линий связи, которые очевидно не являются надежными.
В этом разделе мы займемся созданием клиентской и серверной сторон протокола надежной передачи данных, постепенно усложняя модель канала передачи.
Интерфейс будущего протокола приведен на рис. 3.7, б. Передающая сторона вызывается с расположенного выше уровня методом rdt_send(). Здесь rtd является аббревиатурой от reliable data transfer (надежная передача данных), a _send указывает на передающую сторону протокола (вообще говоря, первым шагом в создании протокола является выбор для него подходящего имени). На принимающей стороне при появлении нового пакета выполняется метод rdt_rcv(), а метод deliver_data() передает данные прикладному уровню. Для обозначения единицы обмена мы далее будем использовать термин «пакет» вместо ставшего привычным термина «сегмент». Мы выходим за пределы Интернета и рассматриваем компьютерные сети в целом, поэтому использование общей терминологии в данном случае более предпочтительно.
В этом разделе мы ограничимся лишь однонаправленной, или полудуплексной, передачей данных, то есть передачей от источника к приемнику. Двунаправленная, или дуплексная, передача концептуально не сложнее, однако делает описание весьма утомительным. Несмотря на свое название, однонаправленная передача предусматривает движение пакетов в обоих направлениях, как и показано на рис. 3.7. Мы убедимся в том, что принимающей и передающей сторонам необходимо, кроме данных, обмениваться также различной управляющей информацией. Передача пакетов сторонами протокола друг другу будет производиться с помощью метода udt_send(), где udt означает unreliable data transfer (ненадежная передача данных).