Linux网络编程: 以太网帧Frame/ARP/RARP详解
一、TCP/IP五层模型
-
物理层(Physical Layer):物理层是最底层,负责传输比特流(bitstream)以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流,例如通过电缆、光纤或无线传输等。
-
数据链路层(Data Link Layer):数据链路层位于物理层之上,负责在直接相连的节点之间传输数据帧(Frame)。它将比特流组织成帧,并提供数据的可靠传输、差错检测和纠正等功能。常见的协议包括以太网(Ethernet)和Wi-Fi。
-
网络层(Network Layer):网络层处理分组(Packet)的传输和路由,负责将数据从源主机传输到目标主机。它定义了逻辑地址(如IP地址)和路由选择算法,并通过Internet Protocol (IP) 进行数据的分组、定址和转发。
-
传输层(Transport Layer):传输层提供端到端的可靠数据传输服务,负责将数据从发送方传输到接收方的端口。它通过传输协议(如TCP和UDP)提供了连接管理、流量控制、差错检测和纠正等功能。
-
应用层(Application Layer):应用层是最高层,负责处理特定应用程序之间的通信。它包括各种应用协议,如HTTP、FTP、SMTP和DNS等,用于实现不同应用程序之间的数据交换和通信。
OSI七层网络模型
二、以太网
以太网是应用最普遍的局域网技术,取代了其他局域网技术如令牌环、FDDI和ARCNET。
以太网在局域网各种技术中占统治地位的原因:
- 造价低廉(以太网网卡不到100块);
- 是应用最广泛的局域网技术;
- 比令牌环网、ATM网便宜,简单;
- 满足网络速率要求:10Mb/s~10Gb/s.
以太网的两个标准:
- DIX Ethernet V2 是世界上第一个局域网产品(以太网)的规约。
- IEEE 802.3 是第一个 IEEE(电气电子工程师学会) 的以太网标准。
DIX Ethernet V2 标准与 IEEE 的 802.3 标准只有很小的差别,因此可以将 802.3 局域网简称为“以太网”。
严格说来,“以太网”应当是指符合 DIX Ethernet V2 标准的局域网 。
为了通信的简便,以太网提供无连接,不可靠的服务
- 无连接:发送和接收方之间无“握手过程”。
- 对发送的数据帧不进行编号,也不要求对方发回确认。差错帧直接丢弃,差错纠正由高层负责。
这样做的理由是局域网信道的质量很好,信道质量产生差错的概率很小。
也就说:
- 以太网只实现无差错接收,不实现可靠传输。
- 以太网提供的服务是不可靠的交付,即尽最大努力的交付。
- 当目的站收到有差错的数据帧时就丢弃此帧,其他什么也不做。差错的纠正由高层来决定。
- 如果高层发现丢失了一些数据而进行重传,但以太网并不知道这是一个重传的帧,而是当作一个新的数据帧来发送。
三、MAC地址
MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。
MAC地址是网络设备的唯一识别码,用于在局域网中确定设备的身份,该地址全球范围内具有唯一性。
MAC地址的长度为48位,即6个字节。其中前3个字节是OUI(Organizationally Unique Identifier),由IEEE分配给不同的厂家,后3个字节由厂家自行分配。
MAC地址通常表示为12个16进制数,每2个数之间用冒号隔开,例如:09:2F:20:3A:5C:8D。
令牌环和以太网等 LAN 技术使用 MAC 地址作为其物理地址,但有些网络 (AppleTalk) 不使用 MAC 地址。
已经有了IP地址,为什么还要有MAC地址呢?
IP地址描述的是整个数据传送过程中的起点和终点。
MAC地址描述的是数据传送过程中,每一跳(一个区间)的起点和终点。
具体在网络中,IP地址就是目标主机,MAC地址就是两个相连路由器,只有一跳一跳经过多个路由器,数据才能被送到目标主机。
单站地址,组地址,广播地址
IEEE 规定地址字段的第一字节的最低位为 I/G 位。I/G 表示 Individual / Group。
- 当 I/G 位 = 0 时,地址字段表示一个单站地址。
- 当 I/G 位 = 1 时,表示组地址,用来进行多播(以前曾译为组播)。此时,IEEE 只分配地址字段前三个字节中的 23 位。
当 I/G 位分别为 0 和 1 时,一个地址块可分别生成 223 个单个站地址和 223 个组地址。
- 所有 48 位都为 1 时,为广播地址。只能作为目的地址使用。
全球管理与本地管理
IEEE 把地址字段第一字节的最低第 2 位规定为 G/L 位,表示 Global / Local。
当 G/L 位 = 0 时,是全球管理(保证在全球没有相同的地址),厂商向 IEEE 购买的 OUI 都属于全球管理。
当 G/L 位 = 1 时, 是本地管理,这时用户可任意分配网络上的地址。
四、以太网帧Frame
以太网协议工作在数据链路层,它用作数据传输的格式叫做Frame, 以太网帧,也叫MAC帧。
4.1 以太网帧类型
目前共有4种类型的以太网帧格式:
-
Ethernet Ⅱ以太帧
即DIX 2.0,是Xerox与DEC、Intel在1982年制定的以太网标准帧格式,已成为事实上的以太网帧标准。 -
Novell Netware 802.3 Raw以太帧
Novell Netware 802.3 Raw帧是Novell在1983年公布的专用以太网标准帧格式,其对IEEE 802.3的数据字段进行了专门分隔,以便传输NetWare类型的数据。 -
IEEE 802.3 LLC以太帧
这是1985年由IEEE正式发布的802.3标准,由Ethernet V2发展而来。主要是加入了LLC控制字段所以又叫802.3 LLC。 -
IEEE 802.3 SNAP以太帧
这是1985年IEEE为了保证在802.2 LLC上支持更多的上层协议,同时更好地支持IP协议而发布的标准。 后来为解决Ethernet II与802.3的兼容问题推出了折中的SNAP格式。
总的来说,Ethernet II原本只是几家公司合伙制定的标准,802.3是IEEE发布的正式国际标准,但由于历史原因Ethernet II成了事实上大家都遵循的标准。
最初流行的Ethernet Ⅱ帧第三个字段为帧类型,也没有定义帧长度字段。后来随着IEEE 802.3帧的发布,为了允许一些使用以太II版本的数据报和一些使用802.3封装的最初版本的数据包能够在同一个以太网段使用,以太类型值必须大于等于1536(0x0600)。这个值比802.3数据包的最大长度1500byte (0x05DC)要更大。因此如果这个字段的值大于等于1536,则这个帧是以太II帧,而那个字段是类型字段。否则(小于1500而大于46字节),他是一个IEEE 802.3帧,而那个字段是长度字段。1500~1536(不包含)的数值未定义。
4.2 Ethernet II以太帧
Ethernet Ⅱ帧,也称为Ethernet V2帧,是如今局域网里最常见的以太帧,是以太网事实标准。
Ethernet II也是目前使用最为广泛的帧格式也在事实上成为以太网的帧标准。
- 源地址,6个字节。发出数据包设备的物理地址(MAC地址),长度是48位,是在网卡出厂时固化的,不可以修改。
- 目的地址,6个字节。接收数据包设备的物理地址。
- 帧协议类型,2个字节。该字段有三种值,也就是向上交付时要交付的协议类型:
- 0x0800 对应IP
- 0x0806 对应ARP
- ox0835 对应RARP
- 有效载荷。有效载荷的大小是46~1500字节。
- CRC校验码,4个字节。处于帧末尾,用来校验数据是否正确,和校验和是一样的作用。
4.3 IEEE802.3帧
可以认为Novell Netware 802.3 Raw以太帧、IEEE 802.3 LLC以太帧 、IEEE 802.3 SNAP以太帧都遵循以下的一个框架结构。
-
Length字段。 定义了Data字段包含的字节数;
-
逻辑链路控制LLC(Logical Link Control)
由目的服务访问点DSAP(Destination Service Access Point)、源服务访问点SSAP(Source Service Access Point)和Control字段组成; -
SNAP(Sub-network Access Protocol)由机构代码(Org Code)和类型(Type)字段组成。Org Code三个字节都为0。Type字段的含义与Ethernet_Ⅱ中的Type字段相同;
LLC和SNAP共占用了Data字段的8个字节;
当DSAP和SSAP都取特定值0xff时,802.3帧就变成Netware-Ethernet帧,用于承载Netware类型的帧;
当DSAP和SSAP都取特定值0xaa时,802.3帧就变成Ethernet_SNAP帧,用于传输多种协议;
DSAP和SSAP其他的取值均为纯IEEE802.3帧。
4.3.1 802.3 Raw以太帧
+-----------+-----------+-----------+----------+------------------+----------+| DMAC | SMAC | Length | 0xFFFF | Data | FCS || 6 Bytes | 6 Bytes | 2 Bytes | 2 Bytes | Variable length | 4 Bytes |+-----------+-----------+-----------+----------+------------------+----------+
字段 | 长度 | 含义 |
---|---|---|
DMAC | 6字节 | 以太网帧的目的MAC地址,指明帧的接收者。 |
SMAC | 6字节 | 以太网帧的源MAC地址,指明帧的发送者。 |
Length | 2字节 | 指后续数据的字节长度,但不包括FCS字段。 |
Data | 44~1498字节 | 数据字段,标识帧的负载(可能包含填充位)。数据字段的最小长度必须为44字节以保证帧长至少为64字节,这意味着传输1字节信息也必须使用44字节的数据字段。如果填入该字段的信息少于44字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1498字节。以太帧的长度必须为整数字节,因此帧的负载长度不足整数字节,需插入填充字段以保证数据帧的长度为整数字节。 |
FCS | 4字节 | 帧校验序列FCS(Frame Check Sequence)是为接收网卡提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。FCS只是通用叫法,具体的FCS还可以细分多种校验方法。在以太帧中,FCS通常采用循环冗余码校验CRC(Cyclical Redundancy Check)。 |
802.3 RAW使用Length字段代替了type,又从Data里挪了2个字节赋值成0xFFFF。前面说过802.3 RAW是Novel公司在IEEE还未正式推出802.3时,在其临时版本上自己推出的一个版本。在802.3临时版中使用Length字段代替了type字段,Novel公司沿用了这个设定,但后续802.3正式发布时又从Data中挪了3个字节用作DSAP、SSAP、Control字段(各一个字节,下面会讲到)。为了与正式版的802.3做兼容和区分,RAW就把DSAP和SSAP这两个字段赋值成0xFFFF,同时Control字段还是划回到Data里去。
4.3.2 IEEE 802.3 LLC以太帧
+-----------+-----------+-----------+----------+----------+----------+------------------+----------+
| DMAC | SMAC | Length | DSAP | SSAP | Ctrl | Data | FCS |
| 6 Bytes | 6 Bytes | 2 Bytes | 1 Bytes | 1 Bytes | 1 Bytes | Variable length | 4 Bytes |
+-----------+-----------+-----------+----------+----------+----------+------------------+----------+
字段 | 长度 | 含义 |
---|---|---|
DMAC | 6字节 | 目的MAC地址,该字段标识帧的接收者。 |
SMAC | 6字节 | 源MAC地址,该字段标识帧的发送者。 |
Length | 2字节 | 指后续数据的字节长度,但不包括FCS字段。 |
DSAP | 1字节 | 目的服务访问点,长度为1字节,取值范围是0x00~0xFF。 |
SSAP | 1字节 | 源服务访问点,长度为1字节,取值范围是0x00~0xFF。 |
Ctrl | 1字节 | 该字段值通常设为0x03,表示无连接服务的IEEE 802.2无编号数据格式。 |
Data | 43~1497字节 | 数据字段,标识帧的负载(可能包含填充位)。 |
FCS | 4字节 | 帧校验序列FCS(Frame Check Sequence)是为接收网卡提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。FCS只是通用叫法,具体的FCS还可以细分多种校验方法。在以太帧中,FCS通常采用循环冗余码校验CRC(Cyclical Redundancy Check)。 |
4.3.3 IEEE 802.3 SNAP以太帧
+-----------+-----------+-----------+----------+----------+----------+---------+---------+------------------+----------+
| DMAC | SMAC | Length | DSAP | SSAP | Ctrl | OUI | Type | Data | FCS |
| 6 Bytes | 6 Bytes | 2 Bytes | 1 Bytes | 1 Bytes | 1 Bytes | 3 Bytes | 2 Bytes | Variable length | 4 Bytes |
+-----------+-----------+-----------+----------+----------+----------+---------+---------+------------------+----------+
字段 | 长度 | 含义 |
---|---|---|
DMAC | 6字节 | 目的MAC地址,该字段标识帧的接收者。 |
SMAC | 6字节 | 源MAC地址,该字段标识帧的发送者。 |
Length | 2字节 | 指后续数据的字节长度,但不包括FCS字段。 |
DSAP | 1字节 | 目的服务访问点,该值固定为0xAA。 |
SSAP | 1字节 | 源服务访问点,该值固定为0xAA。 |
Ctrl | 1字节 | 该字段值通常设为0x03,表示无连接服务的IEEE 802.2无编号数据格式。 |
SNAP-ID | 5字节 | 由OUI和Type两部分组成。 |
OUI | 3字节 | 3字节的组织唯一标识符(Organizationally Unique Identifier),其值通常等于MAC地址的前3字节,即网络适配器厂商代码。 |
Type | 2字节 | 标识以太网帧所携带的上层数据类型。根据RFC1042标准,OUI使用一个特殊的数值0x00-00-00,当这个字段为0x00-00-00时,Type字段与Ethernet II封装中的Type具有相同的含义。 |
Data | 38~1492字节 | 数据字段,标识帧的负载(可能包含填充位)。数据字段的最小长度必须为38字节以保证帧长至少为64字节,这意味着传输1字节信息也必须使用38字节的数据字段。如果填入该字段的信息少于38字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1492字节。以太帧的长度必须为整数字节,因此帧的负载长度不足整数字节,需插入填充字段以保证数据帧的长度为整数字节。 |
FCS | 4字节 | 帧校验序列FCS(Frame Check Sequence)是为接收网卡提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。FCS只是通用叫法,具体的FCS还可以细分多种校验方法。在以太帧中,FCS通常采用循环冗余码校验CRC(Cyclical Redundancy Check)。 |
SNAP是为了将802.3 LLC与Ethernet II进行兼容,兼容方式是保留Length、DSAP、SSAP、Control这4个字段,同时再从Data里挪5个字节用作SNAP字段。而SNAP字段又由2个部分组成,前3个字节是org code,其含义是组织代码,其实就是MAC地址里前3个字节,所以其实没啥用。后2个字节是type与Ethernet II的type字段一模一样。其实也是通过这个SNAP里的type字段与Ethernet II帧兼容。
为了与LLC帧进行区别,DSAP、SSAP的值固定为0xAA,Control的值固定为0x03。
4.4 IEEE 802.1Q标签
IEEE 802.1Q标准对以太帧格式进行了修改,在源MAC地址字段和协议类型字段之间加入4字节的802.1Q Tag。802.1Q Tag也称为VLAN Tag,带有VLAN Tag的以太帧称为VLAN帧。
所有四种以太帧类型都可包含一个IEEE 802.1Q选项来确定它属于哪个VLAN以及他的IEEE 802.1p优先级(QoS)。这个封装由IEEE 802.3ac定义并将帧大小从64字节扩充到1522字节(注:不包含7个前导字节和1个字节的帧开始符以及12个帧间距字节)。
+-----------+----------+--------+-----------+| TPID | PRI | CFI | VID || 2 Bytes | 3 Bits | 1 Bits | 12 Bits |+-----------+----------+--------+-----------+| || || || |
+-----------+-----------+--------------+---------------+------+-----------+----------+
| DMAC | SMAC | 802.1Q Tag | Length/Type | Data | FCS |
| 6 Bytes | 6 Bytes | 4 Bytes | 2 Bytes | Variable length | 4 Bytes |
+-----------+-----------+--------------+---------------+------+-----------+----------+
4字节的VLAN TAG 包含以下参数:
- 2个字节的标签协议标识:0x8100
- 2个字节的标签控制信息:
- 用户优先级:3 位,取值范围0~7,值越大优先级越大。
- CFI规范格式标识符:1位,0代表帧VLAN正确,1代表VLAN错误
- VID:12位,标识VALN ID,也就是VLAN号
4.5 最小帧长
以太网帧最小帧长为64B——有效载荷46字节,这是信号从争取信道到占领信道的最短时间。
凡是小于64B的帧,都视为被冲突破坏的信号,应当丢弃。如果要发送小于64B的帧,需要MAC子层在数据字段后填充字段。
这个长度是由CSMA/CD(载波侦听多路访问/碰撞检测)算法以及最大传输距离的需求共同决定的。这样的设计可以避免在网络中发生不必要的冲突,确保数据包能够在网络中正确传输。如果数据包太短,例如小于64字节,那么它可能在发送过程中被网络中的其他设备误解为冲突信号,从而导致数据丢失或重传。因此,最小帧长有助于区分由冲突引起的短帧和正常传输的有用帧,从而保证数据传输的效率和可靠性。
规定对10Mbps以太网一帧的最小发送时间为51.2微秒。这段时间所能传输的数据为512位,因此也称该时间为512位时。这个时间定义为以太网时隙,或冲突时槽。512位=64字节,这就是以太网帧最小64字节的原因。
4.6 最大帧长
以太网的最大帧长度为1518字节(不包括帧校验序列),其中包括最大的数据帧长度为1500字节和额外的帧头和帧尾。最大帧长度的设置是为了避免单一主机占用信道时间过长。在不同的网络环境下,能够适应不同的数据传输需求和网络负载。
MAC帧协议规定自己的有效载荷不能超过1500字节(由MTU控制——最大传送单元,可以修改),这1500个字节限制包括了上层报头+有效载荷。
路由器也是主机,也有自己的最大MTU的限制,如果某个路由器的MTU为500字节,但是接收到了局域网内某个主机1500字节的报文,这是路由器就会对这个报文再次进行分片组装!
数据包的大小只有传输层能控制,但有时仍会超过1500字节,只能由IP协议进行分片与组装来解决,发送端IP层进行分片,每一个分片都会有IP报头,对端IP层进行组装(字节超限并不是主流情况)。TCP和MAC帧并不关心IP对数据包进行了分片和组装,这仅仅是IP层自己的行为。
4.7 协议类型
如上图,0x0800表示要分用给IP协议,0x0806表示要分用给ARP协议,0x8035表示要交给RARP协议,后两者协议在后面会详细介绍。
4.8 解包
从整个数据帧读取前14个字节,然后再从最后读取4个字节,剩下的就是有效载荷,如此就完成了解包过程。
4.9 分用
根据帧协议类型交给对应的上层协议即可,如0x0800就交给网络层的IP协议去处理有效载荷。
五、MTU
对于以太网来说,既然会存在碰撞,那么发生的数据帧是长了好还是短了好呢?
太长和太短都不行,太短会导致数据帧无法校验,因为CRC校验是需要数据帧中有一定数量的有效载荷的,所以MAC帧协议规定,有效载荷的长度要大于等于46字节。如果最终交付到数据链路层的有效载荷太小,小于46字节,MAC帧协议会在后面补充到46字节。
如果太长的话,数据在以太网中传输的时间就会变长,从而增加了数据碰撞的概率,也不合适,所以MAC帧协议规定有效载荷的最大值是1500字节,也被叫做以太网的最大传输单元(MTU)。
不同的网络类型有不同的MTU。
如果IP层的数据报大于MTU了,则需要分片,然后再交给数据链路层。
5.1 MTU对IP协议的影响
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包:
- 将较大的IP包分成多个小包, 并给每个小包打上标签;
- 每个小包IP协议头的 16位标识(id) 都是相同的;
- 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
- 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
- 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败,但是IP层不会负责重新传输数据,传输层若为TCP将超时重传,UDP将表现为丢包。
5.2 MTU对UDP协议的影响
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。
5.3 MTU对TCP协议的影响
- TCP的一个数据报也不能无限大, 还是受制于MTU。TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
- TCP在建立连接的过程中, 通信双方会进行MSS协商。最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
- 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS。
- MSS的值就是在TCP首部的40字节变长选项中(kind=2)。
六、ARP协议
https://www.ietf.org/rfc/rfc826.txt
6.1 ARP协议的作用
ARP协议是一个介于数据链路层和网络层之间的协议。
在局域网通信中,必须得知道目标主机的MAC地址才能将数据封装成MAC帧。
源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的MAC地址,需要使用ARP协议来查找IP和MAC地址的映射关系。
6.2 ARP老化
ARP缓存表中保存了IP地址和对应的MAC地址映射关系。但是,网络中的设备是动态的,可能会发生IP地址分配变化或设备更换的情况。为了保持ARP缓存表的准确性,需要一种机制来处理过时的条目。这就是ARP老化机制。
ARP老化是指ARP缓存表中的条目在一定时间内没有被使用而被删除的过程。每个条目都有一个生存时间(存活时间),一般默认为20分钟左右。如果在该时间内没有再次与该IP地址通信,那么该条目将被删除。当然,如果在生存时间内继续与该IP地址通信,那么该条目的生存时间会被重置,以保持其有效性。
在Linux中,ARP老化是由内核的网络协议栈负责的。内核会定期检查ARP缓存表中的条目,并清除过时的条目,以确保ARP缓存表的及时更新。
6.3 ARP协议格式
ARP协议下层是MAC帧(帧类型为0x0806)。
ARP数据包字段:
- 硬件类型,2字节。指链路层网络类型, 1为以太网。
- 协议类型,2字节。指发送方要转换的地址类型,0x0800为IP地址;
- 硬件地址长度,1字节。对于ARP请求或者应答来说,该值为6,物理地址长度。
- 协议地址长度,1字节。对于ARP请求或者应答来说,该值为4,IP地址长度。
- op操作类型,2字节。1表示ARP请求,2表示ARP应答。
- 发送端以太网地址,6字节。和以太网源地址相同。
- 发送端IP地址,4字节。
- 目的以太网地址,6字节。发送ARP请求时,该字段置0。
- 目的IP地址,4字节。
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
6.4 ARP请求
6.4.1 ARP广播请求
当一个主机第一次想去获取同一网络中某个设备的MAC地址,由于此时主机不知道设备的MAC地址,所以只能广播ARP请求,以便于这个ARP请求能被设备收到;当第一个过程走完之后(其实就是主机收到了设备的ARP应答),双方都知道对方的IP–MAC映射,也会在自己的ARP表中生成这个映射。
这是一条10.10.11.14发出的广播请求,询问10.10.11.114的MAC地址。
- 硬件类型为1,说明为以太网
- 协议类型为0x0800, IPv4
- 硬件地址长度为6
- 协议长度为4
- 操作类型为1,表示ARP请求
- 发送端MAC地址 和 MAC帧头部源MAC地址一样。
- 发送端IP地址为本机地址
- 目的以太网地址留空,ARP请求置0
- 目的IP地址,就是要查询的IP地址。
MAC地址FF:FF:FF:FF:FF:FF, 代表这是一个广播MAC帧。
6.4.2 ARP单播请求
由于ARP老化机制第二种–单播轮询,主机会定期向设备发送点到点的单播ARP请求报文,用来确认对方是否存在,确认这条ARP缓存是该更新(主要是更新老化定时器)还是删除,同时,使用单播还可以减少网络中的ARP报文数量;因此。这种"明知故问"的单播ARP请求报文其实是非常合理的
这是10.10.11.114发出的一个ARP请求,问询10.10.11.14的MAC地址,以前已经知道,才能填写在MAC帧的首部,但是要过期了,查询是否需要更新。
6.5 ARP应答
目的主机接收到ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;ARP收到应答的时候,会以最新的应答为准。
当被请求主机发送ARP应答时,其他主机在数据链路层就可以通过以太网目的地址字段区分这个MAC帧是不是给我的。
6.6 Gratuitous ARP(免费 ARP)
Gratuitous ARP 是一种特殊的 ARP 请求,当主机启动时,发送一个 Gratuitous ARP 请求,即请求自己的 IP 地址和 MAC 地址,即目标 IP 地址为 自己的 IP 地址。
Gratuitous ARP 的作用 - 以广播的形式发送自己的 IP 地址 和 MAC 地址,在网络中宣告自己的信息,可以是宣告新添加的主机或者更新自己的 MAC 地址 - 检测 IP 地址冲突,若收到了 ARP 响应报文,则说明网络中已存在使用该 IP 地址的主机。
七、RARP协议
Reverse Address Resolution Protocal,逆地址解析协议。
https://www.ietf.org/rfc/rfc903.txt
7.1 RARP协议作用
允许局域网的物理机器使用MAC地址,从网关服务器的ARP表或缓存上请求IP地址。
主要用于无盘工作站,因为给无盘工作站配置IP地址不能保存。
在网络中配置一台RARP服务器,里面保存着IP地址和MAC地址的映射关系,当无盘工作站启动后,就封装一个RARP数据包,里面有其MAC地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的MAC地址的IP地址装入响应报文中发回给请求者。因为需要广播请求报文,因此,RARP只能用于具有广播能力的网络。
7.2 RARP工作原理
- 发送端发送一个本地的RARP广播包,在此广播包中声明自己的MAC地址,并且请求任何收到此请求的RARP服务器分配一个IP地址。
- 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址。如果存在,RARP服务器就给源主机发送一个响应数据包,并将此IP地址提供给对方主机使用;如果不存在,RARP服务器对此不做任何响应。
- 源端在收到从RARP服务器来的响应信息后,利用得到的IP地址进行通信;如果一直没有收到RARP服务器的响应信息,则表示初始化失败。
7.3 RARP协议格式
RARP协议格式和ARP协议格式相同。使用区别是:
- RARP请求或应答帧代码类型是0x8035,
- RARP的请求的操作代码是3,应答操作代码是4。
可以看出这个包发送出来的时候是没有IP地址的——因为不知道,就是要查询自己的IP。
然后是目的MAC是一个广播地址。
八、以太网帧Frame的传输过程
以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据。通过查看包含在帧中的目标地址,确定是否进行接收或放弃。如果证明数据确实是发给自己的,工作站将会接收数据并传递给高层协议进行处理。
以太网采用CSMA/CD媒体访问机制,任何工作站都可以在任何时间访问网络。在发送数据之前,工作站首先需要侦听网络是否空闲,如果网络上没有任何数据传送,工作站就会把所要发送的信息投放到网络当中。否则,工作站只能等待网络下一次出现空闲的时候再进行数据的发送。
而局域网中存在多台主机,这些主机都和以太网相连,都能够看到以太网,故而也能看到以太网中跑的数据。
网络通信本质上就是进程间通信,而网络就是临界资源。
所以局域网中的所有主机都唔那个收到主机MAC1发送的数据,每台主机在收到数据后,数据链路层会对比数据帧报头中的目的MAC地址,如果和自己的MAC地址相同,则进行解包分用交给下一层。
如果数据帧报头中的目的MAC地址和自己的MAC地址不符,那么直接在数据链路层就丢弃该数据,上层根本不知道曾经有过这个数据。
8.1 单播
主机B给主机C发送单播帧,主机B首先要构建该单播帧,在帧首部中的目的地址字段填入主机C的MAC地址,源地址字段填入自己的MAC地址,再加上帧首部的其他字段、数据载荷以及帧尾部,就构成了该单播帧
主机B将该单播帧发送出去,主机A和C都会收到该单播帧
主机A的网卡发现该单播帧的目的MAC地址与自己的MAC地址不匹配,于是丢弃该帧
主机C的网卡发现该单播帧的目的MAC地址与自己的MAC地址匹配,于是接受该帧,并将该帧交给其上层处理
8.2 广播
假设主机B要发送一个广播帧,主机B首先要构建该广播帧,在帧首部中的目的地址字段填入广播地址,也就是十六进制的全F,源地址字段填入自己的MAC地址,再加上帧首部中的其他字段、数据载荷以及帧尾部,就构成了该广播帧
主机B将该广播帧发送出去,主机A和C都会收到该广播帧,发现该帧首部中的目的地址字段的内容是广播地址,就知道该帧是广播帧,主机A和主机C都接受该帧,并将该帧交给上层处理
8.3 多播
假设主机A要发送多播帧给该多播地址。将该多播地址的左起第一个字节写成8个比特,第一个字节的最低比特位是1,这就表明该地址是多播地址
快速判断地址是不是多播地址,就是上图所示箭头所指的第十六进制数不能整除2(1,3,5,7,9,B,D,F),则该地址是多播地址
假设主机B,C和D支持MAC多播,各用户给自己的主机配置多播组列表如下所示
主机B属于两个多播组,主机C也属于两个多播组,而主机D不属于任何多播组
主机A首先要构建该多播帧,在帧首部中的目的地址字段填入该多播地址,源地址字段填入自己的MAC地址,再加上帧首部中的其他字段、数据载荷以及帧尾部,就构成了该多播帧
主机A将该多播帧发送出去,主机B、C、D都会收到该多播帧
主机B和C发现该多播帧的目的MAC地址在自己的多播组列表中,因此主机B和C都会接受该**多播帧,**并交付给上层处理
主机D发现该多播帧的目的MAC地址不在自己的多播组列表中,则丢弃该多播帧
8.3 两主机同一子网,不经过网关
当主机A发向主机B的数据流在网络层封装成IP数据包,IP数据包的首部包含了源地址和⽬标地址。
主机A会⽤本机配置的24位IP网络掩码255.255.255.0与目标地址进⾏与运算,得出⽬标网络地址与本机的⽹络地址是不是在同⼀个⽹段中。
如果在同一个子网,可以通过ARP协议获取目的IP的MAC地址,数据链路层直接封装以太网帧发送出去。
这个过程中源IP、目标IP、源MAC、目标MAC都不会改变。
8.3 路由转发过程
当主机A发向主机B的数据流在网络层封装成IP数据包,IP数据包的首部包含了源地址和⽬标地址。
主机A会⽤本机配置的24位IP网络掩码255.255.255.0与目标地址进⾏与运算,得出⽬标网络地址与本机的⽹络地址是不是在同⼀个⽹段中。
如果不是将IP数据包转发到网关。在发往⽹关前主机A还会通过ARP的请求获得默认⽹关的MAC地址。在主机A数据链路层IP数据包封装成以太网数据帧,然后才发住到网关……也就是路由器上的⼀个端⼝。
当网关路由器接收到以太网数据帧时,发现数据帧中的目标MAC地址是自己的某⼀个端⼝的物理地址,这时路由器会把以太网数据帧的封装去掉。路由器认为这个IP数据包是要通过自己进行转发,接着它就在匹配路由表。匹配到路由项后,它就将包发往下⼀条地址。
IP地址始终不变
目的IP地址是为了确认目的主机。如果IP地址改变则目的主机改变无法进行正常通信。
源IP地址由于NAT等相关技术可能会发生变化,看情况。
经过交换机, 源/目的MAC地址不变
数据帧在交换机之间转发。在一个网段内部,通过数据包通过MAC寻址(二层交换机和终端都有MAC表,查表或者通过MAC广播)因此在二层交换机,数据包里的源目MAC地址肩负着把数据包从发包终端传递到目的IP所在终端(网段的其他主机~其他网段IP的话就是给网关)的任务。
经过路由器,源/目的MAC地址变
经过路由器,由于三层设备转发,跨网段了,原来的MAC地址当然就不能使用了,所以出接口的MAC此时成为在新一个网段实现两个IP之间寻址的源MAC,根据MAC表找到匹配到的路由条目指出的需要转给的下一个IP的MAC地址(没的话ARP广播得到),然后封装好新的源目MAC,转给新网段之间的交换机。。。直到完成新的网段里两点之间的数据包的传递。
在帧不断转发的过程中,IP源/目的地址不变,MAC源/目的地址根据所经过的路由器端口变化。
参考:
- https://www.cnblogs.com/kingwz/p/16938768.html
- https://blog.csdn.net/sj15814963053/article/details/124128878
相关文章:

