应用层负责产生数据,传输层负责数据分割、可靠传输等,网络层负责数据路由,链路层负责数据的传送。下面我们先介绍一下关键概念,然后再介绍数据的完整路由过程。
基本概念
首先来看一下下面这幅图,它对本文的理解至关重要,图中表示了一个接入internet的PC电脑,几乎每一个电脑都是用这种逻辑结构接入Internet的,这种结构也反映了PC接入Internet的主要行为。]
图中的方框代表了一个数据流入Internet的通信主体,横向的虚线代表的是通信电路(如:同轴电缆),*代表这是一个IP地址,@代表这是一个以太网地址,O代表这是一个接入节点;理解这幅图对于理解互联网技术很重要。
数据单元(UDP)流经Internet依赖于各种协议栈。在不同的协议模块中,数据单元有着不同的名字,如:
- 当数据单元在以太网模块中,它被称作以太网帧(Ethernet frame);
- 当数据单元在IP模块和以太网驱动模块之间流动时,它叫做IP包;
- 如果数据单元在IP模块和UDP模块之间,它被称作数据报;
- 当数据单元在TCP模块和IP模块之间传送,它叫做TCP分段;
- 当数据在网络应用程序中时,它叫作应用程序消息;
多端合成/分解器的数据流
如果一个应用程序使用了TCP协议,那么数据就从应用程序流入TCP模块,同样的道理,数据也可能流入UDP模块。而FTP应用就是一个典型的使用TCP协议的应用程序,它的协议栈:FTP/TCP/IP/ENET,同样的还有SNMP应用,使用了UDP协议,协议栈为: SNMP/UDP/IP/ENET。数据流流经协议栈的图标方式可以参考图1。
其实TCP、UDP以及以太网驱动模块既是一个多对一的多端合成器,又是一个一对多的多端分解器。当作为多端合成器时,它们将多个输入端口的数据处理然后从一个端口输出(如:TCP可以同时处理多个应用程序的数据,即多任务操作);当作为多端分解器时,它们可以将1个输入端口的数据分解成多个输出传送到不同的模块。
概念可能有点抽象,我们举个例子理解,如以太网模块接入网络,当一个以太网帧流入以太网驱动模块,它接收到以太网帧,既可以传送到IP模块,也可以传送到ARP模块,以太网驱动模块会根据以太网帧头部的类型来判断将数据传送到IP模块或ARP模块。同样的道理,IP包流入IP模块,IP模块IP头部信息决定数据流向TCP模块还是UDP模块。
说到这里不得不说一下以太网地址,IP地址用来唯一的标示某个Internet网络,以太网地址采用的时6个字节的十六进制数,用于唯一的标识某个接入Internet的以太网驱动设备,即我们通常的网卡地址。IP地址随着PC的移动会改变,以太网地址只有在硬件设备更换才会改变。
路由器
有时候,某个设备可能同时有多个以太网,多个IP地址,如图所示:
路由器就是一种这样的设备,但是大部分路由器没有也不需要图中所示的TCP和UDP模块以上的模块。
IP模块
IP模块的主要功能是路由寻址,负责根据目的IP地址查询路由表,决定下一跳的IP地址。
以太网驱动模块
以太网驱动模块接入网络,它可以对外传送数据,并且可以接收自己的数据和广播数据,这里的自己的数据指的是以太网帧的目的以太网地址和自身的以太网地址相同,广播地址指的是FF-FF-FF-FF-FF-FF。
如下图所示是一个以太网帧里面的源/目的IP和以太网地址的对应关系,以太网帧只会被发送到目的以太网地址的以太网设备中:
ARP路由模块
ARP路由模块负责IP地址到以太网地址的映射,当IP包进入缓存队列,准备发给以太网模块时,ARP模块会查询自身的ARP表,返回一个跟目的IP匹配的以太网地址,然后,以太网才可以将数据发送到这个以太网地址。如果ARP表中没有这个映射关系,以太网模块会向以太网内广播,询问谁是这个IP的设备,来获取IP对应的以太网地址。以太网中的其他设备接收到以太网帧,查询自己的IP后发现这不是自己的IP,丢弃;如果是自己的IP,响应自己的以太网地址给源以太网。至此ARP表得到了更新,重新发送IP包。
完整的网络通信过程
如下图所示,有三个网络分别是Development、Accounting、factory。还有一个路由器delta,路由器接入到了三个网络中,所以它有3个IP地址和3个以太网地址。下面我们就来看看一个数据是怎么从alpha网络到达factory网络中的。
当alpha向factory发送数据时,IP路由模块首先会查询自己的IP路由表,IP路由表如下:
如表中所示,首先会根据目的IP的前三位网络号,遍历路由表,进行匹配,匹配到第三行factory选中,direct/indirect flag字段指示factory网络不能直达,只能间接通过devnetrouter路由器到达,可以从1号接口传送数据。IP包仍然包含目的IP地址即factory的IP地址,但是目的以太网地址应该是路由器的以太网地址,所以IP模块结下来查询ARP表,找到对应的devnetrouter路由器的以太网地址,将数据包发送到路由器,路由器以太网接收到以太网帧,发送到IP模块,IP模块发现目的IP不是自己的IP地址,接着查询自身的路由表:
如表中所示,factory网络可以通过3号接口直达,接下来,IP包中仍然带有目的IP地址,IP模块使用ARP表查询factory的以太网地址,然后将IP包发给路由器以太网模块,由以太网模块从3号接口发送出去。factory接收到数据到达IP模块,分离IP头部,发现这是自己的IP,进一步将数据转发至上层。
注意:IP地址中的前三位是网络号,第四位是主机号,所以使用前三位可以判断是否是同一个网络。