p38~p60.
第4章 ARP
这一章看了半天, 没看懂. 就去找了另外一部计算机网络经典<计算机网络 自顶向下方法>, 其中的5.4.1章(Link-Layer Addressing and ARP)讲的就是ARP, 这部分读起来简单多了.
以下为摘要.
上面我们讲了主机和路由器有网络层地址(IP地址), 现在我们讲还有链路层地址(MAC地址), 那为什么有了网络层地址, 还要有链路层地址呢?
MAC
一个链路层地址又称局域网地址
, 物理地址
, 或者MAC地址
.因为MAC地址最为常用, 所以后面都称为MAC地址. 一般MAC地址的长度是6byte, 有2^48个地址. 尽管可以用软件修改MAC地址, 我们暂且认为MAC地址是固定的.
一个有趣的事情是, 任意2个网卡的MAC地址是不同的. 你可能会觉得奇怪, 这些网卡由不同的国家不同的工厂生产, 为何能保证唯一性. 其实是IEEE协会在发放MAC地址, 当一个公司想生产网卡, 必须向IEEE协会购买一个区段的地址. IEEE保证前24位地址是唯一的, 后面的24位由生产网卡的公司自己保证唯一. 2^24 = 1600万.
MAC地址是不会变的, 不会随计算机移动而变化, 而IP地址是会变的, 当计算机移动到另一个网络时, IP随之改变. 类比人, 就像身份证号码和门牌号, 身份证号码不会改变, 搬到不同的地方住, 就会有不同的门牌号.
应用层的主机名, 网络层的IP地址, 链路层的MAC地址.
ARP
假设一个IP 222.222.222.220想给222.222.222.222发送一个IP数据报, 在这个例子中, 源地址和目的地址在一个子网中, 为了发送数据包, 只有IP地址是不够的, 还需要知道目的地址的MAC地址.
这时就需要ARP协议了, 输入一个本子网内的任意IP, 返回这个IP的主机的MAC地址.
那ARP协议是怎样将IP地址解析为MAC地址的, 很多情况下很像DNS协议, 将主机名解析为IP地址. 然后重要的区别是DNS可以处理因特网上任意的主机名, ARP协议只处理本子网内的IP, 假如输入的不是本子网内的IP, 那么ARP就会报错.
让我们看看ARP如何工作的, 每个主机和路由器都有一个ARP表, 记录了IP地址和MAC地址的映射关系, 输入arp -a
的命令可以看到. ARP表也包含一列, TTL, 用来标识该记录的失效时间. 标准的有效时间是20分钟, 即往ARP表中新加一条记录后, 20分钟后失效. 现在假设222.222.222.220想向222.222.222.222发送一个数据报, 发送方需要知道目的主机的MAC地址, 如果ARP表中有目的主机的MAC地址就好办了, 查表就行了. 但是如果没有呢? 发送方创建了一个特殊的报文, 叫ARP数据报, 里面包含了源主机的IP地址和MAC地址, 以及目的主机的IP地址, 然后发往MAC广播地址, FF-FF-FF-FF-FF-FF, 这个报文会广播给子网内的每个主机和路由器, 就向一个人在一个有很多人的屋子里喊话, "222.222.222.222的身份证号码是多少?". 每个收到消息的主机都会接收到报文, 并交给ARP模块处理, ARP模块检查IP是否和自己的IP相匹配, 只有匹配了IP的主机才会回复, 它会将自己的MAC地址放到报文中发回给源主机. 源主机收到报文后, 取出目的主机的MAC地址, 将IP地址和MAC地址维护到ARP表中.
这其中有很多有意思的事, 首先, ARP请求报文是广播形式的, 而ARP回复报文却是标准形式的. 其次, ARP是即插即用的, 不是必须由管理员事先配置的, ARP系统是自动适应的. 如果一台主机离开了这个子网, 子网中其它主机最终会自动将这个主机从ARP表中删除的.
向不是一个子网发送IP数据报
每个主机都有一个网卡和一个IP地址, 但对于路由器, 每个接口都有一个IP地址, 每个接口中有一个网络适配器和一个IP地址. 如下图所示, 一个简单的跨子网的情景.
子网1是111.111.111/24, 子网2是222.222.222/24. 假设子网1的主机111.111.111.111想给子网2的主机222.222.222.222发送数据报. 发送数据报文前必须知道目的主机的MAC地址. 目的MAC地址应该填什么呢, 是222.222.222.222的MAC地址49-BD-D2-C7-56-2A吗? 错! 如果是用的这个MAC地址, 则数据报还没出这个子网就挂了.
从图中我们知道, 要想出这个子网, 首先要从路由器的接口1(111.111.111.110)出. 所以报文要先发给这个接口, 目的IP填222.222.222.222, 目的MAC地址填111.111.111.110的MAC地址. MAC如何来, 用ARP协议进行查询, 查到后, 将报文发给接口1. 接口1的链路层接收到报文, MAC地址匹配, 将报文传递给网络层, 网络层发现IP不匹配, 将要执行转发操作, 需要去查路由表
, 路由表中表明将数据发给接口2即可. 接口2接收到报文, 发现IP属于这个子网, 但是不知道目的主机的MAC地址, 所以先用ARP协议查下目的主机的MAC地址, 查到后目的MAC地址填49-BD-D2-C7-56-2A, 将报文发出去, 222.222.222.222收到报文后, 发现是发给自己的报文, 进行处理. 就这样, 经历了ARP协议 ~ 路由转发 ~ ARP协议, 数据报就在跨网段中到达了目的主机.
第5章 RARP协议
这个协议主要是供无盘机获取IP用, 从网卡中读取MAC地址发送一个RARP请求, RARP服务器返回一个携带IP地址的响应.
第6章 ICMP协议
这一章我们直接看RFC 1122.
ICMP消息分两大类, 报错消息和查询消息.
每个ICMP消息必须包含网络层的头和至少8字节的导致报错的消息. 多余8字节的部分可能会一起发送.
以下情况不会回应ICMP报文:
- 接收到一个ICMP报错消息
- 接收到一个发给广播或者多播地址的报文
- 接收到一个链路层广播的报文
- 不是IP第一分片
- 接收到一个源地址不是一个单独主机的地址的报文, 如零地址, 环回地址, 广播地址, 多播地址, E类地址.
ICMP报错 消息不可达(Destination Unreachable)
以下code定义
6 = 目的网络不认识
7 = 目的主机不认识
8 = 源主机被隔离
9 = 目的网络被强制禁止
10= 目的主机被强制禁止
11= 由于服务类型TOS, 网络不可达
12= 由于服务类型TOS, 主机不可达
ICMP报错 重定向(Redirect)
主机不应发送ICMP重定向消息, 重定向只能由网关发送.
主机接收到重定向消息, 必须更新他的路由信息.
ICMP报错 源抑制(Source Quench)
如果一台高速计算机向远程计算机发送大量数据, 可能会使路由产生过载. 这时路由器可以利用ICMP向源IP发送源抑制报文, 让它降低发送数据的速度.
ICMP报错 超时(Time Exceeded)
收到一个超时消息必须发送给传输层.
如果网关由于TTL超时抛弃报文,将会发送一个ICMP超时报文.
ICMP报错 参数错误(Parameter Problem)
对于任何其他ICMP消息未明确涵盖的问题,会将ICMP参数问题消息发送到源主机。 收到“参数错误”消息通常表示某些本地或远程实现错误。
ICMP查询 显示请求/应答(Echo Request/Reply)
每个主机必须实现一个ICMP显示服务功能, 用于接收Echo请求和回应Echo. 同样必须实现一个应用层接口用于发送一个Echo请求和接收Echo应答, 用于查错的目的.
ICMP查询 信息请求/应答(Information request/replay)
主机不应该实现该功能.
这个功能是用来支持自配置系统, 如无盘工作站, 允许它们在系统启动的时候获取IP地址. 然而RARP和BOOTP协议能够提供更好的机制获取IP.
ICMP查询 时间戳和时间戳应答(Timestamp and Timestamp Reply)
主机应该实现该功能.
ICMP时间戳服务器给每个时间戳请求发送时间戳应答. 应该设计的尽量少的延迟.
ICMP查询 地址掩码请求和应答(Address Mask Request/Reply)
3个方法
- 静态配置信息
- 系统初始化时动态获取地址掩码
- 发送ICMP地址掩码请求, 接收ICMP地址掩码应答.
ICMP应用 Traceroute程序(自顶向下 4.4.3 Internet Control Message Protocol)
Traceroute程序允许我们跟踪主机到目的主机间所有的路由信息.
为了知道源主机和目的主机间所有路由器的名字和地址. 从源主机发送了一系列IP数据报到目的主机.
每个数据报都携带了一个不像UDP端口的UDP片段. 第1个数据报的TTL设置为1, 第2个的设置为2, 逐渐增加. 第n个数据报发给第n个路由, 第n个路由收到TTL为n的数据报时, 刚好TTL变为0, 超时了, 所以抛弃这个报文, 并回应一个ICMP超时消息到源主机. 这样源主机收到这些ICMP超时消息, 就知道这些路由器的名字和IP地址.
可是它又如何知道什么时候停止发送数据报呢? 当数据报到达目的主机时, 由于端口不是普通的UDP端口, 而类型是UDP类型, 所以主机应答一个ICMP端口不可达消息到源主机. 当源主机收到这样一个消息时, 就知道消息已经达到目的主机, 就停止了继续发送探测报文的事情.