2016-10-15 14 views
2

Ниже начало примера SMTP транзакции, показанной в учебнике Компьютерные сети (шестое международное издание):Правильный ответ на SMTP HELO

S: 220 hamburger.edu 
C: HELO crepes.fr 
S: 250 Hello crepes.fr, pleased to meet you 

Приставка S: указывает, что это линия отправлено на сервере, C:, что это строка, отправленная клиентом. На странице Wikipedia SMTP есть пример SMTP , который имеет аналогичный ответ HELO.

Ответчик сервера на HELO соответствует требованиям? RFC 5321 определяет ответ сервера на HELO/EHLO таким образом:

ehlo-ok-rsp = ("250" SP Domain [ SP ehlo-greet ] CRLF) 
        /("250-" Domain [ SP ehlo-greet ] CRLF 
        *("250-" ehlo-line CRLF) 
        "250" SP ehlo-line CRLF) 

Как я понимаю, спецификации, ответ сервера в приведенном выше примере должен быть

250 hamburger.edu 

То есть, он должен ответить 250 последовал по собственному имени хоста, а не по имени хоста клиента и, конечно же, не произвольное приветственное сообщение, показанное в этом примере .

Каков правильный ответ HELO? Является ли Сетевой компьютер Пример неправильный?

ответ

3

Короткий ответ

пример не действует из-за паразитной Hello только после 250. Но .. это, наверное, не имеет значения.

Долгий (вдовцы) ответ

Сначала давайте рассмотрим синтаксис для клиента "HELO":

"HELO" SP Domain CRLF

Клиент посылает HELO, а затем пробел, за которым следует его доменное имя, а затем CRLF. Как узнать, что это домен клиентов?Ну:

Предложение аргументов содержит полное доменное имя клиента SMTP, если он доступен

Теперь ответ:

EHLO-ок-RSP = (Домен «250» SP [SP ehlo-greet] CRLF) /(«250-» Домен [SP ehlo-greet] CRLF * («250-» ehlo-line CRLF) «250» SP ehlo-line CRLF)

Есть два варианта здесь:

  1. "250" SP Domain [ SP ehlo-greet ] CRLF
  2. ("250-" Domain [ SP ehlo-greet ] ...

Оба они не соответствуют, так как имя домена, как ожидается, вместо Hello мы видим.

Следующая часть ehelo-greet часть в порядке, хотя. Это объясняется на следующей странице: RFC

EHLO-Приветствуйте = 1 * (% d0-9 /% d11-12 /% d14-127) ; строка любых других, чем CR или LF

символов

Так это может быть любая строка, которая не содержит \r или \n. Строка , pleased to meet you явно относится к этой категории.

Почему это не имеет значения

Сказав все это, заметьте, что тот факт, что пример является недействительным, не означает, что это не происходит на практике, или что сервер, на котором будет отправить такой пример не получится. Есть разница между теорией и практикой. Например, если мы посмотрим на Java официальный JavaMail, в SMTPTransport.java, на линиях 1662-1665 мы находим следующий код:

if (first) { // skip first line which is the greeting 
    first = false; 
    continue; 
} 

Это из метода с именем ehlo(String domain), который обрабатывает передачи и приема команды HELO. JavaMail пропускает всю строку приветствия, и я подозреваю, что другой клиент может сделать то же самое.

+0

Возможно, было правильно ответить HELO на «Домен» клиента, но Postfix и Exim оба ответят своим собственным доменом. Я согласен с тем, что разрешено отправлять произвольное сообщение в HELO, но, конечно, пример в моем вопросе «250 Hello crepes.fr, рад встретиться с вами» неверен. Кажется, что это должно быть «250 crepes.fr Привет, рад познакомиться». – cgt

+1

Это правда, что RFC явно не указывает, какое доменное имя будет возвращено, но для меня кажется, что авторы имели в виду доменное имя клиента. О ответе в примере - вы правы, я пропустил бродячий Hello сразу после 250. Я обновлю ответ соответствующим образом. – Malt

2

В RFC 821 фактически не указано, что такое ответ на HELO, но все примеры использовали домен получателя как тело сообщения. Позднее RFC определили расширенный привет (EHLO), который на самом деле имеет определенный формат ответа. Но, учитывая отсутствие ясности в исходном стандарте, практически что-либо между 250 и CR является кошерным, когда клиент настолько небрежен, что отправляет HELO вместо EHLO.