TCP/IP详解 卷1:协议 学习笔记 第四章 ARP:地址解析协议
数据链路如以太网或令牌环网都有自己的寻址机制(其地址常为48bit),这是使用数据链路的任何网络层都必须遵守的。
一个网络如以太网可同时被不同的网络层使用,如,一组使用TCP/IP协议的主机和另一组使用某种PC网络软件的主机可以共享相同的电缆。
一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。设备驱动程序不会检查IP数据报中的目的IP地址。
地址解析为32bit的IP地址和数据链路层使用的任何类型的地址提供映射。
ARP协议为IP地址到对应的硬件地址提供动态映射(这个过程是自动完成的,应用程序用户和系统管理员不必关心)。
RARP协议是被那些没有磁盘驱动器的系统使用(如无盘工作站和X终端),它需要系统管理员进行手动设置。
任何时候执行以下命令:
ftp bsdi
会进行以下步骤:
(1)应用程序FTP客户端调用gethostbyname把主机名bsdi转换为32bit的IP地址。此函数在DNS(域名系统)中称作解析器。这个转换过程使用DNS或在较小的网络中使用一个静态主机文件(/etc/hosts)。
(2)FTP客户端请求TCP用得到的IP地址建立连接。
(3)TCP发送一个连接请求分段到远端的主机,即用上述IP发一份IP数据报。
(4)如果目的主机在本地网络上(如以太网、令牌环网、点对点链接的另一端),那么IP数据报可以直接送到目的主机上。如果目的主机在一个远程网络上,就通过IP选路函数确定位于本地网络上的下一站路由器地址,并让它转发IP数据报。
(5)假定此网络是一个以太网,发送端就需要把下一站路由器的IP地址变成48bit下一站路由器的以太网地址。这就是ARP的功能。ARP是用于广播网络的,许多主机和路由器连在同一个网络上。
(6)ARP发送一份称作ARP请求的以太网数据帧给以太网上每个主机,此过程称为广播。ARP请求帧中包含目的IP地址,其含义为如果你的IP是该IP,则回答你的硬件地址。
(7)目的IP主机的ARP层收到这份广播报文后,识别出这是发送端在询问它的IP地址,于是发送一个ARP应答,其中包括IP地址及对应硬件地址。
(8)收到ARP应答后,就知道链路层目的端地址了。
(9)发送IP数据报到目的主机。
网络接口有一个硬件地址(48bit,标识不同的以太网或令牌环网接口)。硬件层次上进行的数据帧交换必须有正确的接口地址,因此必须知道该硬件地址。
点对点链路不使用ARP,设置这些链路时(一般在引导时进行),必须告知内核链路每一端的IP地址,而不涉及硬件地址。
每个主机上都有一个ARP高速缓存,存放了最近Internet地址到硬件地址之间的映射记录,一般每一项的生存周期是20min,从它被创建时开始算起。这使得ARP可以高速运行。
可以使用arp命令检查ARP高速缓存,-a选项列出高速缓存中所有内容:
以太网上解析IP地址时,ARP请求和应答分组格式如下:
以太网目的地址字段当全1时是广播地址,电缆上的所有以太网接口都要接收广播的数据帧。
帧类型字段表示后面帧数据的类型。ARP请求或应答的该字段值为0x0806。
硬件类型字段表示硬件地址的类型,1表示以太网地址。
协议类型字段表示要映射的网络层协议地址类型,0x0800表示IP地址,它的值与包含IP数据报的以太网数据帧中的帧类型字段的值相同。
硬件地址长度字段和协议地址长度字段分别指出硬件地址和协议地址的长度,以字节为单位。以太网上IP地址的ARP请求或应答情况下,它们的值分别为6和4。
操作(op)字段指出四种操作类型,分别为ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)、RARP应答(值为4)。此字段是必须的,因为ARP请求和应答的帧类型字段值相同,需要此字段分开。
以太网源地址字段和发送端以太网地址字段都表示发送端的硬件地址,是重复信息。
ARP请求的帧,除目的端硬件地址外的所有其他字段都有填充值。而当系统收到一份目的端为本机的ARP请求报文后,它把硬件地址填进去,然后两个目的端地址与两个发送端地址交换,把操作字段设为2,最后发送出去。
执行一个与无效服务器的连接:
然后使用tcpdump程序截获经过网络接口的每一个分组,正常情况下,只会截获送往本接口地址和广播地址的链路层帧。底层操作系统必须允许将一个接口设置成混杂模式(指一台机器的网卡能够接收所有经过它的数据流,而不论目的地址是否是它),并允许一个用户进程截获帧。
使用tcpdump获得:
以上删除了tcpdump命令的最后四行,因为它们是结束连接的信息。
第一行中,源端主机bsdi的硬件地址是0:0:c0:6f:2d:40,目的端主机的硬件地址为全f,表示以太网广播地址,以太网上所有接口都要接收这个数据帧并对其处理。
第一行中接着是arp,说明此帧是ARP请求或应答。arp或ip后面的60指以太网数据帧长度,由于ARP请求或应答的数据帧长度是42字节(28字节ARP数据、14字节以太网帧头),因此每帧都要填充字符以达到以太网的长度最小要求(60字节)。这60字节包含14字节的以太网帧头,但不包括4字节的以太网帧尾,因此有人称最小长度为64字节。
大多设备驱动程序或接口卡自动用填充字符把以太网数据帧充满到最小长度。上图中第3、4、5行的IP数据报(含TCP段)的长度比最小长度短,必须填充到60字节。
第一行的下一个输出arp who-has svr4 tell bsdi
表示此ARP请求帧的目的IP地址是svr4的地址,发送端IP地址是bsdi的地址
第二行中我们看到,尽管ARP请求是广播的,但应答的目的地址是发送请求的硬件地址,即ARP应答是直接送到请求端主机,而非广播。
接着输出是arp reply
,同时输出响应者的主机名和硬件地址。
第三行是一个请求建立连接的TCP段,它的目的硬件地址是目的地址(svr4)。
每一行的行号后的数字表示tcpdump收到分组的时间(以秒为单位),括号内是距上次收到分组经过的时间。
tcpdump的输出中,没有看到svr4在发出第一段应答的TCP报文前(第四行)发出ARP请求,这可能是因为svr4的ARP高速缓存中已有bsdi的表项。一般当系统收到ARP请求或应答时,都要把请求端的硬件地址和IP地址存入ARP高速缓存。
对不存在的主机发送ARP请求:
tcpdump命令输出(不带-e选项,-e选项作用为打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议):
由上图,发生了多次ARP请求,前两次间隔5.5s,后两次间隔24秒。tcpdump命令输出的超时限制是29.5s,但Telnet命令图中发现在大约75s后才放弃,这也是大多BSD的实现(把完成TCP请求的时间限制设为75s)。
以上实验在线路上始终看不到TCP报文段,只能看到ARP请求,因为直到ARP应答后才知道硬件地址,TCP报文段才能被发送。过滤模式运行tcpdump命令只查看TCP数据时,将没有任何输出。
从伯克利系统演变而来的ARP高速缓存,完整表项20min超时,不完整表项(上例中对不存在主机的ARP请求)3min超时。
Host Requirements RFC表明即使表项正在使用,超时值也应该启动,但大多从伯克利系统演变来的系统在每次访问表项时重设超时值。
如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,此过程被称为委托ARP或ARP代理。路由器的功能相当于目的主机的代理。
如果在上图中主机gemini请求过一次netb的硬件地址,然后netb又作为sun的ARP代理,那么经过与主机sun通信后,在主机gemini上执行arp命令,我们会发现netb和sun的IP地址映射的硬件地址是相同的,这是使用委托ARP的线索:
图4-6中拨号SLIP链路两端只有一个IP地址,而bsdi和slip的SLIP链路两端有两个IP地址。原因是netb(它是NetBlazer路由器,NetBlazer是telebit的一款路由器产品)通过分组到达的串行线路接口来确定发送分组的拨号主机,因此通过此链路连接到路由器的每个拨号主机不需要不同的IP地址,所有的拨号主机使用同一个IP地址作为SLIP链路的目的地址,这个IP地址用ifconfig查看是140.252.1.183,这样所有连接到netb的SLIP拨号主机都用这个地址表示netb的目的地址,而netb会根据输入接口识别主机,这样使用的IP地址数量少。
netb将数据报发送到sun主机上后,必须使数据报也能到达sun局域网的其他主机,此时需要特殊处理,选路表中的表项必须制定规则,区分数据报是发送给sun所在的子网还是子网上的某主机。
ARP代理也称混合ARP或ARP出租,名字来源于ARP代理的其他用途:通过两个物理网络之间的路由器可以相互隐藏网络。此时两个物理网络可以使用相同的网络号,只要把中间的路由器设置成一个ARP代理,以响应一个网络到另一个网络主机的ARP请求。这种技术过去用来隐藏一组在不同物理电缆上运行的旧版TCP/IP主机,分开这些旧主机有两个理由,一是它们不能处理子网划分,二是它们使用旧的广播地址(所有比特为0的主机号)。
ARP的另一个特性称为免费ARP,指主机发送ARP查找自己的IP地址,通常发生在系统引导期间进行接口配置的时候。
引导过程中在另一主机上运行tcpdump(使用-n选项打印点分十进制地址而非主机名):
上图显示发送端的协议地址和接收端的协议地址是一致的。
免费ARP的作用:
1.确定同一网络内是否有另一个主机设置了相同的IP地址。如果收到了回答,会在终端日志上产生一个错误信息。
2.如果发送免费ARP的主机改变了硬件地址(如主机关机后,换了一块接口卡,然后重新启动),那么这个分组可以更新其他主机的高速缓存。如果主机收到一个ARP请求,而且发送者的硬件地址已经在接收者的高速缓存中,那么就要用ARP请求的发送端硬件地址更新高速缓存。由于ARP请求是在网络上广播的,因此每次发送ARP请求时,网络上所有主机都要这么做。
可以通过发送含有备份硬件地址和故障服务器IP地址的免费ARP请求,使得备份文件服务器可以接替故障服务器继续工作。但有人反对这种方法,原因是这要求所有客户端都要有正确的ARP协议实现。
root可以用arp命令的-d选项删除ARP高速缓存中的某一项。可以通过-s选项增加高速缓存中的内容,需要输入主机名和以太网地址,对应于主机名的IP和以太网地址被永久添加到高速缓存中,除非命令行末尾附上关键字temp。
arp命令行末尾的pub和-s选项一起可以使主机起ARP代理的作用,系统将回答与主机名对应IP地址的ARP请求,并以指定以太网地址作为应答。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2020-11-05 PHP与MySQL程序设计 学习笔记 第六章 面向对象的PHP