00-1010我们经常使用电子邮件客户端,如Foxmail和Outlook来发送和接收电子邮件。你应该知道邮件协议的基本知识。发送邮件是通过SMTP协议完成的,而接收邮件是通过POP3协议完成的。由于工作原因,笔者对邮件协议的通信过程做了完整的分析,从而巩固对通信协议的理解。
背景
我曾经做过一个基于UDP字节序列的应用:在两个进程之间【一个是用Java开发的,一个是C进程】,通信业务是通过对UDP包中的字节数据进行逐一解析来完成的,最小的业务数据单元是比特。一般过程是这样的:
循环读取UDP数据包。首先,取出第一个字节,读取该字节的前两位数据。它表示某一服务类型的服务数据的总长度。读取第二个字节后回收数据,直到达到总长度。很多年过去了,那个应用的具体功能已经忘记了,但是UDP字节数据的分析过程还是很清晰的。它让我明白了什么是协议,其实是基于简单处理规则的通信协议,也可以看作是自定义的应用层协议。
这个可以扩展到OSI七层模型中的其他协议,类似于这个简单的协议,只是通信规则比较复杂!
协议是什么
SMTP被称为“简单邮件传输协议”,这是来自百度百科的解释:SMTP是一种相对简单的基于文本的协议。在其上指定一个或多个消息接收者(在大多数情况下,他们被确认存在),然后发送消息文本。您可以通过telnet程序轻松测试SMTP服务器。使用SMTP TCP端口25,需要MX(邮件交换)DNS来确定给定域名的SMTP服务器。
让我们先来看看SMTP的状态代码和命令集:
SMTP状态代码和命令集
然后,我们来看看Foxmail邮件的数据包捕获分析。在消息中,状态代码包含邮件服务器响应的内容,命令由客户端发起。
00-1010客户端启动了SMTP通信以连接到邮件服务器。这是我截获的分析过的通讯内容:
沟通过程
这里使用的关键命令是gsdbl和AUTH LOGIN,它们用于启动会话和身份验证。客户端连接到服务器后的通信过程如下:
服务器回复220状态代码以通知客户端它准备好了;从客户端发送gsdbl命令;服务器回复250,表示欢迎;服务器回复一堆250(对应中间步骤);客户端启动AUTH LOGIN身份验证;响应334等待客户端发送认证信息;客户端发送认证信息的密文数据,使得密文通信进行两次;服务器回复235认证成功,并且认证过程完成。00-1010认证成功后,客户端将发件箱和所有收件箱地址发送给服务器,服务器验证后回复250 OK。
服务器身份验证回复
SMTP 协议基础
数据传输结果
发送消息正文的过程:
客户端发送数据命令;服务器回复354状态码,通知客户端可以发送邮件内容;客户端开始发送消息正文;服务器回复250;客户端发送QUIT命令结束会话;服务器回复221,告诉客户端它正在关闭传输通道。00-1010以上是一封邮件经过的完整过程,就像客户端和服务器隔空喊话,每一步都有问有答,井然有序。这样看完,发现通信协议挺有意思的。这大概就是应用层协议的一般思路。定义业务规则和状态码,按照双方约定的流程进行通话。
了解了这个过程之后,如果在工作中需要通信,可以参考网络协议的设计思路,实现基于Socket的通信服务应该不复杂!