总所周知,邮件是采用SMTP协议进行传输,但从TCP分层模块上看,这个其实是站在物理层的角度,而在传输层,还是依赖TCP/IP协议,假设A向B发送了一封邮件,本质是一次TCP/TP的通信过程。
一、应用层
启动应用程序,填写好对应邮箱和内容,点击发送按钮便开始了一个TCP/IP的通信。首先程序会进行编码处理,设置对应的编码,例如UTF-8。编码转换后,并不一定立即就会把邮件发出去,有可能是接收端主动接收或者被动接收,只有当开始接收邮件的时候,才会真正去建立通信连接,从一定的角度看是属于表示层和会话层的功能。
应用在发送邮件的那一刻建立TCP连接,通过建立的TCP连接将数据传输给下一层。
二、传输层
TCP模块提供可靠的端对端传输,负责连接建立、发送数据以及断开连接。为了实现端对端传输,需要在应用曾传过来的数据前附加一个TCP首部,TCP首部包含源端口、目的端口、序号(用以发送包中的那部分数据)、校验和(判断数据是否被损坏),随后将附加了TCP首部的包再发送给IP。
三、网络层
IP将TCP传过来的头部和应用数据组合和起来作为自己的数据,并在其基础加上自己的首部做为传输数据。因此,在IP数据包中IP首部后面紧跟着TCP首部,之后才是本身的数据,IP首部包含接收端IP地址、发送端IP地址以及判断数据是TCP和UDP。
IP包生成后,通过路由控制表决定接收此包的路由或主机。确定了路由或主机后,IP数据包会被发送给连接该路由或主机网络接口的驱动程序。如果还不知道具体接收的路由或主机,会通过ARP协议获取对端的MAC地址。
四、数据链路层
驱动接收到IP传过来的数据包,会在其基础上加上以太网首部并将通过物理层传输给到接收端。以太网首部包含接收端MAC地址、发送端MAC地址以及以太网类型,以太网类型用于表示首部的下一个协议,跟IP层中的标识是类似的作用。发送过程还会通过硬件计算校验序列FCS(循环冗余校验),主要是为了判断数据包是否被破坏。
最后通过物理层传输给接收端的数据包格式如下:
五、数据包的接收处理
包的接收流程跟发送流程是逆序的处理。主机收到以太网包后,首先会从以太网首部找到MAC地址判断是否是发给自己的,如果不是则丢弃。如果是,则查找以太网类型确认下数据的协议。从而传给对于处理,如果无法识别,则丢弃,此时这里是IP协议。
IP模块收到数据包后,也做类型处理,判断是TCP协议就交给TCP去处理,如果是有路由器的情况,此时接收端地址往往不是自己的地址,会进行转发。
TCP模块收到之后,会计算校验和,判断数据是否被破坏,然后检查是否按照序号接收数据,最后检查端口号,确定具体交付的应用程序。数据接收完毕,接收端会返回一个确认回执,如果发送端没收到确认回执,那么会认为接收端没收到而数据会一直反复发送。
应用程序收到具体的数据后,通过解析得到邮件的收件人地址,如果接收端不存在对应的邮箱地址,会返回错误信息,如果存在会接收并解析内容,此时用户便可以看到邮件的具体内容。
所以,一封邮件的发送其实就是一次TCP/IP的传输通信,跟HTTP传输类似,只是应用层的通信协议不同而已。