Алгоритм SLIP со сжатием заголовков данных, увеличивающий производительность сети, рассматривается в документе под названием RFC 1144, “Сжатие заголовков TCP/IP на низкоскоростных последовательные соединениях” (Compressing TCP/IP Headers for Low-Speed Serial Links, Jacobson, 1990).
В некоторой литературе протокол SLIP со сжатием данных называется еще и Van Jacobson CSLIP compression (компрессия Ван-Джекобсона), по имени создателя алгоритма. В описании протокола РРР используется название “Van Jacobson TCP/IP header compression” (“компрессия заголовков TCP/IP Ван-Джекобсона”).
Протокол CSLIP сжимает только заголовки пакетов. Сами данные пакета остаются неизменными. Точнее, CSLIP сжимает исключительно заголовки TCP и IP для сегментов данных TCP. CSLIP не затрагивает ни заголовки пакетов UDP, ни заголовки IP для них. Разработано достаточно много различных реализаций протокола CSLIP, поэтому вам скорее всего не понадобится изобретать новую. Вероятнее, вам придется конструировать алгоритмы передачи сетевой информации по последовательному каналу, а здесь не обойтись без знания эффективной методики по устранению избыточной информации из пакетов данных. CSLIP хорошо иллюстрирует применение одного из таких алгоритмов, пригодных для передачи информации не только по последовательному каналу.
Многие реализации SLIP поддерживают также и CSLIP. Если ваш вариант программы тоже позволяет устанавливать CSLIP-соединение, лучше всего будет использовать именно его. В худшем случае, соединение не будет работать, и вам останется перейти обратно к простому SLIP-соединению.
Чтобы понять, почему сжатие заголовков пакетов столь эффективно, давайте рассмотрим некоторые типичные сетевые задачи:
• интерактивный вход в удаленный компьютер (Telnet);
• интерактивная передача файлов (FTP);
• электронная почта с использованием Simple Mail Transfer Protocol (SMTP);
• чтение и передача новостей с использованием Network News Transfer Protocol (NNTP).
Как и любая другая линия связи, последовательная линия переносит пакеты данных пользователя, снабженные заголовками. Для увеличения пропускной способности линии не мешало бы сжимать заголовки пакетов. Способы передачи пакетов по сети делятся на две большие категории: интерактивные и неинтерактивные. Эффективность канала связи зависит от типа передачи пакетов.
Прекрасными примерами неинтерактивной передачи пакетов служат два протокола: Ftp и NNTP. Разумеется, начальная стадия работы обоих процессов включает их ручную настройку и передачу параметров. Однако все, что происходит потом — это перекачка информации с одного сетевого хоста на другой, не требующая вашего вмешательства. При запуске ftp с вашего компьютера вы указываете имя файла для передачи, а потом сидите и ждете, пока поток байтов, составляющих этот файл, попадет с другого хоста на ваш собственный. Точно так же вы выбираете группу новостей в приложении NNTP и ждете, пока все новости с сервера передадутся на ваш компьютер. Все это примеры неинтерактивной передачи пакетов.
Типичным примером интерактивной передачи информации служит Telnet. Каждое нажатие на клавиатуре пользователя обычно приводит к посылке пакета, содержащего код введенного символа, на удаленный сетевой хост. Несмотря на то, что многие реализации Telnet умеют передавать сразу всю введенную строку символов, обычно эта возможность не используется, ибо пользователь хочет получить незамедлительную реакцию удаленного компьютера на введенный символ. Кроме того, удаленный компьютер посылает пакет-подтверждение с копией введенного символа обратно пользователю. В общем, Telnet создает двунаправленный поток данных, состоящий из маленьких пакетов.
IP-заголовки имеют длину в 20 байт. Заголовки TCP имеют длину также в 20 байт. Отсюда следует, что сеанс Telnet создает пакеты данных длиной в 40 байт заголовков для каждого переданного символа в один байт. Для понимания принципа работы CSLIP нужно усвоить два различных, но тесно связанных понятия: эффективность линии и интерактивная реакция системы. Эффективность линии — это коэффициент, равный длине заголовка TCP/IP пакета, деленной на длину заголовка плюс длину данных пользователя в этом пакете. Вычислим эффективность линии для сеанса Telnet.
1 Предположим, что программа Telnet передает один пакет на одно нажатие клавиши, которое, в свою очередь, состоит из одного символа длиной в байт.
2 Пакет данных, содержащий символ длиной в байт и снабженный TCP/IP заголовками (еще 40 байт), будет иметь длину в 41 байт.
3 Приемник пакета должен послать обратно подтверждение о доставке, и это будет пакет такой же длины в 41 байт. Таким образом, одно нажатие на клавишу приводит к передаче по сети двух пакетов общей длиной по 41 байт. (Мы помним, что пакет-подтверждение тоже содержит TCP/IP заголовки и переданный символ в качестве эха.)
4 Теперь сосчитаем эффективность линии по приведенной выше формуле. (Она составит менее трех процентов.)
Эффективность линии = Данные / (Размер_заголовка + Данные)
Эффективность линии = 1 байт / (40 байтов + 1 байт)
Эффективность линии = 1 байт / 41 байт
Эффективность линии = 0.0244
Эффективность линии = 2.44 процента
Процесс передачи по TCP/IP дуплексный, так как пакеты данных следуют независимо друг от друга в обоих направлениях, поэтому эффективность линии считается независимо для обоих направлений. Впрочем, в нашем случае результат одинаков как для одного, так и для другого направления.
Как следует из формулы, для увеличения эффективности линии надо либо увеличить количество данных в пакете, либо уменьшить размер заголовков. Алгоритм CSLIP концентрирует внимание на уменьшении размеров заголовков пакетов. Кроме того, CSLIP соблюдает требования интерактивной реакции системы. Интерактивность реакции системы — это просто ее свойство убедить пользователя в том, что все работает. Например, когда пользователь нажимает клавишу, он, вполне понятно, хочет увидеть, как введенный символ отобразится на его мониторе. Если работа сети приводит к ощутимым задержкам при передаче пакета, пользователь расценит интерактивность сети как неудовлетворительную.
Человеческий фактор — еще одно понятие, которое следует иметь в виду при проектировании интерактивных систем. Для программиста важно, как человек отнесется к тому или иному поведению системы, с которой он работает. Алгоритмы CSLIP, безусловно, принимают в расчет и человеческий фактор тоже.
Человеческий фактор
В дополнение к такому понятию, как эффективность линии, CSLIP рассматривает человеческий фактор. Понятие человеческого восприятия тоже относится к человеческому фактору. Нормальной задержкой в получении эха от нажатия клавиши можно считать интервал до 100—200 миллисекунд. По прошествии этого времени интерактивность системы считается пользователем неудовлетворительной.
В RFC 1144 рассматривается, каким образом особенности передачи заголовков пакетов сетевых данных могут влиять на восприятие ситуации пользователем. Предположив, что каждый введенный символ приводит к появлению двух пакетов длиной в 41 байт, получим, что для обеспечения задержки эха не более чем на 200 миллисекунд, необходимо, чтобы скорость обмена составляла по меньшей мере 4000 бит в секунду. Другими словами, медленная последовательная линия заставляет пользователя думать, будто скорость работы программы мала, даже если программа вполне эффективна в действительности.
Неинтерактивная передача пакетов также может влиять на интерактивную реакцию системы. Например, чтобы передача неинтерактивных пакетов обладала эффективностью более 90 процентов при длине TCP/IP заголовков в 40 байт, необходимо сохранять максимальную длину пакета (MTU) в диапазоне от 500 до 1000 байт. Предположим далее, что ваше соединение SLIP имеет MTU 1024 байт при скорости модема 9600 бод. При этом один пакет в одну сторону будет передаваться приблизительно в течение секунды. Любой интерактивный сеанс будет при этом ждать окончания передачи неинтерактивного пакета.
Влияние аппаратных средств
Кроме рассмотренного нами человеческого фактора, на проектирование протокола также влияют и некоторые особенности аппаратных средств. Производители модемов используют различные способы увеличения эффективности работы этих устройств. При программировании приложений нет необходимости знать досконально, что происходит внутри модема, однако нужно обратить внимание на некоторые вещи.
Теория связи оговаривает фактическую полосу пропускания между двумя устройствами. Эффективная полоса пропускания в зависимости от используемой техники позволяет увеличить (и превысить) фактическую полосу пропускания при сжатии передаваемых данных. Сжатие данных позволяет передать их больше за одно и то же время. В некоторых случаях достигаемая при этом скорость передачи превышает теоретический предел скорости канала связи.
В дуплексном протоколе, характерном для модема, данные следуют в обоих направлениях одновременно. Однако для обоих направлений редко применяется одна и та же полоса пропускания, так как одна из сторон, участвующих в соединение, скорее всего передает больше данных, чем другая. Именно для нее отводится большая полоса пропускания за счет противоположной стороны. Распределение полосы пропускания происходит прозрачно для пользователя и управляется самим модемом.
Чтобы определить, какая из сторон в соединении требует большей полосы, производители модемов считают, что одной из сторон всегда является человек, и именно она требует наибольшей полосы. Модем должен самостоятельно догадаться об этом. За отправную точку берется скорость в 300 бит в секунду. Большинство людей не могут печатать со скоростью, превышающей указанную. К сожалению, ситуация меняется, как только мы начинаем передавать пакеты TCP/IP с заголовками из сорока байт на каждый введенный символ. Скорость увеличивается в соотношении 40:1 и заставляет модем часто менять полосы в противоположных направлениях. IP-пакет размером в 41 байт состоит из 328 бит, что выходит за пределы, предписанные для узнавания человека модемом. При покупке модема следует обращать внимание на такие тонкости, как поддерживаемые типы сжатия данных и другие возможности по передаче данных. Покупка хорошего в этих отношениях модема позволит вам значительно увеличить производительность сетевого соединения. Помните, что ваш поставщик услуг Интернет иногда может дать вам хороший совет, объяснив, какая модель модема подойдет вам лучше всего и почему.
Современная архитектура модемов позволяет сократить потребность в скорости передачи нажатий клавиш до 300 бит в секунду и даже меньше. Если мы рассматриваем десятибитовую последовательность на один символ (восемь бит данных плюс старт- и стоп-биты), 300 бит в секунду образуют полосу пропускания в 30 байт данных в секунду. Обычная скорость печати на клавиатуре составляет 5 символов в секунду. Таким образом, для передачи заголовков остается 25 байт (30 — 5) при условии сохранения выбранной максимальной полосы пропускания в 300 бит в секунду. Другими словами, на один передаваемый символ допустимо передать еще и пятибайтовый заголовок. Кроме того, такая передача сохраняет хорошую интерактивность системы, так как пауза между нажатием и получением эха у нас не превысит 200 миллисекунд при скорости 4096 бит в секунду.