易栈 · 一盏

塞外秋来,衡阳雁去

链路层:以太网、ARP、RARP

链路层负责从网络中收发数据。不同的网络硬件对应不同的链路层协议,例如基于以太网的以太网/802.3封装,基于RS-232串行线路的SLIP和PPP。链路层处理的数据有三种:IP数据报、ARP报文、RARP报文。注意这三种数据都直接被封装到链路层数据包(例如以太网帧)中,但是逻辑上把IP归到网络层,而ARP、RARP归到链路层(把ARP、RARP作为网卡驱动程序的一部分)。

一、以太网

以太网采用带冲突检测的载波侦听多路访问(CSMA/CD, Carrier Sense, Multiple Access with Collision Detection)机制。以太网是一种广播网络,网络中每个节点都可以看到在网络中发送的所有消息,节点根据消息中的硬件地址来判断该消息是不是发给自己的。那么在所有节点都要往同一个网络里发消息的情况下,是怎么做到所有的节点共享传输介质的呢?CSMA/CD机制的处理是:当以太网主机有数据要发送的时候,它要先监听信道上是否有信号在传输,如果没有才会发送数据;发送数据的时候继续监听,若监听到信道有干扰信号,表示产生了冲突,则要执行退避算法,等待一段时间后重新尝试发送。

以太网支持两种封装,一是IEEE公布的IEEE 802.3(RFC 1042),二是硬件厂商制定的RFC 894。后者比较常用,以下如果提到以太网帧,默认指后者。以太网的封装格式如下:

目的地址(6字节)|源地址(6字节)|类型(2字节)|数据(46~1500字节)|CRC(4字节)

目的地址和源地址就是硬件地址,也就是我们常说的MAC地址(注意MAC地址不仅限于以太网,其它令牌环网卡、FDDI网卡也会有自己的硬件地址)。类型字段标识数据是IP数据报、ARP报文或者RARP报文。注意以太网规定数据字段的长度在46~1500之间,当数据少于46字节时,需要填充空白字节,可以算出最小以太网帧长度为64字节。最后4字节是校验和字段

二、SLIP:串行链路IP

SLIP全称Serial Line IP,是在串行线路(如前面说到的RS-232)上对IP数据报进行封装的简单格式。SLIP协议非常简单,就是发送的每个数据报都以一个特殊字符END(0xc0)结束,当数据报中出现END字符时,对其进行转义。其简单也导致了一些缺陷:

  • 每一端必须知道对方的IP地址(要预先设置好),通信过程中没办法把本端的IP地址告诉对端。
  • 数据帧中没有类型字段,导致一条串行线路只能单独用于SLIP协议,无法复用。
  • 数据帧中没有校验和,容易出错。

CSLIP称为压缩的SLIP。原理是在传输TCP分组的时候,IP首部和TCP首部就要占40字节,但是这些首部中很多字段一般是不会发生变化的。CSLIP通过压缩首部,只传输发生变化的字段,从而大大减少数据量。

三、PPP:点对点协议

PPP点对点协议,同样用于串行链路,但是它修改了SLIP协议中所有的缺陷。

PPP中有协议字段,支持在单根串行线路上运行多种协议,包括IP、网络控制协议(NCP)和链路控制协议(LCP)等。NCP和LCP允许通信双方进行动态协商IP地址、确认是否要压缩报文首部、设置数据链路参数等操作。

四、环回接口

环回接口(Loopback Interface)是一个虚拟的网卡。环回接口的IP地址一般是127.0.0.1,发往这个地址的数据,离开网络层之后会被返回给它自身。环回接口的数据来源有三种:

  • 传给环回地址(127.0.0.0)的任何数据;
  • 传给该主机IP地址的任何数据(这意味着传给主机本身IP地址的IP数据报不会出现在网络上,而是直接由环回接口发回网络层);
  • 传给广播地址或多播地址的数据会被复制一份传到环回接口(广播/多播传送的定义包括源主机本身)。

五、MTU:最大传输单元

链路层的最大传输单元(MTU)是链路层一个数据帧能够发送的最大数据长度。如果IP数据报长度比链路层MTU还要大,这个IP数据报就会被分片。MTU的选择有时候是出于网络媒介的物理特性,有时候是出于协议本身的逻辑限制(例如长度字段的位数限制)。前面讲过以太网封装格式要求数据部分的长度为46~1500字节,因此以太网的MTU为1500字节

以上讲的是单个网络的MTU。但是当两台主机之间的通信要通过多个网络时,每个网络的链路层可能有不同的MTU。这时候两机的通信受限于通信路径中的最小MTU,又称路径MTU。两台主机间的路径MTU取决于当时所选择的路由,所以它的值可能会变化。由于选路不一定是对称的,所以两个方向上的路径MTU不一定是一致的。

六、ARP:地址解析协议

链路层要发送数据帧(以太网帧)给另一台主机,是根据硬件地址(以太网48bit地址)来确定目的接口的。但是应用层一般只知道目的主机的主机名或者IP地址,当数据传到链路层,链路层是怎么知道要发往哪个硬件地址的呢?获取主机名对应的IP地址需要DNS地址解析器(这个后面会说到)。获取IP地址对应的硬件地址需要ARP。

ARP广播一个ARP请求,这样同一网络上的每个主机都会收到这个请求。ARP请求中包含目的主机的IP地址,目的主机识别出是在询问自己,于是给源主机发一个ARP应答(这里是单播),回答自己的硬件地址

ARP的分组格式如下:

以太网目的地址|以太网源地址|帧类型|硬件类型|协议类型|硬件地址长度|协议地址长度|操作|发送端以太网地址|发送端IP地址|目的以太网地址|目的IP地址

当系统收到ARP应答或者ARP请求时,会将消息中的硬件地址和IP地址存入ARP高速缓存,从而避免重复查询。高速缓存中的每一项的生存时间一般为20分钟。通过arp命令可以查看或者操作高速缓存的内容,命令的具体参数详见本系列的工具篇。

七、ARP代理

如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作ARP代理。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机,而事实上的目的主机是在路由器的“另一端”。路由器相当于目的主机的代理,给目的主机转发来自其它主机的分组。

八、免费ARP

免费ARP指主机发送ARP请求来查找自己的IP地址对应的硬件地址。通常发生在系统引导期间进行网络接口配置的时候。这样做有两个作用:

  • 避免IP冲突。如果收到ARP应答,表示网络中有另外一个主机设置了同样的IP地址。
  • 通报新的硬件地址。在自身硬件地址改变后,可以发送ARP请求使别的主机更新ARP高速缓存。

九、RARP:逆地址解析协议

RARP协议是通过硬件地址获取IP地址,常被无盘系统用来在引导时获取IP地址。RARP的作用与ARP相反,但是分组格式(只是部分字段填充的值不同)和工作过程(通过广播请求来获取单播应答)都是和ARP一样的。

RARP有两个问题:(1)获取的信息太少,只有IP地址;(2) 使用链路层广播,所以不会被路由器转发(迫使每个物理网络都要设置一个RARP服务器)。现在一般都用DHCP协议代替RARP协议。

本文链接:易栈 - 链路层:以太网、ARP、RARP