Для чего он нужен?
Современные средства и протоколы удалённого копирования файлов (например http, ftp, rcp), каждый раз полностью пересылают данные, несмотря на возможно уже существующею старую версию этих данных. Хотя и возможно воссоздать только изменения, например с помощью утилиты diff, если существует старая копия наряду с новой, и тем самым пересылать только изменения, но в практике это не всегда удобно и часто приводит к ошибкам.
Задачи алгоритма rsync:
- Он должен работать с произвольными данными, не только обычным текстом.
- Размер передаваемых данных должен быть примерно равен размеру diff файла.
- Он должен быстро работать с большими файлами.
- Алгоритм не должен иметь какие либо предварительные знания о статусе этих файлов, но должен эффективно находить их возможные сходства.
- Использовать мало ресурсов.
Представим, что у нас имеются файлы A и B , и мы хотим обновить B таким образом, чтобы его содержимое было идентично содержимому файла A . Самый простой и очевидный способ - это скопировать A в B .
Теперь представим, что эти файлы находятся на двух разных машинах соединённых медленным каналом связи, например, с помощью dialup модема. Если файл A большой, копирование A в B будет происходить очень медленно. Чтобы сделать это быстрей, мы можем сжать A , перед тем как пересылать его. Но обычный коэффициент сжатия колеблется от 2 до 4, что так же не подойдёт для нашей медленной связи.
Предположим, что файлы A и B почти одинаковы (возможно, оба были получены из одного общего файла). Для увеличения производительности копирования мы можем воспользоваться преимуществом их сходства. Обычное решение этой проблемы заключается в том, чтобы пересылать только изменения между файлами A и B и затем использовать их для реконструкции фала B .
Но проблема в том, что для получения этих изменений, необходимо иметь возможность чтения обоих файлов. Поэтому, нам нужно иметь оба файла на одной из сторон нашего соединения. В противном случае, этот алгоритм использоваться не может. Для решения этой проблемы и был разработан алгоритм rsync.