一、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源/目的地址根据所经过的路由器端口变化。
参考: