Linux网络编程: 以太网帧Frame/ARP/RARP详解

一、TCP/IP五层模型

  1. 物理层(Physical Layer):物理层是最底层,负责传输比特流(bitstream)以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流,例如通过电缆、光纤或无线传输等。

  2. 数据链路层(Data Link Layer):数据链路层位于物理层之上,负责在直接相连的节点之间传输数据帧(Frame)。它将比特流组织成帧,并提供数据的可靠传输、差错检测和纠正等功能。常见的协议包括以太网(Ethernet)和Wi-Fi。

  3. 网络层(Network Layer):网络层处理分组(Packet)的传输和路由,负责将数据从源主机传输到目标主机。它定义了逻辑地址(如IP地址)和路由选择算法,并通过Internet Protocol (IP) 进行数据的分组、定址和转发。

  4. 传输层(Transport Layer):传输层提供端到端的可靠数据传输服务,负责将数据从发送方传输到接收方的端口。它通过传输协议(如TCP和UDP)提供了连接管理、流量控制、差错检测和纠正等功能。

  5. 应用层(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数据包要进行分包:

  1. 将较大的IP包分成多个小包, 并给每个小包打上标签;
  2. 每个小包IP协议头的 16位标识(id) 都是相同的;
  3. 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
  4. 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
  5. 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败,但是IP层不会负责重新传输数据,传输层若为TCP将超时重传,UDP将表现为丢包。

5.2 MTU对UDP协议的影响

  1. 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。
  2. 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。

5.3 MTU对TCP协议的影响

  1. TCP的一个数据报也不能无限大, 还是受制于MTU。TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
  2. TCP在建立连接的过程中, 通信双方会进行MSS协商。最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。
  3. 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
  4. 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS。
  5. 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工作原理

  1. 发送端发送一个本地的RARP广播包,在此广播包中声明自己的MAC地址,并且请求任何收到此请求的RARP服务器分配一个IP地址。
  2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址。如果存在,RARP服务器就给源主机发送一个响应数据包,并将此IP地址提供给对方主机使用;如果不存在,RARP服务器对此不做任何响应。
  3. 源端在收到从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源/目的地址根据所经过的路由器端口变化。

参考:

相关推荐
不想起昵称9294 分钟前
Linux SHELL脚本中的变量与运算
linux
loong_XL10 分钟前
服务器ip:port服务用nginx 域名代理
服务器·tcp/ip·nginx
网络安全Jack28 分钟前
网络安全概论——身份认证
网络·数据库·web安全
易我数据恢复大师30 分钟前
如何彻底删除电脑数据以防止隐私泄露
网络·电脑·数据删除·擦除
the丶only32 分钟前
单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
linux·运维·服务器·docker·gitlab
学习溢出1 小时前
【网络安全】逆向工程 练习示例
网络·安全·网络安全·渗透测试·逆向工程
枫叶红花1 小时前
【Linux系统编程】:信号(2)——信号的产生
linux·运维·服务器
_微风轻起2 小时前
linux下网络编程socket&select&epoll的底层实现原理
linux·网络
WANGWUSAN662 小时前
Python高频写法总结!
java·linux·开发语言·数据库·经验分享·python·编程