以下是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跳过了整个问候语,我怀疑其他客户端也可能这样做。