【网络编程】之数据链路层
- 数据链路层
- 基本介绍
- 基本功能
- 常见协议
- 以太网
- 什么是以太网
- 以太网协议帧格式
- 数据链路层的以太网帧报文如何封装/解封装以及分用
- 以太网通信原理
- 传统的以太网与集线器
- 现代以太网与交换机
- 碰撞域的概念
- Mac地址
- 基本概念
- 为什么要使用Mac地址而不是使用IP地址进行局域网间的通信
- MTU
- 认识MTU
- 为什么存在MTU限制
- MTU对上层一些协议的影响
- ARP协议
- 基本概念
- 功能和工作范围、以及封装形式
- 典型工作流程示例
数据链路层
基本介绍
数据链路层是TCP/IP
五层协议和OSI
七层协议中的倒数第二层,它主要负责在同一局域网之间的节点间进行可靠的数据帧的传输。
注意:在网络中我们将主机可以称之为节点。
基本功能
- 帧同步:确保发送方和接收方对帧边界的识别一致,防止数据丢失或错误。
- 差错检测与纠正:通过校验和等机制检测并可能纠正传输过程中的错误,保证数据完整性。
- 流量控制:调节数据发送速率以避免拥塞和数据丢失,确保接收方能够处理所有接收到的数据。
- 介质访问控制(MAC, Media Access Control):确定哪个设备在网络上有权限发送数据,特别是在共享介质如以太网中尤为重要。
- 逻辑链路控制(LLC, Logical Link Control):提供一种方法来标识上层协议,并管理不同协议之间的复用与分用。
常见协议
- 以太网(Ethernet):最常用的局域网技术之一,支持高速度的数据传输。
- 点对点协议(PPP, Point-to-Point Protocol):用于在点对点连接上传输多协议数据包的标准方法。
- 高级数据链路控制(HDLC, High-Level Data Link Control):面向位的数据链路层协议,主要用于同步通信。
- 帧中继(Frame Relay):高效的广域网协议,适用于企业站点间的连接。
- 异步传输模式(ATM, Asynchronous Transfer Mode):虽然跨越了数据链路层和物理层,但以其在数据链路层的功能而知名。
- IEEE 802.11系列:无线局域网协议,为Wi-Fi技术提供了基础。
- ARP协议/RAP协议:在IPv4网络中将网络层(第三层)使用的
IP
地址转换为数据链路层使用的MAC地址。
我们重点介绍以太网协议。
以太网
什么是以太网
以太网是局域网技术的一种,常见的局域网技术还有令牌环网技术、
WIFI
技术(无线局域网)。以太网是最流行的局域网技术,使用物理电缆(如双绞线或光纤)连接网络设备。它支持从10Mbps
到100Gbps
及以上的传输速率。
以太网协议帧格式
不同的局域网需要使用不同的协议,比如以太网使用以太网协议,它是数据链路层的一种:
- 目的地址:局域网中通信使用
MAC
地址,所以以太网协议又可以叫做MAC
帧协议,这个6字节的字段对应通信主机的MAC
帧地址。 - 源地址:当前主机的
MAC
地址。 - 类型:在以太网II帧格式中,该字段被解释为“类型”,用来标识封装在帧内的上层协议。常见的类型值包括但不限于以下几种:
0x0800
:表示网络层协议是IPv4。0x86DD
:表示网络层协议是IPv6。0x0806
:表示这是ARP(Address Resolution Protocol)报文。0x8035
:RARP(Reverse Address Resolution Protocol)报文。0x8100
:VLAN标签(IEEE 802.1Q),实际上这是一个扩展,它后面跟着一个额外的4字节VLAN标签,然后再跟类型字段。0x88CC
:LLDP(Link Layer Discovery Protocol),用于设备发现。
对于上一层协议是是IPv4
:
如果数据部分是ARP
报文:
PAD
:是填充字节,数据部分最少要有46字节,这些填充字节通常没有实际意义,仅用于物理层的要求,保证帧能够正确地被接收设备识别和处理。
如果数据部分是RARP
报文:
数据链路层的以太网帧报文如何封装/解封装以及分用
解封装:因为帧报文是固定报头,所以很轻松就可以将报头和有效载荷进行分离。封装将上层的有效载荷添加上报头和CRC
校验码即可,CRC
校验码有特定的算法,感兴趣的自行了解,是错误检测中的常见的算法。
分用:分用的过程就是如何提交给上层的问题,根据2字节的类型字段来分用,如果是字段的值是0x0800
那就是IPv4
报文,交给上层的IPv4
协议。
以太网通信原理
传统的以太网与集线器
集线器(Hub):是一种物理设备,工作在物理层,它可以用来将局域网中要通信的计算机组织在一起,它工作在物理层,只能机械的广播报文到所有它连接的端口,它并不理解或更改传输的数据帧。
由集线器组织起来的局域网:
由于传统的集线器没有学习mac
地址的功能,它不知道目的mac
地址对应哪个端口,所以它只能将mac
帧报文转发给所有端口,所以每一次发送数据,每个端口都要传输数据,就导致了都被占用,所以有主机在局域网中发送数据时就不能有其它主机发送数据,否则会导致冲突。
上述组网图也可以表示为:
现代以太网与交换机
上面那种组网的方式有明显的缺陷,就是每一次局域网中的数据传输都要占用整个通信线路,冲突的概率很大,下面我们来简单学习一下交换机这种网络设备。
交换机(Switch):和集线器长的很像,也可以组网,但不同于集线器的是,交换机中可以维护一个表保存某个端口对应的设备的mac
地址,也就是它可以学习mac
地址,交换机工作在数据链路层。通过报文的目标mac
地址,它的交换表中如何存储了该mac
地址对应的端口信息,可以直接将其转发给该端口,而不需要将其发送给所有端口。
所以交换机工作在数据链路层(第二层)的主要原因是其可以识别和处理数据帧中的信息,如MAC地址。它根据MAC
地址来决定将数据转发到哪个端口,如果交换表中没有保存该mac
地址对应的端口,它就会将其发送给剩下的端口。
并且每一次发送数据帧时,如果源主机的mac
地址如果交换机的表中没有保存其相关信息或者mac
地址发生变化(该端口接入交换机的设备更换了)的话,它也会更新交换表中的信息。
现代交换机网络示例:
- 此时主机A->主机C,主机B->主机D发送数据就是并行的,如果
mac
表中保存了相关的信息的话,不会导致冲突,因为交换机可以识别帧头部信息做到根据mac地址定向端口转发数据帧报文。 - 每个端口支持全双工通信(也有些半双工模式),数据可以同时进行收发,而集线器只支持半双工通信。全双工模式下,每个端口都有独立的冲突域(只要该端口不同时发数据就行),整个网络的碰撞域其实不复存在,完全禁用冲突检测(
CSMA/CD
的消亡)。
为了保证向后兼容,协议层保留兼容性支持(半双工),但新部署网络必须强制配置全双工,因为半双工的网络性能实在是太慢了。
碰撞域的概念
碰撞域(collision domain)是以太网通信的核心概念,它定义了网络中可能发生数据冲突的物理范围。
共享同一物理信道的设备,在域中相同时刻,只能有一组设备发送数据成功,如果有多组设备同时发送数据,则会导致这些设备数据都发送失败。
传统的集线器所组的局域网,碰撞域几乎覆盖了整个通信信道,但由于交换机的出现,特别是全双工通信的支持,将大的独立的碰撞域分割为多个小的独立碰撞域,数据冲突几乎不存在。
特性 | 传统网络 | 现代网络 |
---|---|---|
典型设备 | 集线器(Hub) | 交换机(Switch) |
冲突处理机制 | CSMA/CD(载波监听多路访问/冲突检测) | 无冲突 |
带宽共享方式 | 竞争型(竞争发送数据的机会) | 专用型(根据mac地址定向转发数据帧) |
最大理论设备数 | <= 30(100M网络) | 无限制 |
Mac地址
基本概念
Mac(Media Access Control Address)地址是网络设备的物理地址,又称媒体访问控制地址,用于在局域网内进行设备间的通信,每一个网络接口都有一个全球唯一的MAC地址,这使得数据帧可以从一个设备准确的发送给局域网中的另外一个设备。Mac地址在设备生产的时候就已经固定了,不可改变。
Windows中可以通过指令getmac
获得本主机所有网络接口对应的mac
地址:
如果想获得与mac
地址相关的其它网络接口配置信息,可以使用指令ipconfig /all
:
为什么要使用Mac地址而不是使用IP地址进行局域网间的通信
这我相信是很多人的疑惑点之一,明明IPv4
、IPv6
中的IP
地址就已经可以标识网络中的唯一主机,为什么还要多次一举搞一个mac地址出来呢,理由如下:
-
网络分层的必然要求:
-
数据链路层与网络层的分工:
-
mac地址:数据链路层的标识,用于同一物理网络的直接通信,如交换机的转发。
-
ip地址:网络层的标识,用于跨网络的路由寻址(如路由器决策路径需要靠IP地址)。
-
-
硬件与逻辑的解耦:
- MAC地址固化在网卡硬件中,如
E2-0A-F6-97-75-73
,与物理设备绑定。 - 但是IP地址可动态分配(
DHCP
算法), 仅仅作为逻辑标识,用于网络拓扑。
- MAC地址固化在网卡硬件中,如
-
-
局域网通信的关键场景:
-
当设备刚刚接入某个局域网中,肯定是还没有
IP
地址的,那DHCP
服务器想给它分配IP
地址,只能通过先通过mac
地址来与其通信,大致可以分为以下几个步骤:-
DHCP
服务器发现阶段:-
DHCP
服务器收到这个广播帧,会给客户端(也就是新设备)返回一个offer报文,不用担心是否会有其它设备发送报文给新设备,DHCP
协议offer
报文是有特定格式的,其它设备响应的错误报文会直接被丢弃,如果有多个DHCP
服务器响应,新设备只会选择一个最优的(考虑网络等情况)。这个offer报文中有ip地址、子网掩码、网关地址等信息。 -
Request
阶段:当DHCP
服务器给新设备返回一个ip
地址后,它并不会马上开始使用这个ip
地址,而是先给所有DHCP
服务器发送一个报文,告诉它们启用了哪个ip
地址,防止局域网中有多DHCP
服务器导致ip
地址冲突问题。发送广播帧即可。 -
响应阶段:最后新设备选择的DHCP服务器将会给它返回一个ACK报文,表示地址分配是有效的。其它设备在收到
Request
报文后,会回收租出去的ip
地址,如果没有收到Request
报文,ip
地址也会自动过期回收:
-
-
-
交换机工作原理:交换机通过存储不同设备的
mac
地址,决定应该将数据帧转发给哪个端口,而非使用ip
地址。
-
-
ip地址的局限性:
ip
地址可能因为DHCP租约过期,手动配置错误等经常发生变化,所以不适合稳定的通信。ip
地址属于网络层,需要网络层协议的支持,而某些底层工业设备可能仅支持mac
通信。
所以mac
地址和ip
地址是各有各的优点和功能,两者都不可或缺。
MTU
认识MTU
MTU(Maximum Transmission Unit),即最大传输单元,是数据链路层对有效载荷也就是数据帧的数据部分的最大长度的限制。每个类型的网络对都有特定的MTU限制:
为什么存在MTU限制
- 数据太大,重传的成本高。
- 接收设备(路由器、主机、交换机等)需要为接收到的数据帧分配缓冲区,如果帧过大导致缓冲区溢出,就会导致数据丢失。
- 数据链路层会对数据帧做数据校验(CRC算法),较小的帧长计算量也较小。
MTU对上层一些协议的影响
-
TCP协议(传输层)
-
TCP的一个报文不能无限大,因为TCP是传输层,也受限于数据链路层的MTU,双方在三次握手时会告知对方自己的MSS(Max Segment Size)。
-
在理想的情况下MSS = MTU-IPheadersize-TCPheadersize。这是刚好网络层不会IP分片的TCP数据长度,如果没有其它额外选项的话。所以
MSS
和MTU有很大的关系。
-
-
IP协议(网络层):
-
由于数据链路层MTU的限制,对于较大的IP报文,网络层会将其进行IP分片(分成几个小的IP报文)。
-
IP分片的触发条件:IP包的数据长度 > MTU -20Byte(IP头的长度)。
-
假设IP包的数据长度为3000Byte,它就会被分成下面形式的IP包(假设没有选项):
-
-
UDP协议(传输层):如果UDP协议的数据部分超过:
MTU(1500)-8Byte(UDPheader)-20Byte(IPheader)=1472字节
- 那么在网络层,IP报文就会分片,这些多个IP数据报如果有一个丢失,都会导致接收主机网络层重组失败,则UDP报文的丢包率就大大提高。
ARP协议
基本概念
ARP
协议的主要功能是通过主机的ip
地址获得它的mac
地址,因为局域网中通信要使用mac
地址。
关于ARP
协议工作在TCP/IP
协议哪一层,一直备受争议,因为它处理的是ip
地址,所以有人认为它工作在网络层,但是ARP
并不使用ip
协议,而是直接封装在数据帧中,所以我们可以认为它是数据链路层和网络层之间的一个协议,但更偏向于数据链路层。
在《计算机网络:自顶向下方法》中,ARP通常被放在链路层讨论,因为它不涉及路由,只在本地网络工作,帮助将IP地址解析为MAC地址,而MAC地址是链路层的地址。
功能和工作范围、以及封装形式
ARP
协议的功能刚刚以及介绍,将IP地址解析为mac地址。
它直接封装在数据帧中,封装形式如下:
PAD
是填充字节,达到最小帧长64字节的要求,最小帧长是早期网络技术限制和冲突检测机制的共同结果,现在随着全双工模式的普及,最小帧长已经失去意义,但是半双工模式仍然保留最小帧长的要求。
工作范围:ARP
仅在本局域网中生效,不跨越路由器,跨越路由器需要依赖其它协议(如代理ARP)。