目前互联网上使用的主流协议族就是TCP/IP协议族,它是一个分层、多协议的通信体系。
TCP/IP协议族是一个四层协议系统,自低向上分别是数据链路层、网络层、传输层和应用层。下层协议为上层协议提供服务。
- 数据链路层:实现了网卡接口的网络驱动程序,以处理数据在物理媒介上的传输,数据链路层的相关协议隐藏了不同物理网络上的不同电气特性,为上层协议提供了一个通用的接口。数据链路层两个常用的协议是ARP协议和RARP协议,ARP协议的功能是将根据IP地址获取物理地址,RARP是根据物理地址获取IP地址,通常RARP用于无盘工作站向网络管理者查询自身IP。
- 网络层实现数据包的选路和转发。网络层的认为是选择路由的中间节点,确定主机之间的通信路径,对上层协议隐藏网络的拓扑连接的细节,使得在传输层和应用层的程序看来两台主机是直接相连的。网络层的核心协议是IP协议,IP协议根据数据包的目的IP地址决定如何投递信息,如果本次无法投递到则选择下一跳路由器,并将数据包交由路由器来转发,最终将数据包顺利投递或者丢弃。网络层还有一个重要的协议就是ICMP协议,ICMP协议是IP协议的重要补充,用于检查网络连接。
- 传输层为两台主机上的应用程序提供端到端的通信,传输层只关心通信的起始位置和目的端而不在乎数据包的传输细节。传输层和网络层最主要的区别就在于网络层做的主要工作是在于协调数据包的传输细节,为上层提供网络传输的接口,比如在路由器之间的传输等。而传输层的主要工作是为上层提供端到端的逻辑传输线路。传输层的协议主要有TCP协议、UDP协议、SCTP协议。
- 应用层负责处理应用程序的逻辑。其余各层相对于应用层而言负责网络的通信细节,在内核空间中实现,而应用层则负责应用程序的逻辑主要在用户空间中实现。应用层的主要协议有:telnet协议,一种远程登陆协议,使我们可以在本地完成远程的任务;OSPF协议,是一种动态路由更新协议,用于路由器之间的通信,以告知对方各自的路由信息;DNS协议,提供域名到IP的解析服务。应用层协议或者程序可以跳过传输层直接使用网络层的服务,如ping和OSPF协议。应用层程序通常既可以使用TCP协议又可以使用UDP协议。
上层协议是通过封装来实现使用下层提供的服务。应用程序数据在发送到物理网络之前将沿着协议栈从上往下依次传递。每层协议都在上层数据的基础之上加上自己的头部信息(有时还有尾部信息),以实现该层的功能,这个过程就成为封装。
经过 TCP封装后的数据称为TCP报文段,或者简称TCP段。TCP协议为通信双方维持一个连接,并且在内核中存储相关数据。这部分数据中的TCP头部信息和TCP内核缓存区数据一起构成了TCP报文段,如图虚线框所示。
经过UDP封装后的数据称为UDP报文段。UDP对应用程序的封装与TCP类似。不同的是UDP无须为应用层数据保存副本,因为UDP数据报被发送以后UDP内核中缓存区的数据就会被内核丢弃,如果应用的逻辑判断接收方没有成功接受数据并且需要重新发送的时候则需要程序重新从用户缓存区向内核缓存区拷贝数据。
经过IP封装后的数据报被称为IP数据报。IP数据报也包含头部信息和数据部分,其中数据部分就是一个TCP数据报或者UDP数据报或者ICMP数据报等。
经过数据链路层封装后的数据称为帧,帧的最大传输单元通常受到网络类型的限制。正因为如此,过长的IP数据报可能需要被芬片传输。
帧才是最终在物理网络上传送的字节序列。至此,封装过程完成。