2.2.3TCP/IP分层模型与通信示例
TCP/IP是如何在媒介上进行传输的呢?下面将介绍使用TCP/IP时,从应用层到物理媒介为止数据处理的流程。
1.数据包首部
每个分层中都会对所发送的数据互加一个首部。在这个首部中,包含了该层必要的信息,如发送的目标地址以及协议的相关信息。为协议提供的信息为包首部,所要发送的内容为数据。如图2.2所示,在下一层的角度看,从上一分层收到的包,全部都被认为是本层的数据。

图2.2 包首部
每一层都有一个专业的术语来表示数据的单位。包是全能性术语,帧用于表示数据链路层中包的单位,数据报是IP和UDP等网络层以上的分层中包的单位,段则表示TCP数据流中的信息,最后消息是指应用协议中数据的单位。
2.发送数据包
假设甲给乙发送电子邮件,内容为“早上好”。从TCP/IP通信上看,是从一台计算机A向另一台计算机B发送电子邮件。我们就通过图2.3,讲解一下TCP/IP通信的过程。

图2.3 发送数据包
3.应用程序处理
应用程序在发送邮件的一刻进行编码处理并建立TCP连接,利用TCP连接发送数据,它的过程首先是将应用的数据发送给下一层的TCP,再做实际的转发处理。
4.TCP模块的处理
TCP根据应用的指示,负责建立连接、发送数据以及断开连接。TCP提供将应用程序发来的数据顺利发送到对端的可靠传输。
为了实现TCP这一功能,需要在应用层数据的前端附加一个TCP首部。TCP首部中包括原端口号和目标端口号(用以识别发送主机和接收主机上的应用)、序号(用以表示该包数据是发送端整个数据的第几个字节的序列号)以及校验(用以判断数据是否被损坏)。随后将附加了TCP首部的包发送给特定的IP地址。
5.IP模块的处理
IP将TCP传过来的TCP首部和TCP数据合起来当作自己的数据,并在TCP首部的前端加上自己的IP首部。IP首部中包含接收端IP地址以及发送端IP地址。紧随IP首部的还有用来判断其后面数据是TCP还是UDP的信息。
IP包生成后,参考路由控制表决定接受此IP包的路由和主机。随后,IP包将被发送给连接这些路由器和主机网络接口的驱动程序,以实现真正数据发送。
6.网络接口的处理
从IP传过来的IP包,对于以太网驱动来说,不过就是数据。给这些数据附加上以太网首部并进行发送处理。以太网首部中包含接收端Mac地址、发送端Mac地址以及标识以太网类型的以太网数据的协议。根据上述信息产生的以太网数据包将通过物理层传输给接收端。
7.经过数据链路的包
分组数据包(以下简称“包”)经过以太网的数据链路时的大致流程,如图2.4所示。

图2.4 数据包处理流程
包流动时,从前往后依次被附加了以太网包首部、IP包首部、TCP包首部以及应用自己的包首部和数据。而包的最后则追加了以太网包尾。
每个包首部中至少都会包含两个信息:一个是发送端地址和接收端地址,另一个是上层的协议类型。
经过每个协议分层时,都必须有识别包发送端和接收端的信息。以太网会用Mac地址,IP会用IP地址,而TCP/UDP则会用端口号作为识别两端主机的地址。即使是在应用程序中,像电子邮件地址这样的信息也是一种地址标识。这些地址信息都会在每个包经由各个分层时,附加到协议对应的包首部里边。
此外,每个分层的包首部中还包含一个识别位,用来识别上一层协议的种类信息。例如,以太网的包首部中的以太网类型、IP中的协议类型以及TCP/UDP中两个端口的端口号等都起着识别协议类型的作用。就是在应用的首部信息中,有时也会包含一个用来识别其数据类型的标签。
8.数据包接收处理
包的接收流程是发送流程的逆序过程。
9.网络接口的处理
主机收到以太网包以后,首先从以太网的包首部找到Mac地址判断是否为发给自己的包,如果不是发给自己的包则丢弃数据。
而如果接收到的,恰好是发给自己的包,就查找以太网包首部中的类协议,从而确定以太网协议所传过来的数据类型。如果以太网首部的类型与包含了一个无法识别的协议类型则丢弃数据。
10.IP模块的处理
IP模块收到IP包首部以及后面的数据部分以后,也做类似的处理。如果判断得出首部中的IP地址与自己的IP地址匹配,则可接收数据并从中查找上一层的协议。如果上一层是TCP就将IP包首部之后的部分传给TCP处理;如果是UDP,则将IP包首部后面的部分传给UDP处理。对于有路由器的情况下,接收端地址往往不是自己的地址,此时需要借助路由控制表,在查找应该送达的主机或路由器以后再转发数据。
11.TCP模块的处理
在TCP模块中,首先会计算一下校验,判断数据是否被破坏;然后检查是否再按照序号接收数据;最后检查端口号,确定具体的应用程序。
数据接收完毕后,接收端则发送一个“确认回执”给发送端。如果这个回执信息未能到达发送端,那么发送端会认为接收端没有接收到数据而一直反复发送。
数据被完整地接收以后,会传给由端口号识别的应用程序。
12.应用程序的处理
接收端应用程序会直接接收发送端发送的数据。通过解析数据可以获知邮件的接收人地址是乙的地址,如果主机B上没有乙的邮件信箱,那么主机返回给发送端一个“无此收件地址”的报错信息;如果主机B上有乙的邮件信箱,那么接收端会返回一个“处理正常”的回执给发送端。
因此,用户乙就可以利用主机上的邮件客户端,接收并阅读由主机A上的用户甲所发过来的电子邮件——“早上好”。