TCP/IP详解卷一: 协议之第4~6章

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报文:

  1. 接收到一个ICMP报错消息
  2. 接收到一个发给广播或者多播地址的报文
  3. 接收到一个链路层广播的报文
  4. 不是IP第一分片
  5. 接收到一个源地址不是一个单独主机的地址的报文, 如零地址, 环回地址, 广播地址, 多播地址, 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个方法

  1. 静态配置信息
  2. 系统初始化时动态获取地址掩码
  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端口不可达消息到源主机. 当源主机收到这样一个消息时, 就知道消息已经达到目的主机, 就停止了继续发送探测报文的事情.

原文地址:https://www.cnblogs.com/winwink/p/TCPIP_Note_Part2_4-6.html