以太网的数据链路层
在数据链路层,以太网负责以太网编址,这通常称为硬件编址或 MAC 编址。以太网还负责把来自网络层的分组封装成帧。
以太网编址
以太网编址使用固化在每个以太网网卡(NIC)中的 MAC (Media Access Control,介质访问控制)地址。MAC (硬件)地址长 48 位,采用十六进制格式。
OUI(Organizationally Unique Identifier,组织唯一标识符)是由 IEEE 分配给组织(厂商)的,它包含 24 位,而组织给其生产的每个网卡都分配一个唯一的全局管理地址,该地址长 24 位。查看上图您会发现最高位是 I/G(Individual/Group) 位:如果它的值为 0,我们就可以认为相应的地址为某台设备的 MAC 地址,很可能出现在MAC 报头的源地址部分;如果它的值为 1,我们就可以认为相应的地址要么是以太网中的广播地址或组播地址,要么是令牌环和 FDDI 中的广播地址或功能地址。
接下来是 G/L 位(全局/本地位,也称为 U/L 位,其中 U 表示 universal):如果这一位为 0,则表示相应的地址为全局地址,由 IEEE 分配;如果为 1,则表示相应的地址为本地管理地址。在以太网地址中,右边 24 位为本地管理(制造商分配)的编码,特定制造商在生产第一个网卡时,通常将这部分设置为 24 个 0,然后递增,直到 24 个1。
以太网帧
数据链路层负责将比特合并成字节,再将字节封装成帧(frame)。在数据链路层我们使用帧封装来自网络层的分组,以便通过特定类型的介质进行传输。
以太网工作站的职责是,使用 MAC 帧格式彼此传递数据帧。它利用 CRC(Cyclic Redundancy Check,循环冗余校验)提供错误检测功能,记住,仅仅是检测,不是纠错。
下图说明了 802.3 帧和以太网帧的格式:
注意:使用一种帧封装另一种帧称为隧道技术。
下面详细介绍各个字段。
前导码
交替的 0 和 1,在每个分组的开头提供 5MHz 的时钟信号,让接收设备能够跟踪到来的比特流。
帧起始位置分隔符(SFD)/同步
前导码为 7Byte,而 SFD(同步)为 1Byte。SFD 的值为 10101011,其中最后两个1让接收方能够识别中间的 0 和 1 交替模式,进而同步并检查到数据开头。
目标地址 (DA)
包含一个 48 位的值,且 LSB(Least Significant Bit,最低有效位)优先。接收方根据 DA 判断到来的分组是否是发送给特定节点的。目标地址可以是单播地址、广播地址或组播 MAC 地址。广播地址全为 1(十六进制格式下全为F),广播发送给所有设备,而组播只发送给网络中一组类似的节点。
源地址(SA)
SA 是一个 48 位的 MAC 地址,用于标识传输设备,也使用 LSB 优先格式。在 SA 字段中,不能包含广播地址或组播地址。
长度或类型
802.3 帧使用长度字段,而 Ethernet_II 帧使用类型字段标识网络层协议。802.3 不能标识上层协议,只能用于专用 LAN,如 IPX。
数据
这是网络层传递给数据链路层的帧,其长度为 46-1500 Bytes。
帧校验序列(FCS)
FCS 字段位于,用于存储 CRC(Cyclic Redundancy Check,循环冗余校验)结果的帧的帧尾。CRC 是一种数学算法,创建每个帧时都将运行它。作为接收方的主机收到帧并运行 CRC 时,其结果必须相同,否则接收方将认为发生了错误,进而将帧丢弃。
数据封装
主机通过网络将数据传输给另一台设备时,数据将经历封装:OSI 模型的每一层都使用协议信息将数据包装起来。每层都只与其在接收设备上的对等层通信。
为了通信和交换信息,每层都使用 PDU(Protocaol Data Unit,协议数据单元)。PDU 包含在每一层给数据添加的控制信息。这些控制信息通常被添加在数据字段前面的报头中,但也可能被添加在报尾中。
OSI 模型每一层都对数据进行封装来形成 PDU,PDU 的名称随报头提供的信息而异。这些 PDU 信息仅在接收设备的对等层被读取,然后剥离,然后数据被交给下一层。
下图显示了各层的 PDU 及每层添加的控制信息:
该图说明了如何对上层用户数据进行转换,以便通过网络传输。然后,数据被交给传输层,而传输层通过发送同步分组来建立到接收设备的虚电路。接下来,数据流被分割成小块,传输层报头被创建并放在数据字段前面的报头中,此时的数据块称为数据段(一种PDU)。我们可以对每个数据段进行排序,以便在接收端按发送顺序重组数据流。
接下来,每个数据段都交给网络层进行编址,并在互联网络中路由。为让每个数据段前往正确的网络,这里使用逻辑地址(如IP地址)。对于来自传输层的数据段,网络层协议给它添加一个控制报头,这样就生成了分组或数据报。在接收主机上,传输层和网络层协同工作以重建数据流,但它们不负责将 PDU 放到本地网段上--这是将信息传输给路由器或主机的唯一途径。
数据链路层负责接收来自网络层的分组,并将其放到网络介质(电缆或无线)上。数据链路层将每个分组封装成帧,其中帧头包含源主机的硬件地址。如果目标设备在远程网络中,则帧将被发送给路由器,以便在互联网络中路由。到达目标网络后,新的正被用来将分组传输到目标主机。
要将帧放到网络上,首先必须将其转换为数字信号。帧是有 1 和 0 组成的逻辑编组,网络层负责将这些 0 和 1 编码成数字信号,供本地网络中的设备读取。接收设备将同步数字信号,并从中提取 1 和 0 (解码)。接下来,设备将重组帧,运行 CRC,并将结果与帧中 FCS 字段的值进行比较。如果它们相同,设备从帧中提取分组,并将其他部分丢弃,这个过程称为拆封。分组被交给网络层,而网络层将检查分组地址。如果地址匹配,数据段被从分组中提取出来,而其他部分将被丢弃。数据段将在传输层处理,而后者负责重建数据流,然后向发送方确认,指出接收方收到了所有信息。然后传输层将数据流交给上层应用程序。
在发送端,数据封装的过程大致如下:
1. 用户信息被转换为数据,以便通过网络进行传输。
2. 数据被转换为数据段,发送主机和接收主机之间建立一条可靠的连接。
3. 数据段被转换为分组或数据报,连接地址被添加在报头中,以便能够在互联网络中路由分组。
4. 分组或数据报被转换为帧,以便在本地网络中测试。硬件(以太网)地址被用于唯一标识本地网段中的主机。
5. 帧被转换为比特,并使用数据编码方法和时钟同步方案。
下图解释了数据封装的过程:
传输层使用端口号标识虚电路和上层进程,如下图所示:
使用面向连接的协议(即TCP)时,传输层将数据流转换为数据段,并创建一条虚电路以建立可靠的会话。接下来,它对每个数据段进行编号,并使用确认和流量控制。如果你使用的是 TCP,虚电路将由源端口号和目标端口号已经源 IP 地址和目标 IP 地址(称为套接字)标识。主机只能使用不小于 1024 的端口号。目标端口号标识了上层进程(应用程序),在接收主机可靠地重建数据流后,数据流将被交给进程(应用程序)。
下面让我们回到数据封装的过程。
给数据块添加传输层报头信息后,便形成了数据段;随后,数据段和目标 IP 地址一起呗交给网络层。(目标IP地址是随数据流一起由上层交给传输层的,它是由上层使用名称解析方法(可能是DNS)发现的。)
网络层在每个数据段的前面添加报头和逻辑地址(IP地址)。给数据段添加报头后,形成的 PDU 为分组。分组包含一个协议字段,该字段指出了数据段来自何方(UDP或TCP),这样当分组到达接收主机后,传输层便能够将数据段交给正确的协议。
网络层负责获悉目标硬件地址(这种地址指出了分组应发送到本地网络的什么地方),为此,它使用 ARP(Address Resolution Protocol,地址解析协议)。网络层查看目标 IP 地址,并将其与主机的 IP 地址和子网掩码进行比较。如果比较表明分组是前往本地主机的,则 ARP 请求被用于请求该主机的硬件地址;如果分组是前往远程主机的,IP 将获悉默认网关(路由器)的 IP 地址。
接下来,网络层将分组向下传递给数据链路层,一同传递的还有本地主机或默认网关的硬件地址。数据链路层在分组前面添加一个报头,这样数据块将变成真(之所以称其为帧,是因为同时给分组添加了报头和报尾,使其类似于书档)。帧包含一个以太网类型(Ether-Type)字段,它指出了分组来自哪种网络层协议。现在,将对帧运行CRC 校验,并将结果放在帧尾的 FCS 字段中。
至此,可以用每次 1 比特的方式将帧向下传递给网络层了,而网络层将使用比特定时规则(bit timing rule)将数据编码成数字信号。网段中的每台设备都将同步时钟,从数字信号中提取 1 和 0,并重建帧。重建帧后,设备运行 CRC,以确保帧是正确的。如果一切顺利,主机将检查目标 MAC 地址和目标 IP 地址,以检查这个帧是不是发送给它的。