3.2.1. Инкапсуляция данных РРР

Одной из целей при создании РРР было обеспечить работу нескольких сетевых протоколов по одному каналу связи независимо друг от друга. В RFC 1661 описана инкапсуляция РРР, используемая для этой цели, однако там не упомянута структура кадров, в которые упаковываются данные, поступившие из сетевого уровня соединения для передачи РРР.

Кадр данных РРР

При разработке кадра данных РРР (рис. 3.3) был использован имеющий статус стандарта документ ISO 3309 под названием “Передача данных — Процедуры управления соединением высокого уровня — Структура кадров (“Data Communications — High-Level Data Link Control Procedures — Frame Structure”), выпущенный в свет в 1979 году и описывающий простой протокол уровня соединения под названием HDLC (High-Level Data Link Control). B HDLC определен тот же, что и в кадре SLIP, принцип маркировки начала и конца кадра специальными флагами. В HDLC, кроме того, применяется контрольная сумма CRC (Cyclic Redundancy Check) для обнаружения возможных ошибок.

Флаг

0x7E

Адрес

0xFF

Управление

0x03

Данные, инкапсулированные PPP

Контрольная сумма CRC

Флаг

0x7E

байты

1

1

1

До 1500 байт

2

1

Рис 3.3. Формат кадра протокола РРР

В документе ISO вместо термина Cyclic Redundancy Check, CRC (что значит “контроль при помощи циклического избыточного кода”), используется более специфический: “контрольная последовательность кадра” (Frame Check Sequence, FCS).

В начале и конце каждого РРР-кадра помещается специальный флаг, имеющий значение 0x7Е.


Поле адреса и управления всегда заполнены одними и теми же значениями: 0xFF и 0х03 соответственно. Уровень соединения РРР использует символ 0x7D в качестве Esc-символа внутри кадра для обозначения символа 0x7Е (байт флага) или 0x7D (Esc-символ), которые могут иногда появиться среди данных пользователя.

При появление внутри кадра символа 0x7Е, с тем же, что и у флага, значением, уровень соединения РРР подставляет вместо него двухбайтную Esc-последова-тельность 0x7D, 0x5Е. Вместо того, чтобы передать 0x7Е, РРР передает Esc-символ (0x7D) и следующий за ним байт, получающийся как результат инвертирования шестого бита 0x7Е. В двоичном виде Ох7Е выглядит как 01111110, а 0x5Е равен 10 (обратите внимание на шестой бит). Таким же образом, если в потоке данных попадается байт 0x7D (Esc-символ), уровень соединения РРР подставит вместо него Esc-символ и результат инвертирования шестого бита Esc-символа, то есть 0x5D. В двоичном виде 0x7D равен 01111101, a 0x5D равен 01 (и здесь обратите внимание на шестой бит символа).

Множество модемов используют при работе так называемые служебные ASCII-символы (это те, коды которых меньше 0х20) для специальных целей. По умолчанию РРР кодирует такие символы точно таким же образом, что был описан выше. Кодирование управляющих ASCII-символов позволяет избежать возможных неприятностей, возникающих при неправильной их интерпретации оборудованием и программным обеспечением сетевых компьютеров.

Например, некоторые модемы используют символ 0х1В как собственный Esc-символ. Уровень соединения РРР заменит такой символ на Esc-последовательность 0x 7D, 0x3В. 0x1В равен 00011011 в двоичном виде, 0x3В — 00111011. Как и прежде, подставленный символ получился путем инвертирования шестого бита 0x1В. В данном случае из нуля получилась единица. В предыдущих примерах инвертирование приводило к замене единичного бита на нулевой.

Тип кадра данных в РРР

На рис. 3.4 показана структура пакета, вложенного в кадр данных РРР. Мы видим, что поле “Протокол” имеет ключевое значение в определении типа вложенных (инкапсулированных) данных. Оно образовано двумя байтами, следующими сразу в начале инкапсулированных данных, и определяет тип данных до конца кадра. Его значение 0х0021 означает, что инкапсулирована IP-датаграмма, то есть содержимое кадра предназначено для TCP/IP сети.

Номер протокола 0xС021 обозначает, что кадр содержит данные протокола управления соединением (LCP). LCP заведует установлением, конфигурацией и тестированием соединения РРР. Это значит, что информация, полученная РРР из такого кадра, будет использоваться им самим, а не передаваться куда-либо дальше по сети. Значение поля “Протокол”, равное 0х8021, означает присутствие данных для протокола NCP — управления сетью, который РРР использует для управления некоторыми сетевыми уровнями, например IP.