现在因特网使用的主流协议族是TCP/IP协议族,它是一种分层、多协议的通信体系。
TCP/IP是一个四层协议系统,自底向上分别是数据链路层、网络层、传输层和应用层。每一层完成不同的功能,且通过很多协议来实现,下层协议为上层协议提供服务。如下图所示:
在上图中,发送端发送一个“hello”,要依次经过应用层、传输层、网络层、数据链路层,每经过一层都会加一个头部(数据链路层不仅会加头部,也会加一个尾部)。数据通过物理媒介传输的过程中会经过一个又一个的路由器,每经过一个路由器都从数据链路层去掉头和尾到达网络层取出网段,这样路由器才知道数据是发往哪里的,然后再加上头部和尾部发往下一个路由器,直至到达接收端。数据到达接收端后又依次经过数据链路层、网络层、传输层、应用层,每经过一层都去掉相应的头部(数据链路层不仅会去掉相应的头部,也会去掉相应的尾部)。
数据链路层
数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介上的传输。不同的物理媒介有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。
数据链路层两个常用的协议是ARP协议(Address Resolve Protocol,地址解析协议)和RARA协议(Reverse Address Resolve Protocol,逆地址解析协议)。他们实现了IP地址与机器物理地址之间的相互转化。网络层使用IP地址来寻址一台机器,而数据链路层使用使用物理地址来寻址一台机器,因此网络层必须先将目标机器的IP地址转化成物理地址,才能使用数据链路层提供的服务,这就是ARP协议的用途。RARP仅用于网络上的某些无盘工作站。
网络层
网络层实现数据的选路与转发。通常,通信的两台主机不是直接连接的,而是通过多个中间节点(路由器)连接的。网络层的任务就是选择这些中间节点,以确定两台主机之间的通信路径。与此同时,网络层对上层协议隐藏了网络拓扑结构的细节,使得传输层和应用程序看来通信的两台主机是直接连接的。
网络层最核心的协议是IP协议(Internet Protocol,因特网协议)。IP协议根据数据包的目的IP地址来决定如何投递它。如果数据包不能直接发送给目标主机,那么IP协议就为它选择合适的下一跳(next hop)路由器,并将数据包交付给该路由器来转发。多次重复这一过程,数据包最终到达目标主机,或者发送失败而被丢弃。
网络层另外一个重要的协议是ICMP协议(Internet Control Message Protocol,因特网控制报文协议)。它是IP协议的重要补充,用于检测网络连接。ICMP报文分为两类,一类是差错报文,这类报文主要用来回应网络错误。另一类是查询报文,这类报文用来查询网络信息。需要指出的是,ICMP并非严格意义的网络层协议,因为它使用同一层IP协议提供的服务(一般来说,上层协议使用下层协议提供的服务)。
传输层
传输层为两台主机上的应用层提供端到端(end to end)的通信。与网络层逐跳通信不同,传输层只关注通信的起始端和目的端,而不在乎数据包的中转过程。
传输层协议主要有三个:TCP协议、UDP协议、SCTP协议。
TCP协议(Transmission Control Protocol,传输控制协议)为应用层提供可靠的、面向连接的、基于流的服务。使用TCP通信的双方必须建立TCP连接,并在内核中为该链接维持一些必要的数据结构(连接状态、读写缓冲区、诸多定时器等)。当通信结束后,必须关闭连接以释放这些内核数据。TCP基于流的,基于流的数据没有边界(长度)限制,他源源不断的从通信的一端到另一端。发送端可以逐个字节地向数据流中写入数据,接收端也可以逐个字节地将它们读出。
应用层
应用层负责处理应用程序的逻辑。数据链路层、网络层和传输层负责处理网络通信细节,这部分必须高效而且稳定,故它们在内核空间实现,而应用层则在用户空间实现,因为它负责处理众多逻辑,比如文件传输、网络管理等。如果应用层也在内核实现,则会使内核变得非常庞大(但是也有少数服务器 在内核实现,在内核实现就无须在内核空间与用户空间来回转化,提高工作效率,但是这种代码实现复杂,不便于移植)。
传输层有很多协议,我们只列举其中几个:
ping是很常用的应用程序,是调试网络环境必备工具。
telnet协议是远程登录协议,它使我们能在本地完成远程任务。
DNS(Domain Name Service,域名服务)协议提供机器域名到IP地址的转换。
OSPF(Open Shortest Path First,开放最短路径优先)协议是一种动态路由更新协议,用于路由之间通信,以告知对方各自的路由信息。
应用层协议(程序)可以直接跳过传输层直接使用网络层提供的服务(例如ping程序、OSPF协议)。应用层协议(程序)通常既可以使用TCP服务,又可以使用UDP服务(例如DNS)。
参考文献:
[1] 游双. Linux高性能服务器编程[M]. 北京: 机械工业出版社, 2013.