《TCP/IP协议卷1》 ARPICMP协议
第4章 ARP:地址解析协议
4.1 引言
数据链路层(如以太网、令牌环网 )有自身48bit寻址机制,而TCP/IP协议族使用32bit的IP地址。地址解析协议(ARP)用于在32bit的IP地址和数据链路层使用的48bit硬件地址间提供动态映射,RFC 826是其规范文档。ARP为IP地址到硬件地址的映射自动完成,一般用户或管理员无需关注;逆地址解析协议(RARP)则用于无磁盘驱动器系统(如无盘工作站、X终端 ),需管理员手工设置,第5章会讨论 。
4.3 ARP高速缓存
每个主机都有ARP高速缓存,存放近期IP地址到硬件地址的映射记录,每项生存时间一般为20分钟。可使用arp命令查看ARP高速缓存内容 。
ubuntu@VM-0-9-ubuntu:~$ arp
Address HWtype HWaddress Flags Mask Iface
_gateway ether fe:ee:bf:f1:aa:f1 C eth0
4.4 ARP的分组格式
在以太网上解析IP地址时,ARP请求和应答分组有特定格式。以太网报头包含源地址和目的地址,目的地址全1为广播地址。ARP帧类型字段值为0x0806 。ARP分组中,硬件类型字段表示硬件地址类型(以太网为1 ),协议类型字段表示要映射的协议地址类型(IP为0x0800 ),硬件地址长度和协议地址长度字段分别指出硬件地址和协议地址的长度(以太网IP地址的ARP请求或应答中,值分别为6和4 ) 。操作字段区分ARP请求(值为1 )和ARP应答(值为2 ),RARP请求(值为3 )和RARP应答(值为4 ) 。分组还包含发送端和目的端的硬件地址、协议地址等信息 。当系统收到ARP请求时,除目的端硬件地址外其他字段有填充值,系统会把硬件地址填进目的端硬件地址字段,并用两个目的端地址分别替换发送端地址进行报文封装 。
ARP的基本作用
ARP(Address Resolution Protocol)是用来将IP地址转换为硬件地址(MAC地址)的协议。在局域网中,设备需要通过MAC地址通信。
2. ARP工作过程(4.5.1)
- 例子:用
telnet
连接一个无效服务器,观察ARP工作。
-
- 首先检查ARP缓存(类似地址簿),确认为空。
- 执行
telnet
时,主机发送ARP请求,询问“谁有这个IP地址?告诉我你的MAC地址”。 - ARP请求通过广播(目标MAC地址是
ff:ff:ff:ff:ff:ff
)发送,帧类型为0x0806
(表示ARP)。 - 如果收到ARP应答,应答直接发给请求者(不是广播)。
- 应答后,请求者的ARP缓存会记录IP地址和MAC地址的对应关系。
- 之后,TCP连接的报文会使用这个MAC地址发送数据。
- 数据帧长度不足60字节时会填充字节,因为以太网要求最小帧长60字节。
要点:ARP请求是广播,ARP应答是单播;缓存记录IP和MAC地址对,方便后续通信。
3. 对不存在主机的ARP请求(4.5.2)
- 如果目标IP地址的主机不存在(比如主机号不存在),会发生以下情况:
-
- 主机发送ARP请求,询问目标IP的MAC地址。
- 没有应答,主机会重试(例如5.5秒后重试,24秒后再试)。
tcpdump
显示多次ARP请求,但无TCP报文(因为没有MAC地址,TCP无法发送)。- 超时时间通常为75秒(BSD系统),之后
telnet
放弃连接。
要点:ARP必须先拿到MAC地址,TCP才能发送数据;不存在的主机导致多次重试,最终超时。
4. ARP缓存超时(4.5.3)
- ARP缓存中的记录有超时时间:
-
- 完整表项(已收到应答的):通常20分钟。
- 不完整表项(未收到应答的,如不存在主机):通常3分钟。
- 如果再次使用不完整表项,会重新发送ARP请求,成功后超时时间变为20分钟。
- 有些系统(伯克利衍生系统)不严格遵循RFC标准,使用表项时不重置超时时间。
要点:ARP缓存有时间限制,过期后需重新请求,避免使用过期的地址信息。
5. ARP代理(4.6)
- 定义:ARP代理(也叫委托ARP)是路由器代替另一个网络的主机应答ARP请求。
- 场景:当主机A想找主机B(在不同子网),路由器会假装自己是主机B,回复自己的MAC地址,然后转发数据给真正的B。
- 例子:
-
- 主机
gemini
想找sun
(不同子网),发送ARP请求。 - 路由器
netb
回复自己的MAC地址,gemini
以为netb
是sun
,实际数据通过netb
转发到sun
。
- 主机
- 特点:在
gemini
的ARP缓存中,sun
的IP地址可能映射到netb
的MAC地址。 - 用途:常用于不支持子网划分的旧系统,或隐藏不同网络的物理差异。
要点:ARP代理让路由器“冒充”目标主机,方便跨网络通信。
arp命令(4.8)
arp
命令用于管理ARP缓存:
-
-a
:显示所有ARP缓存内容。-d
:超级用户删除某条缓存记录。-s
:手动添加缓存记录(指定IP和MAC地址),默认永久有效,加temp
设置超时。
第6章 ICMP:Internet控制报文协议
6.1 引言
ICMP常被视为IP层的组成部分,用于传递差错报文及其他需注意的信息,报文供IP层或更高层协议(TCP或UDP)使用,部分差错报文返回给用户进程。ICMP报文在IP数据报内部传输。
格式:前4个字节固定,其余字节因报文类型而异。类型字段有15个不同值描述报文类型,部分报文还用代码字段进一步描述条件。检验和字段覆盖整个ICMP报文,算法与IP首部检验和算法相同且为必需。
6.2 ICMP报文类型
不同类型由报文中的类型字段和代码字段共同决定,分为查询报文和差错报文。发送ICMP差错报文时,报文包含IP首部及产生该差错报文的IP数据报前8个字节,以便与特定协议(根据IP数据报首部协议字段 )和用户进程(根据IP数据报前8个字节中的TCP或UDP端口号 )联系起来。
以下情况不会产生ICMP差错报文:
- ICMP差错报文(但ICMP查询报文可能产生ICMP差错报文 )。
- 目的地址是广播地址或多播地址的IP数据报。
- 作为链路层广播的数据报。
- 不是IP分片的第一片。
- 源地址不是单个主机的数据报(不能为零地址、环回地址、广播地址或多播地址 )。
6.3 ICMP地址掩码请求与应答
- 用途:ICMP地址掩码请求用于无盘系统在引导过程中获取自身子网掩码。无盘系统获取子网掩码的方式除ICMP请求外,还有BOOTP协议(第16章介绍 )。
- 报文格式:ICMP地址掩码请求和应答报文格式包含类型(17或18 )、代码、标识符、序列号、32位子网掩码等字段,标识符和序列号字段由发送端设定,会在应答中返回。
- 抓包分析:用tcpdump命令抓包(加 -e选项看硬件地址 ),发现发送主机能收到ICMP应答,虽在网络上看不到,但存在内部环回机制使发送主机能接收广播报文拷贝。一般应答地址为单播,除非源IP是0.0.0.0 ,bsdi广播应答,svr4只给请求主机应答,把应答发广播地址是BSD/386内部差错。
- 授权代理:RFC规定,非地址掩码授权代理不能发送地址掩码应答,成为授权代理需特殊配置(见附录E ),但多数主机收到请求都发送应答,甚至有错误应答。
- 特殊测试:向本机IP地址和环回地址发送地址掩码请求,返回对应环回地址的掩码(A类地址127.0.0.1 ),多接口主机每个接口子网掩码不同,发往本机IP的数据报送环回接口,接收请求接口需返回对应掩码。
6.4 ICMP时间戳请求与应答
- 用途与原理:ICMP时间戳请求允许系统向另一系统查询当前时间,返回值是自午夜开始计算的毫秒数(协调世界时UTC ),提供毫秒级分辨率。请求端填写发起时间戳并发送报文,应答系统收到报文时填接收时间戳,发送应答时填发送时间戳,多数实现将接收和发送时间戳设为相同值。
- 报文格式:包含类型(13或14 )、代码(0 )、检验和、标识符、序列号、发起时间戳、接收时间戳、传送时间戳等字段。
举例
-
- 程序测试:编写程序icmptime向主机发送ICMP时间戳请求并打印应答。在小互联网测试,不同主机表现不同,如bsdi主机接收和发送时间戳相同,可计算往返时间(rtt )和时间差值(difference );svr4主机时间戳无毫秒级分辨率;gateway路由器返回非标准时间戳;与已知准确时钟的NTP服务器(clock.1ln1.gov )对比,可计算sun主机时钟快慢。
- 结果分析:若相信RTT值,且认为其一半用于请求报文传输,一半用于应答报文传输,可据此调整本机时钟(调整值为difference减去RTT的一半 )。
6.5 ICMP端口不可达差错
差错产生机制:ICMP端口不可达报文属于ICMP目的不可到达报文的一种。依据UDP规则,当收到的UDP数据报目的端口与正在使用的进程不相符时,会返回一个ICMP不可达报文。以TFTP为例,TFTP服务器UDP公共端口号是69,但客户程序可用connect命令指定不同端口号,如指定8888端口,当向此端口发送UDP数据报时,若端口无对应进程,就会产生ICMP端口不可达差错。
报文交互过程
- 发送TFTP请求时,先通过ARP请求获取目标主机硬件地址,再发送UDP数据报。如从badi向svr4的8888端口发送TFTP请求,在数据报发送后,立刻返回ICMP端口不可达差错(第4行 ),但TFTP客户程序似乎忽略该报文,在5秒后又重发UDP数据报,在放弃前重发了三次。
- ICMP差错报文在主机间交换,不涉及目的端口号,而UDP数据报在特定端口间传输。每个UDP数据报后跟随的数字代表数据报长度,如例子中的20字节包含TFTP操作代码、文件名及字符串等。
报文格式与规则
- ICMP差错报文需包含生成该差错报文的数据报IP首部(含选项 ),还至少要跟随该IP首部后的前8个字节。在例子中,跟随IP首部后的前8个字节是UDP首部,其中包含源端口号和目的端口号,接收ICMP的系统可据此关联差错报文与特定用户进程。
- ICMP不可达报文格式中,类型为3,端口不可达差错代码是3 。多数伯克利派生系统只返回8个字节,Solaris 2.2在默认条件下返回前6个字节。
tcpdump时间系列分析
- 以时间系列格式呈现tcpdump命令输出,时间向下递增,标记通信双方主机名和端口号,用粗线表示UDP或TCP数据在传输。
- BSD系统默认不把从插口接收到的ICMP报文中的UDP数据通知用户进程,除非进程已发送connect命令。TFTP客户程序采用不好的超时重传算法(每5秒重传一次,共25秒 ),已被RFC禁用,但仍有系统在使用,如作者所在子网的三个系统及Solaris 2.2 。AIX 3.2.2采用指数退避方法设置超时值(0、5、15和35秒重发 )更合理。
- 值得注意的是,ICMP报文在发送UDP数据报3.5ms后返回,与Ping应答往返时间差不多。
6.6 ICMP报文的4.4BSD处理
在4.4BSD系统中,因ICMP报文涵盖范围广(从致命差错到信息差错 ),对不同ICMP报文处理方式各异。若处理方法标明“内核”,则由内核处理ICMP报文;若标明“用户进程”,报文会被传送给在内核登记的用户进程读取,若不存在此类用户进程,报文将被丢弃(用户进程还会收到本应由内核处理的其他ICMP报文拷贝,且在核处理后才能收到)。有些报文会被完全忽略;若标明引号内字符串,对应Unix差错,部分差错后续章节会讨论。
6.7 小结
协议概述:本章探讨Internet控制报文协议(ICMP ),介绍了ICMP报文类型(多数后续章节会深入讨论 )。
典型报文:详细讨论ICMP地址掩码请求与应答、时间戳请求与应答这类典型请求 - 应答报文,其含标识符和序列号,发送端用标识符区分进程应答,客户程序用序列号匹配请求和应答。
差错报文:分析ICMP端口不可达差错这种常见差错,接收方通过导致差错的IP数据报首部及后8字节信息,了解差错原因(因TCP和UDP首部前8字节有源端口和目的端口号 )。