Linux网络编程: 以太网帧Frame/ARP/RARP详解
一、TCP/IP五层模型 物理层(Physical Layer):物理层是最底层,负责传输比特流(bitstream)以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流,例如通过电缆、光纤或无线传输等。…...
【SpringCloud微服务实战09】Elasticsearch 搜索引擎
一、Elasticsearch 安装 1、Docker安装ES #创建一个网络 docker network create es-net#拉取ES镜像(这里使用7.17.18版本) docker pull elasticsearch:7.17.18#新建一个目录存放es数据 mkdir es cd es#docker运行 单机启动es docker run -d \--name es \-e "ES_JAVA_O…...

Leetcode 31. 删除无效的括号
心路历程: 一开始看到有点懵,后来发现有点像按照一定规则穷举所有可能情况,想到了排列组合问题,再结合问题长度不固定,无法用已知个for循环表示,从而想到了回溯。这个题相当于需要在一定规则下枚举。 按照…...

首页效果炫酷的wordpress免费主题模板
视频背景免费WP主题 简洁大气的视频背景wordpress主题,找大视频背景的主题可以看看这个。 https://www.wpniu.com/themes/193.html 红色全屏大图WP主题 非常经典的一款免费wordpress主题,红色全屏大图满足多行业使用。 https://www.wpniu.com/themes…...

