Смекни!
smekni.com

Электронная почта как сервис глобальной сети. Протоколы передачи почты (стр. 7 из 12)

В результате оператора 2В имеется два старших бита нового шестибитного символа. Биты с 1 по 4 должны быть взяты из второго символа. Чтобы получить четыре бита из второго символа, его содержимое сдвигается вправо на четыре позиции (оператор 2С). Результат оператора 2 С помещается во вспомогательную переменную cTempLow. Теперь в переменной cTempLow хранятся четыре младших бита нового символа, а в переменной cTempHigh — два старших. Для того чтобы их скомбинировать, мы используем оператор (2D) двоичного ИЛИ. Результат операции заносится в переменную cSecond6Bits.

В третий шестибитный символ должны попасть четыре младших бита символа Е и два старших бита символа N. То есть нужно переместить четыре младших бита символа Е с позиций 1 - 4 на позиции 3 - 6. Для этого оператор 3А сдвигает биты влево на две позиции и помещает результат в переменную сТеmр. Сдвиг влево очищает позиции 1 и 2 для следующих данных. Кроме того, необходимо убедиться, что позиции 7 и 8 тоже свободны. Другими словами, нам нужны только биты в позициях 3 - 6. Чтобы очистить ненужные и оставить нужные позиции, выполняется оператор “двоичное И” с маской 00111100 (0х3С). Результат оператора 3В помещается в переменную cTempHigh.

Далее два старших бита символа N необходимо сдвинуть на позиции 1 и 2. Для этого выполняется оператор ЗС сдвига вправо на 6 позиций. Результат заносится в переменную cTempLow. Теперь у нас есть четыре младших бита символа Е в переменной cTempHigh и два старших бита символа N в переменной cTempLow. Оператор 3D комбинирует значения двух этих переменных при помощи двоичного сложения (ИЛИ) и помещает новое шестибитное значение в переменную cThird6Bits. Теперь получить четвертое шестибитное значение становится просто, т.к. все биты уже стоят на своих позициях с 1 по 6 в символе N. Осталось маскировать значения битов позиций 7 и 8. Оператор 4 выполняет “двоичное И” с маской 00111111 (Ox3F) и заносит результат в переменную cFourth6Bits.

Декодирование данных по методу Base-64

Операторы языка C/C++, реализующие способ декодирования Base-64:

cTempHigh = cFirst6Bits <<2; (5A)

cTempLow = cSecond6Bits >> 4; (5B)

cFirstLetter = cTempHigh | cTempLow; (5C)

cTempHigh = cSecond6Bits << 4; (6A)

cTempLow = cThird6Bits >> 2; (6B)

cSecondLetter = cTempHigh | cTempLow; (6C)

cTempHigh = cThird6Bits << 6; (7A)

cThirdLetter = cTempHigh | cFourth6Bits; (7B)

Значения полученных четырех шестибитных символов формата Base-64 хранятся в переменных cFirst6Bits, cSecond6Bits, cThird6Bits и cFourth6Bits. Операторы с 5А по 7В демонстрируют, как декодировать эти значения. Чтобы получить каждый байт (кроме третьего) в последовательности, производятся операции левого сдвига, правого сдвига и битового ИЛИ. (Для третьего символа правый сдвиг не нужен - требуются только левый сдвиг битовое ИЛИ.) Ключевой момент - знать, на сколько позиций сдвигать в каждом направлении. Шесть битов первого символа Base-64 являются старшими шестью битами первого байта данных. Их необходимо переместить с позиций 1 - 6 на позиции 3 - 8. Для этого выполняется операция сдвига влево на две позиции (оператор 5А). Поскольку эти биты старшие, результат заносится в переменную cTempHigh. Теперь требуются биты с позиций 5 и 6 из второго символа Base-64. В них занесены два младших бита первого байта данных. Сдвиг вправо на четыре позиции оператором 5В решает проблему. Результат оператора 5В заносится в переменную cTempLow. Теперь есть шесть старших битов в переменной cTempHigh и два младших бита в переменной cTempLow. Oператор 5С, битовое ИЛИ, комбинирует их значения, и в результате получается первый байт данных.

Чтобы получить второй байт данных, выполняются практически те же операторы. Только вместо сдвига влево на два и сдвига вправо на четыре делается сдвиг влево на четыре, а вправо на два, как продемонстрировано операторами 6А и 6В. Оператор 6С, битовое ИЛИ, комбинирует полученные результаты операторов 6А и 6В и получает значение второго байта данных. Биты с 1 по 6 четвертого символа Base-64 соответствуют младшим битам третьего символа данных. Биты 7 и 8 символа данных содержатся на позициях 1 и 2 третьего символа Base-64. Поэтому значение третьего символа сдвигается вправо на шесть позиций оператором 7А. Наконец, в результате оператора 7В, битовое ИЛИ, получается третий байт данных.

Реализация алгоритма

