【无标题】

WebMail简介

WebMail系统是结合了email和WWW的邮件系统,用户通过浏览器登录邮件服务器万维网网站就可以进行邮件的编写、阅读、接收、发送。用户计算机无需安装专门的用户代理程序,只需要使用通用的万维网浏览器。邮件服务器网站通常提供非常强大方便的邮件管理功能,用户可以在邮件服务器网站上保存自己的邮件,而无需将邮件下载到本地进行管理。

假设用户A要给用户B发送邮件,他们使用的都是网易邮件服务器。用户A登录浏览器网页,撰写并发送邮件。邮件会上传到网易邮件服务器,而用户B登录网页后,可以读取收到的邮件。而若用户A要向用户C发送邮件,用户C使用的是谷歌邮件服务器,那么过程是类似的,只不过服务器之间的邮件传送需要使用SMTP协议。

 

总体流程图

通常,一封WebMail的发送需要经过用户代理、客户端邮件服务器和服务端邮件服务器等三部分的参与,WebMail从用户代理发送到客户端邮件服务器是使用 HTTP 协议。两个邮件服务器之间的传送使用 SMTP协议。邮件从服务端邮件服务器传送到 B 是使用 HTTP 协议。

 

具体流程

 

 

在浏览器(用户代理)输入URL找到客户端邮件服务器

先概括一下整个过程:

首先,浏览器向本地DNS服务器发送请求,若本地没有缓存该域名的IP地址,就需要通过递归或迭代的方式向根域名服务器、顶级域名服务器、权威域名服务器发起查询请求,直至返回一个IP地址给浏览器。然后根据该IP地址建立TCP连接,客户端发送HTTP请求,服务器返回报文,关闭TCP连接,再由浏览器进行解析渲染页面,最后TCP四次挥手结束连接(404:服务器找不到请求的页面)

1、浏览器解析url

浏览器会对输入的url进行解析,主要将其分为下部分:协议、网络地址、资源路径。其中网络地址指示该连接网络上哪一台计算机,可以是域名/IP地址,可以包括端口号;协议是从该计算机获取资源的方式,常见的是HTTP、HTTPS、FTP等。不同协议有不同的通讯内容格式,资源路径指示从服务器上需要获取资源的具体路径。

2、DNS域名解析

客户端收到你输入的域名地址后,它首先去找本地的hosts文件,检查在该文件中是否有相应的域名、IP对应关系,若有,则向其IP地址发送请求,若没有,再去找DNS服务器。

 

DNS服务器层级

DNS查询的具体步骤如下:

a、从浏览器缓存中查询。浏览器会存储一定时间的DNS记录,不同浏览器设置保存时限为一个固定值(不同浏览器情况不同,一般在2-30分钟)。

b、从操作系统缓存中查询。若浏览器中未包含想要的缓存记录,那浏览器就会发起操作系统请求,继续查询操作系统缓存

c、从路由器中查询DNS缓存。请求持续发送到你的路由,它通常会有自己的DNS缓存。

d、从ISP中查询DNS缓存。下一个被查询地方是ISP缓存DNS的服务器。

e、域名服务器迭代查询,根据返回的地址逐级向上查询。首先从root域名服务器中查询如.com域名服务器,然后逐步向前查询,.com顶级域名服务器到ruanyifeng的域名服务器。一般来说,.com级别的都已经在缓存中了,所以一般不会进行对root域名服务器的查询。

3、浏览器获取端口号

知道IP地址后,还需要端口号,这样才能知道对应主机的哪个应用程序

4、TCP建立连接

IP和端口都有了,在HTTP消息发送前,需要建立客户端与服务器的TCP链接,即进行所谓的三次握手。

TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接。

 

TCP三次握手的过程如下:

a、客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。

b、服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。

c、客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

5、发送HTTP请求

经过三次握手之后,与服务器建立了连接后,应用层就可以向服务器发起HTTP请求了。完整的发送流程如下:

1)应用层:浏览器封装 HTTP 请求报文,指定了一些请求参数与动作,以及一些要求响应报文的返回格式要求。紧接着,此报文会被推进 TCP socket中,等待运输层来收取。

2)传输层:将应用层发过来的数据报又一层封装,添加进源端口号和目的端口号以及相关差错检验字段。 最后将 TCP 数据报向下传递到网络层。

