Адресация и маршрутизация сообщений

Вид адреса

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

Адрес почтового сообщения состоит из шести уровней. Формат адреса следующий:

C:UA/ADMD:EAST_Region/PRMD:KHARKOV/ORG:FOSS/OU:DEPARTMENT/PN:SEM

где:

C — страна;
ADMD — регион административного управления;
PRMD — регион частного управления;
ORG — организация;
OU — отдел;
PN — персональный номер.

Уровни адресации разделены символом «/». Каждый из уровней может принимать свое значение, которым и определяется конечный адрес получателя.

Маршрутизация

Для маршрутизации сообщений применяются маршрутные таблицы. В папке #ROUTE_DIR, определенной в файле конфигурации host.cfg (по умолчанию FossMail32\Route), находятся шесть файлов  С.LST, ADMD.LST, PRMD.LST, ORG.LST, OU.LST и PN.LST, имена которых совпадают с уровнями адреса почтового сообщения. Эти файлы носят название маршрутные таблицы. Маршрутизация сообщения начинается с верхнего уровня адреса — уровень С и заканчивается уровнем PN. Формат каждой маршрутной таблицы следующий:

.POST:; комментарии
.EAST_Region:NAME1;  комментарии
.*:NAME2;  комментарии

Строка начинается с символа «.», далее следует значение адреса соответствующего уровня, оканчивающееся двоеточием. После двоеточия может указываться имя направления (это соседний почтовый сервер или конечный получатель сообщения). Оканчивается запись точкой с запятой, после которых могут идти комментарии. Вместо значения адреса может использоваться символ «*».

Сообщение принимается на обработку маршрутизатором, который производит анализ адреса получателя. Записи в соответствующей маршрутной таблице сравниваются со значением адреса соответствующего уровня. Алгоритм обработки следующий:

  1. не найдено совпадение и отсутствует строка типа: .*:NAME2; — адреса не существует, формируется отчет о недоставке сообщения;
  2. найдено совпадение в строке типа: .POST:; — рассматривается следующий уровень маршрутизации;
  3. найдено совпадение в строке типа: .EAST_Region:NAME1; — сообщение передается на направление NAME1;
  4. не найдено совпадение и присутствует строка типа: .*:NAME2; — сообщение передается на направление NAME2;

Рассмотрим маршрутизацию сообщений на примере фрагмента сети, состоящей из трех почтовых серверов, объединенных между собой по топологии «ЗВЕЗДА».routing

Каждый почтовый сервер (узел) имеет свое имя, которое задается в файле конфигурации host.cfg и в файле лицензии, параметр #HOST_NAME. В пределах одной корпоративной сети не может существовать двух почтовых серверов с одинаковыми именами. Имена узлов могут быть произвольными. В нашем случае сервера именуются, например, AAA, BBB и CCC.

Будем считать, что пользователь с адресом

C:UA/ADMD:POST/PRMD:KIEV/ORG:INSTITUTION/OU:BRANCH/PN:Andrew

отправляет сообщение пользователю с адресом

C:UA/ADMD:EAST_Region/PRMD:KHARKOV/ORG:FOSS/OU:DEPARTMENT/PN:Sem.

Согласно топологии сети наше сообщение должно пройти через сервер с именем AAA и попасть на сервер ССС, который обслуживает нашего клиента с именем Sem.

Маршрутизация начинается с верхнего уровня адреса — уровень С Рассмотрим маршрутные таблицы на каждом из серверов, которые обеспечат такое движение сообщения. Анализировать будем только те маршрутные таблицы, которые будут участвовать в работе и значащие записи в них.

На сервере с именем BBB маршрутная таблица C.LST имеет запись следующего формата
.UA:;
Когда маршрутизатор анализирует адрес получателя сообщения, он сравнивает эту запись со значением уровня маршрутизации С:UA в адресе сообщения. Данные записи совпадают и принимается решение о рассмотрении следующего уровня маршрутизации ADMD. 

Маршрутная таблица ADMD.LST имеет следующие записи:

.POST:; 
.EAST_Region:AAA;

Учитывая, что строка /ADMD:EAST_Region в адресе получателя сообщения на уровне ADMD совпадает со строкой EAST_Region в маршрутной таблице, принимается решение отправить сообщение на сервер с именем AAA. 

На сервере AAA процесс маршрутизации повторяется. Здесь маршрутная таблица ADMD.LST имеет следующие записи:

.POST:BBB; 
.EAST_Region:CCC;

Что приводит к передаче сообщения на сервер CCC.

На сервере с именем ССС маршрутизация производится вновь, но уже с уровня PRMD, т.к. на уровне ADMD в маршрутной таблице существует запись

.EAST_Region:;

которая совпадает со значением нашего адреса на этом же уровне.

В маршрутных таблицах PRMD.LST, ORG.LST и OU.LST должны существовать записи соответственно .KHARKOV:; FOSS:; и DEPARTMENT:;, что приведет к рассмотрению маршрутной таблицы PN.LST, в которой обычно перечислены все клиенты этого сервера. Т.е. там присутствует запись .Sem:Sem; которая означает, что сообщение нужно отправить в почтовый ящик Sem. 

Если был запрошен отчет о доставке, то он сформируется маршрутизатором и отправится на адрес

C:UA/ADMD:POST/PRMD:KIEV/ORG:INSTITUTION/OU:BRANCH/PN:Andrew

по обратному маршруту.

Управление маршрутными таблицами осуществляется из программы Cfg_Client.

Адрес почтового сервера

Каждый почтовый сервер кроме имени имеет свой адрес, который  определяется параметром #ADDRESS_HOST файла host.cfg. Этот адрес должен соответствовать параметрам маршрутных таблиц. Пример адреса почтового сервера приведен ниже.

C:UA/ADMD:EAST_Region/PRMD:KHARKOV/ORG:FOSS/OU:DEPARTMENT/PN:_$$HOST.

На уровне PN в адресе почтового сервера всегда присутствует значение _$$HOST. Каждый уровень, записанный в адресе почтового сервера, должен присутствовать в маршрутной таблице соответствующего уровня без указания направления дальнейшей передачи сообщения. Например, для сервера с таким адресом на уровне ADMD должна быть запись типа EAST_Region;. Система при установке формирует адрес почтового сервера и проверяет его при каждом старте.

 P.S. Данная статья предназначена для понимания внутренней системы маршрутизации сообщений администратором почтового сервера. Обычно, при отправке сообщений клиенты используют Глобальную адресную книгу, которая формируется системой автоматически и адреса пользователей используются как внутренняя информация системы. Но, при желании, адрес можно ввести вручную и сообщение будет доставлено получателю.