Метод кодирования Base-64 оперирует с 24-битными величинами. Алгоритмы кодирования и декодирования также оперируют 24-битными величинами. Другими словами, хотя в предыдущем разделе и не рассматривались прототипы функций для кодирования-декодирования Base-64, предполагалось, что у них 24-битные аргументы. Алгоритм кодирования состоит из десятка очень быстрых (поскольку все они работают с двоичной информацией) операторов, преобразующих три байта данных в четыре шестибитных символа Base-64 и восьми строк с такими же быстрыми операторами, преобразующими эти символы в три 8-битных символа исходных данных.

2.3. Протокол доставки почты (POP).

Post Office Protocol (POP) - протокол доставки почты пользователю из почтового ящика. Многие концепции, принципы и понятия протокола POP аналогичны SMTP. Команды POP практически идентичны командам SMTP, отличаясь в некоторых деталях.

В настоящее время существуют две версии протокола POP – РОР2 и РОРЗ. Обе версии обладают примерно одинаковыми возможностями, однако, несовместимы друг с другом. Дело в том, что у РОР2 и РОРЗ разные номера портов протокола. Между ними отсутствует связь, аналогичная связи между SMTP и ESMTP. Протокол РОРЗ не является расширением или модификацией РОР2 - это совершенно другой протокол. РОР2 тесно связан с протоколом SMTP. Набор и структура команд РОР2 параллельны набору и структуре команд SMTP. РОРЗ, однако, разработан с учетом специфики доставки почты на персональные компьютеры и соответствующих операций.

Раньше почтовые сообщения большинства сетей доставлялись непосредственно от одного компьютера к другому. Если пользователь часто менял рабочие компьютеры или один компьютер принадлежал нескольким пользователям, существовали определенные проблемы. В настоящее время большинство систем электронной почты доставляют сообщения не на отдельные компьютеры, а в специальные потовые ящики, находящиеся на почтовом сервере. Для того, чтобы прочитать свою почту, пользователю необходимо войти в сеть и получить доступ к почтовому серверу. Данный процесс достаточно сложен для начинающих пользователей, удаленный вход часто запрещается администраторами по соображениям безопасности, и, вдобавок ко всему, чтобы прочесть или отослать почту, нужно было пользоваться почтовым агентом самого сервера. Специальный протокол доставки почты POP и стал альтернативой всем вышеописанным проблемам.

Протокол РОРЗ

Конструкция протокола РОРЗ обеспечивает возможность пользователю войти в систему и изъять накопившуюся почту, вместо того чтобы предварительно входить в сеть. Пользователь получает доступ к РОР-серверу из любой системы в Internet. При этом он должен запустить специальный почтовый агент (UA), понимающий протокол РОРЗ. Во главе модели POP находится отдельный персональный компьютер, работающий исключительно в качестве клиента почтовой системы. В соответствии с этой моделью персональный компьютер не занимается ни доставкой, ни авторизацией сообщений для других. Также сообщения доставляются клиенту по протоколу POP, а посылаются по-прежнему при помощи SMTP. То есть на компьютере пользователя существуют два отдельных агента-интерфейса к почтовой системе - доставки (POP) и отправки (SMTP). Разработчики протокола РОРЗ называет такую ситуацию “раздельные агенты” (split UA).

В протоколе РОРЗ оговорены три стадии процесса получения почты: авторизация, транзакция и обновление. После того как сервер и клиент РОРЗ установили соединение, начинается стадия авторизации. На стадии авторизации клиент идентифицирует себя для сервера. Если авторизация прошла успешно, сервер открывает почтовый ящик клиента и начинается стадия транзакции. В ней клиент либо запрашивает у сервера информацию (например, список почтовых сообщений), либо просит его совершить определенное действие (например, выдать почтовое сообщение). Наконец, на стадии обновления сеанс связи заканчивается. В табл. 7 перечислены команды протокола РОРЗ, обязательные для работающей в Internet реализации минимальной конфигурации.

Таблица 7

Команды протокола POP версии 3 (для минимальной конфигурации)

Команда Описание
USER Идентифицирует пользователя с указанным именем
PASS Указывает пароль для пары клиент-сервер
QUIT Закрывает TCP-соединение
STAT Сервер возвращает количество сообщений в почтовом ящике плюс размер почтового ящика
LIST Сервер возвращает идентификаторы сообщений вместе с размерами сообщений (параметром команды может быть идентификатор сообщения)
RETR Извлекает сообщение из почтового ящика (требуется указывать аргумент-идентификатор сообщения)
DELE Отмечает сообщение для удаления (требуется указывать аргумент-идентификатор сообщения)
NOOP Сервер возвращает положительный ответ, но не совершает никаких действий
LAST Сервер возвращает наибольший номер сообщения из тех, к которым ранее уже обращались
RSET Отменяет удаление сообщения, отмеченного ранее командой DELE

В протоколе POР3 определено несколько команд, но на них дается только два ответа: +OK (позитивный, аналогичен сообщению-подтверждению АСК) и -ERR (негативный, аналогичен сообщению “не подтверждено” NAK). Оба ответа подтверждают, что обращение к серверу произошло и что он вообще отвечает на команды. Как правило, за каждым ответом следует его содержательное словесное описание. Сейчас будут рассмотрены несколько типичных сеансов РОРЗ, что даст возможность уловить последовательность команд в обмене между сервером и клиентом.