了解SMTP PIPELINING
RFC 2920第3.2节表明,服务器支持流水线MUST NOT
缓冲区响应无法识别的命令。是期望SMTP Protocol Violation Error
的理想响应
例如,这里有一个没有流水线但使用UNKNOWNCOMMAND
的文字记录
C: EHLO domain
S: 250-ServerName ..... 250-PIPELINING
C: UNKNOWNCOMMAND
S: 500 Unrecognized Command
C: EHLO domain
S: 250-ServerName ..... 250-PIPELINING
带流水线
C: EHLO domain
S: 250-ServerName ..... 250-PIPELINING
C: UNKNOWNCOMMAND\r\nEHLO domain
S: 500 Unrecognized Command
S: 250-ServerName ..... 250-PIPELINING
这是预期的行为,还是SMTP服务器不应该缓冲对未知命令和特定命令(RFC 2920,3.2节,第5节)的响应?所以对于流水线的UNKNOWNCOMMAND\r\nEHLO domain
,服务器应该只发送一个500 Unrecognized Command
响应并刷新500 Unrecognized Command
输入缓冲区吗?表现出这种行为的服务器是否遵守了更严格的约束?
发布于 2022-06-27 07:30:32
第3.2节的相关要点如下:
(6)服务器不得缓冲对无法识别的命令的响应。(9)在任何情况下,服务器不得刷新或以其他方式丢失TCP输入缓冲区的内容。
我将这两点解释为:如果在“单个”TCP数据包中发送未知命令,然后发送已知命令,服务器必须在再次从输入中读取之前立即发送对未知命令的响应。换句话说,您接收的是“两个”TCP数据包,而不是一个。除非您监视您的网络流量(或以编程方式测量精确的时间),否则您将无法注意到两者之间的差异。正如上面第9点所指出的,服务器可能不会重置其输入缓冲区。
作为一个客户端,您通常也可以在EHLO
和DATA
之后立即发送命令,而不会出现任何问题,因为大多数服务器在它们的输入缓冲区中不会向前看。但是,这样的客户端违反了管道扩展。检测这一点可以用作一种反垃圾邮件技术(请参阅这篇维基百科文章中的无效流水线)。
https://stackoverflow.com/questions/72742181
复制相似问题