Wireshark Lab: Ethernet and ARP v7.0
实验内容戳这里
介绍部分转自乌漆WhiteMoon
Ethernet
以太网
以太网在现在的有线局域网中有着支配者的地位,就像是因特网使得全球互联那样。其实局域网技术还有令牌环、FDDI 和 ATM 等,但是以太网仍然具有很多独特的优势,使其保持着广泛的使用,原因有:
- 以太网是第一个广泛部署的高速局域网,网络从业者对其更为熟悉;
- 以太网相对令牌环、FDDI 和 ATM 等技术更为简洁、便宜;
- 以太网也不断发展,诞生出更多数据效率高的新版本,使得其可以与新的局域网技术仍保持竞争力;
- 以太网的网络硬件很便宜,因为以太网技术非常流行。
以太网硬件
初始的以太局域网使用同轴电缆总线互联结点,也就是总线型。使用总线拓扑的以太网是广播局域网,也就是所有传输的真传输到总线连接的所有适配器来处理。这就说明了所有结点会在同一冲突域中,因此彼此之间很容易发生冲突,需要用具有二进制指数回退的CSMA/CD 多路访问协议。
在发展之后就出现了基于集线器的星形拓扑以太网,集线器是物理层设备,操作的不是以太帧而是各个字节。集线器的工作原理是当在一个接口接收到一个比特,就将这个比特生成一个副本并向其他接口发送。随着不断的发展,后续交换机取代了集线器,仍然使用星形拓扑。星形拓扑的好特点是没一个节点的冲突域是单独的,结点间彼此不冲突。
以太网帧
以太网帧有 6 个字段:
- 数据:46~1500 字节,这是上层协议的载荷,这个字段将承载了 IP 数据报。由于以太网的 MTU是 1500 字节,因此经常需要给数据报分片;
目的地址\源地址:6 字节,包含目的适配器\源适配器的 MAC 地址; - 类型:2 字节,指定以太网复用的网络层协议,因为主机能够支持多种网络层协议;
- CRC:4 字节,循环冗余检测用于令接收适配器检测真中是否引入查错;
前同步码:8 字节,前 7 字节都是 “10101010”,用于“唤醒”接收适配器,并且同步时钟,最后一个字节是 “10101011”。
以太网服务
以太网向网络层提供 2 种服务。首先是无连接服务,也就是适配器之间发送接收真,发送网卡和接收网卡间不需要“握手”,类似于 IP 协议和 UDP 协议。第二是不可靠服务,虽然接收适配器执行 CRC 校验,但是这个校验并不发送类似 ACK 的确认帧。虽然将到时传递到网络层的数据流出现间隙,这种传输方式可以使得以太网可以简洁且便宜。对于这种间隙,接收方遇到查错帧就直接丢弃,若要修复丢弃帧的数据,需要依靠类似 TCP 这样的高层协议。
ARP
地址解析协议
由于 IP 地址是网络层地址,MAC 地址是链路层地址,因此当我需要传输数据时就需要对地址进行转换。在同一个 LAN 里如何在一直目的 IP 地址的前提下确定 MAC 地址?这就需要 ARP 协议。这个好像和 DNS 有些相似之处,DNS 是在因特网中进行主机的主机名解析,ARP 是在一个子网上的主机和路由器接口解析 IP 地址。
每台主机和路由器在内存中有 ARP表,表中有 3 个内容,前两个是 IP 地址和 MAC 地址,这表示了 IP 地址和对应的 MAC 地址的映射关系,还有一个是 TTL,这是每个映射关系保存的时间,这是因为我们其实不必要去为每一台主机和路由器都存储映射关系,毕竟有的主机我可能从来不访问。
拥有 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 很好理解,那么当子网中的主机要向子网外发送网络层数据报时,ARP 又是怎么工作的呢?对于主机,每台主机只有一个 IP 地址和一个适配器,对于一台路由器来说,每个接口都有一个 IP 地址,也都有一个 ARP 模块和一个适配器。
当一个子网向另一个子网发送 IP 数据报时,发送主机向适配器传递,此时应该传递什么 MAC 地址呢?明显不是目的主机的 MAC 地址,因为在所在子网中该地址与所有的适配器之间都不匹配,那就只好丢弃了。所以适当的 MAC 地址应该是路由器接口的适配器地址,但是路由器接口的 MAC 地址怎么获取?ARP 嘛!
接下来路由器就需要将数据报发到正确的目的地去,也就是要发到哪个接口去呢?可以查询路由器的转发表,根据转发表送到对应的接口去。接口收到数据包之后,适配器把数据报封装到新的帧中,发送到下一个子网去,下一个子网的 MAC 地址怎么确定?再搞个 ARP 就行了!