3)网络层:拿到数据报并封装成 IP 数据报,即在原 TCP 报文之上添加源 IP 地址和目的 IP 地址等字段信息。然后交由数据链路层。

4)数据链路层:拿到 IP 数据报,它需要封装成以太网帧才能在网络中传输,即它需要目的主机的 Mac 地址,然而只知道目的主机的 IP 地址。所以,链路层有一个 ARP 协议,直接或间接的能够根据目的 IP 地址获得使用该 IP 地址的主机 Mac 地址。当然,ARP 协议运行的前提是,目的 IP 地址和当前发送方主机处于同一子网络中。否则,发送方将目的 Mac 地址填自己网关路由的 Mac 地址,然后通过物理层发送出去。通过网卡、路由器、交换机等设备,实现两个IP地址之间的通信。

6、服务器处理请求

请求到达服务器之后,接下来服务器需要响应浏览器的请求。服务器端收到请求后的由HTTP服务器处理请求。HTTP服务器解析用户请求,知道了需要调度哪些资源文件,再通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过web服务器返回给浏览器客户端。

7、浏览器接收响应消息并显示内容

Web服务器发送的响应消息会被分成多个包发送给客户端,然后客户端需要接收数据。首先,网卡将信号还原成数字信息,协议栈将拆分的网络包组装起来并取出响应消息,然后将消息转交给浏览器。浏览器首先需要判断响应消息中的数据属于哪种类型。因为Web可以处理的数据包括文字、图像、声音、视频等多种类型,每种数据的显示方法都不同,因此必须先要知道返回了什么类型的数据,否则无法正确显示。原则上可以根据响应消息开头的Content-Type头部字段的值来进行判断。

8、关闭TCP连接

若浏览器和服务器之间无需进行数据传输了,将关闭TCP连接

我方服务器与对方服务器之间的交互(SMTP)

SMTP(Simple Mail Transfer Protocol)协议用于发送邮件,SMTP采用的是”推“(Push)的通信方式,即在用户代理向邮件服务器发送邮件及在邮件服务器之间发送邮件时,SMTP客户端主动将邮件“推”送到SMTP服务器端。SMTP 使用客户/服务器方式,负责发送邮件的 SMTP 进程是 SMTP 客户,而负责接收邮件的 SMTP进程是 SMTP 服务器,当两个进程建立了TCP连接后,WebMail就能通过该标准传输。

 

SMTP传输流程图

1、建立会话

SMTP命令:HELO
该阶段用于建立客户端与SMTP服务器的TCP连接,在此基础上,双方进行问候。SMTP服务器的默认端口号是25,若是支持SSL协议,则默认端口号是465。若采用的是STARTTLS协议,则默认端口是587,所谓的STARTSSL其实就是SSL协议,只是开始会话前双方客套一下,问一下对方你还支持SSL啊?

连接建立后,服务器会发送一条欢迎语。接着你就需要问候一下服务器,并带上你的机器的名称。如下:

S: 220 yeah.net Anti-spam GT for Coremail System (yeah[20141016])C: HELO your-computer-nameS: 250 OK

2、身份认证

SMTP命令:AUTH LOGIN
该命令用于进行身份验证,虽然这一步在SMTP协议中不是强制的要求,但目前几乎所有的SMTP服务器都需要进行身份认证。增加这一步可以大大减少垃圾邮件的存在,以及避免有人伪造其它发件人进行邮件的发送操作。
这一步中账号和密码需要进行base64编码,包括服务器发来的提示信息也是base64编码。
首先发送AUTH LOGIN命令,服务器会返回“334 XNlcm5hbWU6”,“dXNlcm5hbWU6”解码后为“username:”
UGFzc3dvcmQ6解码为"Password:"
即提示用户输入用户名和密码。认证成功后返回235。 接着根据服务器返回的提示,发送账号(发件人的邮箱账号)和密码。

C: AUTH LOGINS: 334 dXNlcm5hbWU6C: base64编码后的账号(发件人的邮箱账号)S: 334 UGFzc3dvcmQ6C: base64编码后的密码S: 235 Authentication successful

至于为何是base64编码,可能是SMTP协议设计时考虑到用户名和密码的重要性,所采用的最简单的“加密”手段。虽然base64只是编码方式,不是加密方式,但在早期控制台输入命令的情况下,别人还是一下无法像记住明文一样记住这些无规律的base64编码。不过随着SSL的应用,这些都已不重要了。