网络安全的几个关键领域
网络安全是一个复杂且多维度的领域,涵盖了多个关键领域,涉及到信息保护、网络防护、应用安全、用户教育以及物理安全等多个方面。这些关键领域相互交织,共同构成了网络安全这一宏大且细致入微的领域。 今天德迅云安全就分享下网络安全的几个…...

Vue 计算属性和监视属性
Vue 计算属性和监视属性 computed computed 计算属性 规则: 用已有的属性计算不存在的属性默认调用一次get()只有值不发生改变的时候才可以使用简写(函数);值发生改变 使用对象式写法,才可以配置set()方法底层原理使…...

【Python】反编译PyInstaller打包的exe
查看exe基本信息 需要反编译的exe 查看exe文件的打包工具,查看exe信息的软件叫Detect It Easy(查壳工具) 由图我们可以看出当前选中的exe文件是由名叫PyInstaller的打包工具打包好的exe 反编译 exe反编译工具:pyinstxtractor.py 使用方法 python py…...

【数据结构】哈希表与哈希桶
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.概念 2.哈希冲突…...

幼儿教育管理系统|基于jsp 技术+ Mysql+Java的幼儿教育管理系统设计与实现(可运行源码+数据库+设计文档)
推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…...

【赠书第21期】游戏力:竞技游戏设计实战教程
文章目录 前言 1 竞技游戏设计的核心要素 1.1 游戏机制 1.2 角色与技能 1.3 地图与环境 2 竞技游戏设计的策略与方法 2.1 以玩家为中心 2.2 不断迭代与优化 2.3 营造竞技氛围与社区文化 3 实战案例分析 4 结语 5 推荐图书 6 粉丝福利 前言 在数字化时代的浪潮中&…...

