以太网是现实世界中最普遍的一种计算机网络。以太网有两类:第一类是经典以太网,第二类是交换式以太网,使用了一种称为交换机的设备连接不同的计算机。
经典以太网
物理层:以太网的每个版本都有电缆的最大长度限制(即无须放大的长度),这个范围内的信号可以正常传播,超过这个范围信号将无法传播。为了允许建设更大的网络,可以用中继器把多条电缆连接起来。中继器是一个物理层设备,它能接收、放大并在两个方向上重发信号。
MAC 子层:经典以太网使用1-坚持 CSMA/CD 算法,即当站有帧要发送时要侦听介质,一旦介质变为空闲便立即发送。在它们发送的同时监测信道上是否有冲突。如果有冲突,则立即终止传输,并发出一个短冲突加强信号,再等待一段随机时间后重发。
其实局域网技术还有令牌环、FDDI 和 ATM 等,但是以太网仍然具有很多独特的优势,使其保持着广泛的使用,原因有:
初始的以太局域网使用同轴电缆总线互联结点,也就是总线型。使用总线拓扑的以太网是广播局域网,也就是所有传输的真传输到总线连接的所有适配器来处理。这就说明了所有结点会在同一冲突域中,因此彼此之间很容易发生冲突,需要用具有二进制指数回退的 CSMA/CD 多路访问协议。
在发展之后就出现了基于集线器的星形拓扑以太网,集线器是物理层设备,操作的不是以太帧而是各个字节。集线器的工作原理是当在一个接口接收到一个比特,就将这个比特生成一个副本并向其他接口发送。随着不断的发展,后续交换机取代了集线器,仍然使用星形拓扑。星形拓扑的好特点是没一个节点的冲突域是单独的,结点间彼此不冲突。
以太帧有很多种类型。不同类型的帧具有不同的格式和 MTU 值。但在同种物理媒体上都可同时存在。
1. Ethernet帧格式
以太网中大多数的数据帧使用的是 Ethernet II 格式
Ethernet II 类型以太网帧的最小长度为 64 字节( 6 + 6 + 2 + 46 + 4 6+6+2+46+4 6+6+2+46+4),最大长度为 1518 字节( 6 + 6 + 2 + 1500 + 4 6+6+2+1500+4 6+6+2+1500+4)。其中:
2. IEEE 802.3 帧格式
各字段说明如下:
IEEE 802.2 LLC的头构成:
类型1 表明是无连接的,不可靠的 LLC 数据报,控制字段用0x03指明;类型 2 表明是面向连接可靠的 LLC 会话。
3. IEEE 802.3 SNAP
虽然 IEEE 802.3 是标准,但没有被业界采用。以太网 II 已成事实标准。于是 IEEE 802.3 扩展产生 IEEE 802.3 SNAP 来兼容以太网网头部协议,在 IEEE 802.2 LLC 头部后插入了 SNAP 头部。SNAP 头部字段构成:
(1) 组织代码 3 字节长,指明维护接下来 2 字节意义的组织,对 IP 和 ARP,该字段被设置为0x00-00-00。
(2) 以太网类型 如果组织代码为0x00-00-00,接下来 2 字节就是以太网类型 IP (0x0800)ARP(0x0806)。
因为增加了 LLC 头部的 3 字节和 SNAP 头部的 5 字节所以有效载荷比以太网 II 少 8 个字节。
4. Ethernrt 包
Ethernet II 类型以太网的帧结构:
以太网向网络层提供 2 种服务。首先是无连接服务,也就是适配器之间发送接收真,发送网卡和接收网卡间不需要“握手”,类似于 IP 协议和 UDP 协议。第二是不可靠服务,虽然接收适配器执行 CRC 校验,但是这个校验并不发送类似 ACK 的确认帧。虽然将到时传递到网络层的数据流出现间隙,这种传输方式可以使得以太网可以简洁且便宜。对于这种间隙,接收方遇到查错帧就直接丢弃,若要修复丢弃帧的数据,需要依靠类似 TCP 这样的高层协议。
由于 IP 地址是网络层地址,MAC 地址是链路层地址,因此当我需要传输数据时就需要对地址进行转换。在同一个 LAN 里如何在已知目的 IP 地址的前提下确定 MAC 地址?这就需要 ARP 协议。这个好像和 DNS 有些相似之处,DNS 是在因特网中进行主机的主机名解析,ARP 是在一个子网上的主机和路由器接口解析 IP 地址。
每台主机和路由器在内存中有 ARP 缓存表,表中有 3 个内容,前两个是 IP 地址和 MAC 地址,这表示了 IP 地址和对应的 MAC 地址的映射关系,还有一个是 TTL,这是每个映射关系保存的时间,这是因为我们其实不必要去为每一台主机和路由器都存储映射关系,毕竟有的主机我可能从来不访问。
ARP 缓存表使用过程:
拥有 ARP 表之后是怎么实现功能呢?首先发送方构造一个 ARP 查询分组,这个分组用于询问子网上的所有主机和路由器,使用 MAC 广播地址(FF-FF-FF-FF-FF-FF)发送分组,LAN 中的所有结点都会受到这个 ARP 查询分组,此时只有接收方会接收这个分组匹配,这个匹配是通过ARP 模块实现的,模块的作用是将适配器将 ARP 分组传入时,检查 IP 地址是否与 ARP 的目的 IP 地址匹配。匹配成功之后就可以用单播(不是广播)发送 ARP 响应分组,其他的就忽略这个分组。发送方接收到这个响应分组之后,就在 ARP 表中缓存该 IP-MAC 映射关系,然后超时后刷新。
这里有 2 个细节需要注意。首先是 ARP 查询分组是广播,而响应分组是单播。第二是 ARP 是即插即用的,也就是 ARP 表不需要手动配置,只需要让协议自动建立就行。
ARP(Address Resolution Protocol),地址解析协议,是根据 IP 地址获取物理地址的一个 TCP/IP 协议。主机发送信息时将包含目标 IP 地址的 ARP 请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该 IP 地址和物理地址存入本机 ARP 缓存中并保留一定时间,下次请求时直接查询 ARP 缓存以节约资源
ARP 协议是通过报文工作的,报文格式如下:
在相同子网内的 ARP 很好理解,那么当子网中的主机要向子网外发送网络层数据报时,ARP 又是怎么工作的呢?对于主机,每台主机只有一个 IP 地址和一个适配器,对于一台路由器来说,每个接口都有一个 IP 地址,也都有一个 ARP 模块和一个适配器。
当一个子网向另一个子网发送 IP 数据报时,发送主机向适配器传递,此时应该传递什么 MAC 地址呢?明显不是目的主机的 MAC 地址,因为在所在子网中该地址与所有的适配器之间都不匹配,那就只好丢弃了。所以适当的 MAC 地址应该是路由器接口的适配器地址,但是路由器接口的 MAC 地址怎么获取?ARP 嘛!
接下来路由器就需要将数据报发到正确的目的地去,也就是要发到哪个接口去呢?可以查询路由器的转发表,根据转发表送到对应的接口去。接口收到数据包之后,适配器把数据报封装到新的帧中,发送到下一个子网去,下一个子网的 MAC 地址怎么确定?再搞个 ARP 就行了!
如果 ARP 请求是从一个网络上的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该 ARP 请求,这个过程称作代理 ARP(Proxy ARP)。
当连接这两个网络的路由器收到该 ARP 请求时,它会发现自己有通向目的主机的路径,随后它会将自己(路由器)的 MAC 地址回复给源主机。源主机会认为路由器的 MAC 地址就是目的主机的 MAC 地址,而对于随后发来的数据帧,路由器会转发到它后面真实 MAC 地址的目的主机。
两个物理网络之间的路由器可以使这两个网络彼此透明化,在这种情况下,只要路由器设置成一个 ARP 代理,以响应一个网络到另一个网络主机的 ARP 请求,两个物理网络就可以使用相同的网络号。
从 ARP 代理的原理可以看出来:IP - MAC 的对应信息很容易被伪造!黑客可以伪造 ARP 应答数据帧而欺骗 ARP 请求者,从而达到截获数据的目的。
RARP 与 ARP 是相反的关系,用于将 MAC 地址转换为 IP 地址。对应于 ARP,RARP 请求以广播方式传送,而 RARP 应答一般是单播传送的。
某些设备,比如无盘机在启动时可能不知道自己的 IP 地址,它们可以将自己的 MAC 地址使用 RARP 请求广播出去,RARP 服务器就会响应并回复无盘机的 IP 地址。
实验步骤
打开以下 URL “http://gaia.cs.umass.edu/wireshark-labs/HTTP-ethereal-lab-file3.html” 您的浏览器应显示一段长文档。
问题解答
根据包含 HTTP GET 消息的以太网帧进行分析:
ARP 协议通常在您的计算机上维护 IP 到以太网地址转换对的缓存 .arp 命令(在 MSDOS 和 Linux / Unix 中)用于查看和操作此缓存的内容。 arp 命令用于查看和操作 ARP 缓存内容,而 ARP 协议定义了发送和接收的消息的格式和含义,并定义了对消息传输和接收所采取的操作。
现在查看计算机上 ARP 缓存的内容,没有参数的 Windows arp 命令将显示计算机上 ARP 缓存的内容,运行 ARP 命令。
arp -a
arp -d *
确保浏览器的缓存是空的,启动 Wireshark 捕捉封包。
打开以下 URL “http://gaia.cs.umass.edu/wireshark-labs/HTTP-ethereal-lab-file3.html”,你的浏览器应该再次显示长文档。
同样设置不显示 IP 和更高层协议
问题解答
a) ARP 操作码字段开始从以太网帧的最开始有多少字节?
答:16 + 5 = 21 Byte
b) 在进行 ARP 请求的以太网帧的 ARP 负载部分中,操作码字段的值是多少?
答:操作码的值为 1。见上图
c) ARP 消息是否包含发送方的 IP 地址?
答:ARP 消息包含发送方的 IP 地址。
d) 在 ARP 请求中从哪里看出我们要查询相应 IP 的以太网地址?
a) ARP 操作码字段开始从以太网帧的最开始有多少字节?
16 + 5 = 21 Byte
b) 在进行 ARP 响应的以太网帧的 ARP 负载部分中,操作码字段的值是多少?
操作码的值为 2。