以下是显示的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
也就是说,它应该以{{1}}回复,后跟自己的主机名,而不是 客户端的主机名,当然不是显示的任意问候消息 在示例中。
对250
的正确回应是什么?
计算机网络示例是否不正确?
答案 0 :(得分:3)
简短回答
由于Hello
之后的迷路250
,该示例无效。但是......这可能并不重要。
长(呃)回答
首先让我们看看客户的语法" HELO":
" HELO" SP域CRLF
客户端发送HELO
后跟一个空格,后跟他的域名,然后是CRLF。我怎么知道它是客户域名?良好:
argument参数包含完全限定的域名 SMTP客户端(如果可用)
现在回复:
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" 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
显然属于该类别。
为什么不重要
说完所有这些后,请注意这个例子无效的事实,并不意味着它在实践中没有发生,或者发送这样一个例子的服务器不会好好工作。理论与实践之间存在差异。例如,如果我们在SMTPTransport.java
中查看Java的官方JavaMail,请参阅第1662-1665行,我们会找到以下代码:
if (first) { // skip first line which is the greeting
first = false;
continue;
}
这是来自名为ehlo(String domain)
的方法,它处理发送和接收HELO
命令。 JavaMail会跳过整个问候语,我怀疑其他客户端也可以这样做。
答案 1 :(得分:2)
250
和CR之间的任何内容都是犹太人,当客户如此粗心地发送HELO而不是EHLO时。