以下是SMTP交易示例的开头,
教科书《计算机网络》(第六国际版):

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


S:前缀表示它是服务器发送的行,C:则是
客户端发送的一行。维基百科页面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的正确回应是什么?
计算机网络示例不正确吗?

最佳答案

简短的答案

由于Hello后面有杂散250,因此该示例无效。但是..那可能没关系。

更长的答案

首先,让我们看一下客户端“ HELO”的语法:


“ HELO” SP域CRLF


客户端发送HELO,后跟一个空格,后跟他的域名,然后是CRLF。我怎么知道它是客户域?好:


参数子句包含该域名的全限定域名
SMTP客户端(如果有)


现在回应:


ehlo-ok-rsp =(“ 250” SP域[SP ehlo-greet] CRLF)
/(“ 250-”域[SP ehlo-greet] CRLF
*(“ 250-” ehlo-line CRLF)
“ 250” SP ehlo-line CRLF)


这里有两个选项:


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


两者都不适合,因为需要域名而不是我们看到的Hello

下面的ehelo-greet部分很好。 RFC的下一页对此进行了解释:


ehlo-greet = 1 *(%d0-9 /%d11-12 /%d14-127)
;除CR或LF以外的任何字符的字符串


因此它可以是任何不包含\r\n的字符串。字符串, pleased to meet you显然属于该类别。

为什么没关系

说了这么多之后,请注意该示例无效,这并不意味着它实际上不会发生,或者发送此示例的服务器将无法正常工作。理论与实践之间是有区别的。例如,如果我们在1662-1665行的SMTPTransport.java中查看Java的官方JavaMail,则会发现以下代码:

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


这来自名为ehlo(String domain)的方法,该方法处理发送和接收HELO命令。 JavaMail跳过了整个问候语,我怀疑其他客户端也可能这样做。

08-16 00:08