SMTP服务:对检查点和重新开始功能的扩展

本文主要说明SMTP服务的扩展,这个扩展主要为了解决当在进行SMTP服务时,连接突然中断的时候如何再次开始服务,开始服务的时候不用再次重新开始。虽然SMTP协议已经被广泛使用,而且也是够健壮的了,可是在一些连接不十分可靠而且发送的数据又十分大的时候,对它服务的扩展就是必要的了。原来的SMTP协议中对TCP连接中断后再次建立起来时应该怎么继续进行操作进行规定,它处理的办法就是简单的重新开始,这对于大数据来说简直就是恶梦。
说来也没有什么神秘的,在进行SMTP服务时,服务器一方提供一种机制唯一地定义一个SMTP服务(因为服务器那里有许多SMTP服务,不记住就乱了),SMTP服务在进行的时候服务器进行记录,记录干到哪一步了,将来连接中断后,服务器上还保存了中断前的情况,在客户恢复连接以后就可以再次从上次中断的地方开始了,它类似于FTP服务中的断点续传功能。这个服务扩展也可以用于在客户机等待超时的处理,但是这样做一定要小心。
这个服务的大体框架如下:
(1) 这个服务扩展的名称就叫做检查点(checkpoint)
(2) 关键字EHLO与此服务一起使用时要加上CHECKPOINT值;
(3) CHECKPOINT EHLO使用时再不带参数
(4) 在使用TRANSID参数时可选的参数被加于MAIL FROM命令中,这人参数和由EHLO命令发来的客户名加在一起构成了一个全局唯一的标记,这个标记用于区别某客户特定的操作。这个值对大小写是敏感的。 (5) 因为多了一些命令,MAIL FROM命令的长度也长了88个。

下面我们来具体说一下这个服务扩展。当客户需要这项服务扩展时,它首先向服务器发送EHOL命令,如果服务器返回代码250,以包括CHECKPOINT响应,说明服务器支持检查点服务。当然在开始进行SMTP服务器后,客户也可以请求服务器进行这项服务扩展。
与TRANSID一起使用的参数必须让服务器能够唯一标记这个SMTP操作。一个MAIL命令只能发一个参数,在选择这个标记的时候一定要小心,如果忘记了就无法使服务器进行检查点服务器扩展了。请在下面的例子里看一下这个参数的使用。服务器在将会将这个标记存放于非易失性存储器内,也就是放在一个断电以后不会丢失数据的地方。这个数据只有在客户告知操作已经完成(或放弃,或显式地以QUIT命令退出)时才删除。当然这个数据也不会无限期地存储,在操作没有结束前,这个数据会保存一定时间,等待客户重新开始,如果客户在一定时间后没有开始,服务器也就把它删除了,这个时候的确定没有统一标准(一般为48小时),但最后还是管理员说了算。当客户查觉到连接失败时,它不能立刻重新连接,必须等服务器也知道连接失败后,释放已失败的连接时才可以重新连接,客户一般要等一段时间后才可以进行再次连接。在重新开始时,客户要寻找原来用于发送的SMTP服务器,如果这个服务器还在,那可以连接它继续未完成的发送,如果它不在了,那就必须重新发送了,客户不可能等待这个服务器重新可用。
找到服务器建立连接以后,客户以同样的标记向服务器发送MAIL命令,这时服务器会寻找失去连接时的环境参数,找到尽可能靠近失去连接时的确切位置,然后以下面的命令告诉用户从什么地方开始继续发送,这一点上大家一定要注意,从什么地方发是服务器说了算,不是客户说了算。

355 <接收到的字节数,也指示要开始的位置>

接收到的字节数不包括包头内的其它参数,指的就是实际的内容。如果发向客户的数是0,那客户很不幸要从头开始发,如果发向客户的数是1,那客户可以从2开始发。以于下面的例子如果有不明白的地方请参考SMTP协议规范。当环境建立好了以后,客户将所需要发送的数据发送完了,服务器就可以删除环境参数了。传送就完成了,万事大吉了。


下面是一个例子:

S: <等待连接TCP的端口25,这个端口是用于SMTP服务>
C: <打开与服务器的连接>
S: 220 dbc.mtview.ca.us SMTP service ready //服务器连接好了
C: EHLO ymir.claremont.edu
S: 250-dbc.mtview.ca.us says hello
S: 250 CHECKPOINT
C: MAIL FROM:<ned@ymir.claremont.edu> TRANSID=<12345@claremont.edu>
S: 250 <ned@ymir.claremont.edu>... Sender and TRANSID ok
C: RCPT TO:<mrose@dbc.mtview.ca.us>
S: 250 <mrose@dbc.mtview.ca.us>... Recipient ok //接收正常
C: DATA
S: 354 发送以CRLF.CRLF结束的检查点信息

<发了一些数据,此时会话被打断,TCP连接中断了。。。过了一会连接恢复了。。。>

S: <等待连接TCP的端口25,这个端口是用于SMTP服务>
C: <打开与服务器的连接>
S: 220 dbc.mtview.ca.us SMTP service ready
C: EHLO ymir.claremont.edu
S: 250-dbc.mtview.ca.us says hello
S: 250 CHECKPOINT
C: MAIL FROM:<ned@ymir.claremont.edu> TRANSID=<12345@claremont.edu>
S: 355 6135 is the transaction offset //告知客户已经发了6135字节了
C: DATA
S: 从6136开始发送
C: <已经发过的6135字节不发了>
C: .
S: 250 OK
C: QUIT //退出;
S: 221 Goodbye