3、发送邮件信封

SMTP命令:MAIL FROM、RCPT TO
该阶段是告诉服务器发件人和收件人的邮箱地址,可以把这个阶段想象为你在写纸质信件的信封。MAIL FROM用于指定发件人邮箱,该邮箱地址其实就是上述身份认证中的账号,如:
MAIL FROM: <lig4961@yeah.net>
RCPT TO用于指定收件人邮箱,一次只能指定一个收件人地址,若收件人有多个的话,可以多次发送RCPT TO命令。

C: MAIL FROM: <lig4961@yeah.net>S: 250 Mail OKC: RCPT TO: <syfzxm@163.com>S: 250 Mail OKC: RCPT TO: <lig4961@yeah.net>S: 250 Mail OK

注意,邮件地址要用放入<>中,此外,每条命令发送完毕后,一定要判断服务器返回码是否是250。 若返回的不是250,说明你发送的地址可能是250,即不正确的地址,比如邮件地址中没有@,或者在同一个邮箱系统中,SMTP服务器发现收件人的地址并不存在,即没有注册过。

通过邮件客户端或网页写邮件时,不是有三种身份的收件人么?即:主送人(to)、抄送人(cc)、密送人(bcc)。是否存在RCPT CC和RCPT BCC命令,用于发送抄送人和密送人的邮箱地址呢?很遗憾,没有这两个命令。即说抄送人(cc)和密送人(bcc),也是通过RCPT TO命令进行发送。

既然发送时不区分,那么在收到的邮件中怎么还能看到主送人和抄送人呢?或者说如何做到让密送人在收到的邮件中看不见的。答案在下面邮件内容中。

4、发送邮件内容

SMTP命令:DATA

这一步是发送数据最多也是最复杂的一步,但操作命令却只有一个,就是DATA,即数据(邮件内容),邮件内容主要包括三个部分(可能会有内嵌资源文件,也可以理解为狭义上的附件):

邮件头;
邮件正文;
邮件附件;

DATA命令发送后,服务器会返回354响应码,并告诉客户端,数据结束要以"\r\n.\r\n"来标识。接下来客户端就可以发送整个邮件内容了。

DATA354 End data with <CR><LF>.<CR><LF>SUBJECT: =?UTF-8?B?5p2l6IeqU29mdGxlZe+8jOi/meaYr+S4gOWwgea1i+ivlemCruS7tg==?=FROM: <lig4961@yeah.net>TO: 'softlee1' <syfzxm@163.com>, 'softlee2' <lig4961@yeah.net>MIME-Version: 1.0Content-Type: multIPart/mixed;

boundary="=NextPart_SOFTLEE_Mail_E0B1A829CB1D4f55A037AE04B6A72078"

--=NextPart_SOFTLEE_Mail_E0B1A829CB1D4f55A037AE04B6A72078Content-Type: text/html; charset=utf-8Content-Transfer-Encoding: base64

PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQIPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwIPg0KDQo8aGVhZD4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQv

邮件内容的格式目前基本都采用MIME格式。
这里不具体介绍如何编码邮件正文和附件。主要介绍邮件头中的信息,主题(Subject)、发件人(From)、收件人(To)、抄送(Cc)。看查看邮件时,读到的主题、收件人和抄送人就来自于上述字段。这里收件人和抄送人仅作为邮件头的一部分进行展现,服务器并不会关心这些地址是否真实存在,或者说服务器并不关心这些地址是否跟使用RCPT TO命令发送的地址保持一致。回到第三阶段中最后的几个问题,可以通过邮件头来展现该邮件的抄送人是谁,并且将密送人隐藏掉。当然你也可以篡改上述信息,比如隐瞒某些收件人,或者将密送人也一并展现。
邮件正文和附件的编码可参照MIME格式的文章。最后所有数据发送完毕后,一定要发送"\r\n.\r\n",从而告诉SMTP服务器所有数据发送完毕。

5、会话结束

SMTP命令:QUIT
这一步非常简单,就是发送一条QUIT命令,QUIT命令发送完毕后,还是要判断服务器的返回码是否为250。若返回的不是,则表明发送失败,SMTP服务器可能不会将邮件转发到收件人所在的邮箱中,这一点很重要。

至此,整个SMTP协议介绍完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值