4.3 ARP高速缓存
A R P高效运行的关键是由于每个主机上都有一个 A R P高速缓存。这个高速缓存存放了最近I n t e r n e t地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为 2 0分钟,起始时间从被创建时开始算起。
我们可以用a r p(8)命令来检查ARP高速缓存。参数-a的意思是显示高速缓存中所有的内容。
代码语言:javascript复制bsdi % arp -a
sun (140.252.13.33) at 8:0:20:3:f6:42
svr4 (140.252.13.34) at 0:0:c0:c2:9b:26
48 bit的以太网地址用 6个十六进制的数来表示,中间以冒号隔开。在 4 . 8小节我们将讨论
4.4 ARP的分组格式
在以太网上解析 I P地址时,A R P请求和应答分组的格式如图 4 - 3所示(A R P可以用于其他类型的网络,可以解析 I P地址以外的地址。紧跟着帧类型字段的前四个字段指定了最后四个字段的类型和长度)。
以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全 1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。
两个字节长的以太网帧类型表示后面数据的类型。对于 A R P请求或应答来说,该字段的值为0 x 0 8 0 6。
形容词h a r d w a r e (硬件)和p r o t o c o l (协议)用来描述A R P分组中的各个字段。例如,一个 A R P请求分组询问协议地址(这里是 I P地址)对应的硬件地址(这里是以太网地址)。
硬件类型字段表示硬件地址的类型。它的值为 1即表示以太网地址。协议类型字段表示要映射的协议地址类型。它的值为 0 x 0 8 0 0即表示I P地址。它的值与包含 I P数据报的以太网数据帧中的类型字段的值相同,这是有意设计的(参见图 2 - 1)。
接下来的两个1字节的字段,硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上 I P地址的A R P请求或应答来说,它们的值分别为 6和4。
操作字段指出四种操作类型,它们是 A R P请求(值为1)、A R P应答(值为2)、R A R P请求(值为3)和R A R P应答(值为4)(我们在第5章讨论R A R P)。这个字段必需的,因为 A R P请求和A R P应答的帧类型字段值是相同的。
接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(I P地址)、目的端的硬件地址和目的端的协议地址。注意,这里有一些重复信息:在以太网的数据帧报头中和A R P请求数据帧中都有发送端的硬件地址。
对于一个A R P请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的 A R P请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为 2,最后把它发送回去。
4.5 ARP举例
在本小节中,我们用t c p d u m p命令来看一看运行像Te l n e t这样的普通T C P工具软件时A R P会做些什么。附录A包含t c p d u m p命令的其他细节。
4.5.1 一般的例子
为了看清楚A R P的运作过程,我们执行t e l n e t命令与无效的服务器连接。
当我们在另一个系统( s u n)上运行带有- e选项的t c p d u m p命令时,显示的是硬件地址(在我们的例子中是48 bit的以太网地址)。 图4 - 4中的t c p d u m p的原始输出如附录A中的图A - 3所示。由于这是本书第一个 t c p d u m p
输出例子,你应该去查看附录中的原始输出,看看我们作了哪些修改。
我们删除了t c p d u m p命令输出的最后四行,因为它们是结束连接的信息(我们将在第 1 8章进行讨论),与这里讨论的内容不相关。
在第1行中,源端主机(b s d i)的硬件地址是0 : 0 : c 0 : 6 f : 2 d : 4 0。目的端主机的硬件地址是ff : ff : ff : ff : ff : ff,这是一个以太网广播地址。电缆上的每个以太网接口都要接收这个数据帧并对它进行处理,如图4 - 2所示。
第1行中紧接着的一个输出字段是 a r p,表明帧类型字段的值是 0 x 0 8 0 6,说明此数据帧是一个A R P请求或回答。在每行中,单词 a r p或i p后面的值6 0指的是以太网数据帧的长度。由于 A R P请求或回答的数据帧长都是4 2字节(2 8字节的A R P数据,1 4字节的以太网帧头),因此,每一帧都必须加入填充字符以达到以太网的最小长度要求: 6 0字节。请参见图1 - 7,这个最小长度 6 0字节包含1 4字节的以太网帧头,但是不包括 4个字节的以太网帧尾。有一些书把最小长度定为 6 4字节,它包括以太网的帧尾。我们在图 1 - 7中把最小长度定为4 6字节,是有意不包括 1 4字节的帧首部,因为对应的最大长度( 1 5 0 0字节)指的是M T U—最大传输单元(见图2 - 5)。我们使用M T U经常是因为它对I P数据报的长度进行限制,但一般与最小长度无关。
大多数的设备驱动程序或接口卡自动地用填充字符把以太网数据帧充满到最小长度。第 3,4和5行中的I P数据报(包含T C P段)的长度都比最小长度短,因此都必须填充到6 0字节。
第1行中的下一个输出字段 arp who-has表示作为A R P请求的这个数据帧中,目的 I P地址是s v r 4的地址,发送端的 I P地址是b s d i的地址。t c p d u m p打印出主机名对应的默认 I P地址(在4 . 7节中,我们将用-n选项来查看A R P请求中真正的I P地址。) 从第 2行中可以看到,尽管 A R P请求是广播的,但是 A R P应答的目的地址却是 b s d i(0 : 0 : c 0 : 6 f : 2 d : 4 0)。A R P应答是直接送到请求端主机的,而是广播的。
t c p d u m p打印出arp reply的字样,同时打印出响应者的主机名和硬件地址。第3行是第一个请求建立连接的 T C P段。它的目的硬件地址是目的主机 (s v r 4)。我们将在第1 8章讨论这个段的细节内容。
在每一行中,行号后面的数字表示 t c p d u m p收到分组的时间(以秒为单位)。除第1行外,其他每行在括号中还包含了与上一行的时间差异(以秒为单位)。从这个图可以看出,发送A R P请求与收到A R P回答之间的延时是2.2 ms。而在0.7 ms之后发出第一段T C P报文。在本例中,用A R P进行动态地址解析的时间小于 3 ms。
最后需要指出的一点,在 t c p d u m p命令输出中,我们没有看到 s v r 4在发出第一段 T C P报文(第4行)之前发出的A R P请求。这是因为可能在 s v r 4的A R P高速缓存中已经有 b s d i的表项。一般情况下,当系统收到 A R P请求或发送 A R P应答时,都要把请求端的硬件地址和 I P地址存入A R P高速缓存。在逻辑上可以假设,如果请求端要发送 I P数据报,那么数据报的接收 端将很可能会发送一个应答。
4.5.2 对不存在主机的ARP请求
如果查询的主机已关机或不存在会发生什么情况呢?为此我们指定一个并不存在的I n t e r n e t地址—根据网络号和子网号所对应的网络确实存在,但是并不存在所指定的主机号。
从图3 - 1 0可以看出,主机号从 3 6到6 2的主机并不存在(主机号为 6 3是广播地址)。这里,我们用主机号3 6来举例。
t c p d u m p命令的输出如图4 - 5所示。
这一次,我们没有用-e选项,因为已经知道A R P请求是在网上广播的。
令人感兴趣的是看到多次进行 A R P请求:第1次请求发生后5 . 5秒进行第2次请求,在2 4秒之后又进行第3次请求(在第2 1章我们将看到T C P的超时和重发算法的细节)。t c p d u m p命令输出的超时限制为 2 9 . 5秒。但是,在t e l n e t命令使用前后分别用 d a t e命令检查时间,可以发现Te l n e t客户端的连接请求似乎在大约 7 5秒后才放弃。事实上,我们在后面将看到,大多数 的B S D实现把完成T C P连接请求的时间限制设置为 7 5秒。
在第1 8章中,当我们看到建立连接的 T C P报文段序列时,会发现A R P请求对应于T C P试图发送的初始T C P S Y N(同步)段。
注意,在线路上始终看不到 T C P的报文段。我们能看到的是 A R P请求。直到A R P回答返回时,T C P报文段才可以被发送,因为硬件地址到这时才可能知道。如果我们用过滤模式运行t c p d u m p命令,只查看T C P数据,那么将没有任何输出。
4.5.3 ARP高速缓存超时设置
在A R P高速缓存中的表项一般都要设置超时值(在 4 . 8小节中,我们将看到管理员可以用a r p命令把地址放入高速缓存中而不设置超时值)。从伯克利系统演变而来的系统一般对完整的表项设置超时值为2 0分钟,而对不完整的表项设置超时值为 3分钟(在前面的例子中我们已见过一个不完整的表项,即在以太网上对一个不存在的主机发出 A R P请求。)当这些表项再次使用时,这些实现一般都把超时值重新设为 2 0分钟。
Host Requirements RFC表明即使表项正在使用时,超时值也应该启动,但是大多数从伯克利系统演变而来的系统没有这样做—它们每次都是在访问表项时重设超时值。