基于VMware虚拟机安装MacOS BigSur系统
这周用VMWare搞了个MacOS虚拟机,也算是完成初中高中时候的梦想了吧~~(那时候我的电脑配置还很拉跨,带不动虚拟机)~~ 写一篇博客记录一下,当然这也是yonagi04.github.io建站的第一篇新博客 准备工作(VMWare…...

C++特性三:多态的基本语法及原理剖析
一、多态的基本语法 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名 动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定 - 编译阶段确定函数地址 动态多态的函数地址晚绑定 - 运…...
Windows下的TCP/IP实例
1.注意事项 windows下winsock.h/winsock2.h linux下sys/socket.h 不同平台头文件不一样 #include <winsock.h> 或者 #include <winsock2.h> 2. 安装minGW 目标是在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具,使开发者能够轻松地在 Wind…...

硬件学习件Cadence day15 allegro 查看state 后发现有网络未连接怎么办, shape 有问题怎么办,
1. 当我们查看 state 有问题怎么解决 1. 有问题的图片 2.解决办法: A.网络和节点有问题 如下图所示,点开下面这个窗口进行下面操作,能简单的网络未连接问题。 如下图所示,能进一步解决更难得网络节点未连接问题 如下图所示&#x…...
nginx 中 user 配置的作用
在 Nginx 配置文件中,user 指令用于指定 Nginx 运行时所使用的用户和用户组。默认情况下,Nginx 会以 nobody 用户的身份运行(即使使用 root 用户运行nginx进程, nginx运行过程中线程的用户还是用的nobody),这是一个低权限用户,专门…...
愚人节礼物(C++)
这不愚人节 快到了吗?身为顶级程序员,不用c编写愚人节礼物那心里是很不舒服的,所以,趁着愚人节到来之际,下面分享一种坑朋友的c代码: 内容包含一些敏感词,如果对你产生了影响或伤害,…...
Lua 学习
参照 注释 -- 这是单行注释--[[这是多行注释--]]if语句 if true thenprint(true) endif else语句 nil是false if nil thenprint("nil被当作true处理") elseprint("nil被当作false处理") end运算符 % 取余 ^ 乘幂 A10,A^2100 // 整除运算符࿰…...

YOLOv7 | 添加GSConv,VoVGSCSP等多种卷积,有效提升目标检测效果,代码改进(超详细)
⭐欢迎大家订阅我的专栏一起学习⭐ 🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀 YOLOv5涨点专栏:http://t.csdnimg.cn/QdCj6 YOLOv7专栏: http://t.csdnimg.cn/dy…...

『运维心得』BPC-EPM-AddIn专家看过来
目录 系统版本问题 安装顺序问题 framework问题 vstor_redis问题 dll问题 一个小彩蛋 总结 最近在搞BPC,安装Office所需的EPM-AddIn的过程中,碰到了一些奇怪的问题。 查了BPC专家提供的安装说明文档,文档里要么没有提到我们碰到的问题…...

论文浅尝 | GPT-RE:基于大语言模型针对关系抽取的上下文学习
笔记整理:张廉臣,东南大学硕士,研究方向为自然语言处理、信息抽取 链接:https://arxiv.org/pdf/2305.02105.pdf 1、动机 在很多自然语言处理任务中,上下文学习的性能已经媲美甚至超过了全资源微调的方法。但是…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...