《Tcp/Ip协议簇》读书笔记
在IP协议能够把一个分组从源主机交付到目的主机之前,它首先要知道如何将这个分组交付给下一跳;
IP在使用数据链路层服务时,它就需要知道下一跳的物理地址;
通过 地址解析协议(ARP) 可以做到这一点。
目标:
- 区分用于网络层的逻辑地址(IP)和用于数据链路层的物理地址(MAC地址);
- 描述如何静态地或动态地将逻辑地址映射为物理地址;
- 说明如何使用地址解析协议(ARP)来动态地将逻辑地址映射为物理地址;
- 说明如何使用代理ARP来产生子网划分的效果;
- 讨论ATMARP,当底层网络是一个ATM广域网时就要用它们来映射IP地址;
- 展示一个ARP软件包可以由五个构件组成:高速缓存表、队列、输出模块、输入模块、高速缓存控制模块;
- ARP软件包中每个模块的伪码。
地址映射
互联网是由许多物理网络和一些像路由器这样的连网设备组成。从源主机出发的分组在最终到达目的主机之前,可能要经过多个物理网络。
在网络这一级,主机和路由器是通过它们的逻辑地址来识别的。
逻辑地址就是互联网地址,它管辖范围是全局,逻辑地址在全局上是唯一的。
在物理这一级,主机和路由器是用它们的物理地址来识别的。
物理地址是一个本地地址,它管辖范围是本地网络,物理地址在本地网络内必须唯一,全局则没有要求。
把一个分组交付到主机或路由器需要用到两级地址:逻辑地址和物理地址。我们要把逻辑地址映射为响应的物理地址,反之亦然。映射可通过静态或动态方法来实现。
静态映射和动态映射
静态映射(static mapping) ,就是将逻辑地址和物理地址关联起来,存储在网络中的每一台机器上;
动态映射(dynamic mapping) ,只要机器知道了另一台机器的逻辑地址,它就可以使用协议找出相应的物理地址;
地址解析协议(ARP ) 和 逆向地址解析协议(RARP)。
ARP协议
ARP协议接受来自IP协议的逻辑地址,将其映射为相应的物理地址,再把物理地址递交给数据链路层。
任何时候,当主机或路由器需要找出这个网络上的另一个主机或路由器的物理地址时,它就可以 广播
一个 ARP查询分组
;
网络上的每一台主机或路由器都会接收并处理这个ARP查询分组,但只有目的接收方认出自己的IP并返回一个 ARP响应分组
。
分组格式
ARP分组格式如下:
- 硬件类型 16位,定义ARP的网络类型,每一个局域网基于其类型被指派给一个整数,
如以太网是类型1
。 ARP可用于任何物理网络; - 协议类型 16位,定义适用的协议,
如IPv4协议的值为0800
。ARP可用于任何高层协议; - 硬件长度 8位,定义物理地址的长度,以字节为单位。
如以太网为6
; - 协议长度 8位,定义逻辑地址的长度,以字节为单位。
如IPv4值是4
; - 操作 16位,定义分组类型。已定义的分组类型有两种:ARP请求(1)和ARP响应(2);
- 发送方硬件地址 可变长度,定义发送方的物理地址。
如以太网物理地址为6字节
; - 发送方协议地址 可变长度,定义发送方的逻辑地址。
如IPv4为4字节
; - 目标硬件地址 可变长度,定义目标的物理地址。存在于ARP响应报文中,在ARP请求报文中此字段为0;
- 目标协议地址 可变长度,定义目标的逻辑地址。
如IPv4为4字节
;
封装
ARP分组直接封装在数据链路层帧中。
帧中类型字段指出此帧所携带的数据是ARP分组。
操作
典型互联网中ARP工作步骤:
- 发送方知晓目的IP地址;
- 发送ARP请求报文;
- ARP请求报文被递交给数据链路层,数据链路层封装成帧,并广播该帧;
- 目标机器识别该帧;
- 目标机器发送ARP响应报文;
- 发送方收到ARP响应报文,知晓了目标主机的物理地址;
- 携带有给目标机器数据的IP数据报现在可以封装成帧,并以单播方式发送到终点。
代理ARP
有一种技术称为代理ARP,可用于产生一种子网划分的效果。代理ARP(proxy ARP)是代表了一组主机的ARP。
当运行代理ARP的Router收到一个ARP请求,希望找出这些主机中的某一台主机的物理地址时,Router就返回一个宣布它自己的硬件地址的ARP响应分组。Router收到真正的IP分组后,再将这些分组发送给响应主机或路由器。
ATMARP
当IP分组要通过一个ATM广域网时,我们需要一种协议来映射ATM广域网中给定的IP地址的离去点路由器的物理地址;
但是,局域网和ATM网络有一些区别。局域网是个广播网络(在链路层),但ATM网络不是一个广播网络,因此要处理这个任务需要其他解决办法。
ATMARP分组格式
ATMARP分组格式如下:
- 硬件类型 16位,定义物理网络类型。
对于ATM网络,值为0013(0x)
; - 协议类型 16位,
对于IPv4协议,值为0800(0x)
; - 发送方硬件长度 8位,以字节为单位。
ATM网络,值为20
。如果要绑定跨越的ATM网络必须使用两级硬件地址,那么旁边的8位保留字段可用来定义第二个地址的长度; - 操作 16位,定义分组的类型。已知分组类型有五种:
请求 1;
回答 2;
反向请求 8;
反向回答 9;
NACK 10;
- 发送方协议长度 8位,以字节为单位。
对于IPv4值为4
; - 目标硬件长度 8位,以字节为单位。
对于ATM网络值为20
。注意,如果要绑定跨越的ATM网络必须使用两级硬件地址,那么旁边的8位保留字段可用来定义第二个地址的长度; - 目标协议长度 8位,以字节为单位,
对于IPv4值为4
; - 发送方硬件地址 可变长度,以字节为单位,
对于ATM值为20
; - 发送方协议 可变长度,以字节为单位,
对于IPv4位4
; - 目标硬件地址 可变长度,字节为单位;
- 目标协议地址 可变长度,字节为单位。
ATMARP的操作
有两种方法可以连接ATM上的两个路由器:永久虚电路(PVC)和 交换虚电路(SVC),ATMARP操作取决于连接方法。
PVC连接
永久虚电路(PVC)连接是由网络提供者在两个端点之间建立的。这些永久连接都指定了 VPI 和 VCI,且它们的数值被保存在每一个交换机的路由表中。
在PVC的情况下,反向请求报文和反向回答报文可以把物理地址和IP地址绑定起来。
反向请求报文,将自己的IP地址和物理地址告知对方;反向响应报文也是。
交换过报文后,两个路由器都增加了一个表项,将物理地址映射到PVC。
SVC连接
在使用交换虚电路(SVC)连接的情况下,路由器每一次想和另一个路由器(或主机)建立连接时,都必须建立一条新的虚电路。但是,仅当进入点Router知道离去点Router的物理地址时,这条虚电路才能建立(ATM不认识IP地址)。
要把IP地址映射为物理地址,每一个Router必须运行客户ATMARP程序,但只有一个计算机运行ATMARP服务器程序。
ATM是非广播网络,一个ATMARP请求报文不可能到达这个网络上的所有路由器。
建立虚连接的过程需要3个步骤:连接服务器、收到物理地址、建立连接。
连接服务器 通常,每一个路由器和服务器之间都建立了一条永久虚电路;
收到物理地址 如果进入点Router和服务器之间有一条连接,那么路由器就向服务器发送ATMARP请求报文。如果服务器能够找到相应的物理地址,就返回ATMARP响应报文;否则就返回ATMARP NACK报文,进入点Router收到 NACK报文,就丢弃这个数据报;
建立虚电路 在进入点Router收到离去点Router的物理地址后,它就能够请求在自己和离去Router之间建立一条SVC。ATM网络利用这两个物理地址建立虚电路,这条虚电路一致持续到进入点Router要求断开连接为止。
在SVC情况下,用请求报文和回答报文可以将物理地址和IP地址绑定。
建立映射表 当路由器第一次连接到ATM网络上时,在路由器和服务器之间就建立起一条永久虚电路,服务器向该路由器发送一个反向请求报文,路由器则返回一个反向响应报文。
有了这两个地址,服务器就能在它的路由表中建立一个表项,以便今后当这个路由器做为离去点路由器时能够用得上。
反向请求和反向响应报文也可用来构建服务器的映射表。
逻辑IP子网(LIS)
逻辑子网地址(Logical IP Subnet),一个大的局域网可以划分为若干个子网,同样,一个ATM网络也可划分为若干个逻辑上(非物理上)的子网。这样做方便 ATMARP 以及其他一些 需要在ATM网络上模拟广播操作的协议(如IGMP)。
连接在ATM网络上的Router可以属于一个或多个逻辑子网。
B,C,D属逻辑子网1;H,G,F属逻辑子网2;A,E属逻辑子网1和2;
一个Router可以直接和同一个逻辑子网的Router直接通信,并直接把IP分组发送过去;
如果两个非同一个逻辑子网的Router需要通信,就必须先把分组发送给属于这两个分组的Router(如上如的A或E)。
属于同一个逻辑子网的Router共享相同的前缀和子网掩码;
要使用ATMARP,各个子网中必须有一个独立的ATMARP服务器。
ARP软件包
我们可以假设ARP软件包由以下五个构件构成:高速缓存表(cache table),队列,输出模块,输入模块和高速缓存控制模块。
这个软件包接收的是即将被封装成帧而需要一个物理地址的IP数据报。如果ARP软件包找到了物理地址,它就把这个IP分组和物理地址一起交付给数据链路层以便传输。
高速缓存表
发送方往往不止一个IP数据报需要发送,如果对发送到同一个主机或路由器的每一个数据报都使用一次ARP协议,显然效率很低。解决办法就是高速缓存表。
当主机或路由器收到一个IP数据报响应的物理地址时,就可以把这个物理地址存储在高速缓存表中。但是,由于高速缓存表的空间非常有限,表中的映射关系可能只有几分钟。
高速缓存表以表项数组的形式实现,每个表项包含以下一些字段:
- 状态 表项状态,有FREE(表项生存时间已到期),PENDING(表项请求已发出,但未收到回答),RESOLVED(表项已完成映射);
- 硬件类型 ;
- 协议类型 ;
- 硬件长度 ;
- 协议长度 ;
- 接口号 一个路由器能够连接到多个不同的网络,每个连接都有不同的接口号;
- 队列号 ARP使用带编号的队列把等待地址解析的分组进行排队。发往同一个终点的分组通常放在同一个队列中;
- 尝试 表示表项发送了多少次ARP请求;
- 超时 表项生存时间;
- 硬件地址 ;
- 协议地址 ;
队列
ARP软件包维持着一组队列,每个队列对应于一个终点,用来在ARP尝试解析硬件地址时保留IP分组。
输出模块把未解析的分组发送到相应的队列(queue),输入模块从队列中取出分组,并连同解析出物理地址一起发送给数据链路层传输。
输出模块
ARP_Output_Module()
{
睡眠,直至收到来自IP软件的IP分组
检查高速缓存表,寻找这个IP分组终点对应的表项
if(找到)
{
if(状态RESOLVED)
{
从该表项中提取出硬件地址
把分组连同物理地址一起发送到数据链路层
返回
}
if(状态是PENDING)
{
把分组放入相应队列
返回
}
}
if(未找到)
{
创建一个高速缓存表项,状态置为PENDING,ATTEMPTS置1
创建一个队列
把分组放入队列
发送一个ARP请求
返回
}
}
输入模块
ARP_Input_Module()
{
睡眠,直至一个ARP分组(请求或响应)到达
检查高速缓存表
if(找到)
{
更新这个表项
if(状态PENDING)
{
while(相应的队列非空)
{
从队列中取出一个分组
将该分组连同硬件地址一起发送
}
}
}
if(未找到)
{
创建一个表项
把新建的表项加入到表中
}
if(这个分组是请求分组)
{
发送ARP响应
}
返回
}
高速缓存控制模块
高速缓存控制模块(Cache-Control Module)负责维护高速缓存表。
ARP_Cache_Control_Module()
{
睡眠,直至计时器到时
Repeat for 高速缓存中的每一个表项
{
if(状态FREE)
{
尝试值+1
if(尝试值大于最大数)
{
把状态改为FREE
撤销响应的队列
}
else
{
发送一个ARP请求
}
继续
}
if(状态RESOLVED)
{
递减超时字段值
if(超时字段的值<=0)
{
把状态改为FREE
撤销相应的队列
}
}
}
返回
}
总结
RFC
专门讨论ARP的RFC包括:RFC826,RFC1029,RFC1166 和 RFC1981。
重要术语
地址解析协议(ARP); 高速缓存表;
高速缓存控制模块; 动态映射;
封装; 反向响应报文;
反向请求报文; 静态映射;
逻辑IP子网; 物理地址;
代理ARP; 队列;
保留字段; 逆向地址解析协议(RARP);