NAT 技术与 ARP 协议

私有 IP 地址

之前我们讨论了, IPv4 协议中,IP 地址数量不充足的问题
NAT 技术当前解决 IP 地址不够用的主要手段,是路由器的一个重要功能;
NAT 能够将私有 IP 对外通信时转为全局 IP。也就是就是一种将私有 IP 和全局 IP 相互转化的技术方法;
很多学校,家庭,公司内部采用每个终端设置私有 IP,而在路由器或必要的服务器上设置全局 IP;
全局 IP 要求唯一,但是私有 IP 不需要;在不同的局域网中出现相同的私有 IP 是完全不影响的;

mark

路由器对目的地址是私有 IP 地址的数据报一律不进行转发。

网络地址转换 NAT

网络地址转换 NAT (Network Address Translation) :在专用网连接到因特网的路由器上安装 NAT 软件,安装了 NAT 软件的路由器叫 NAT 路由器,它至少有一个有效的外部全球 IP 地址。

mark

NAT 路由器将源地址从 10.0.0.10 替换成全局的 IP 202.244.174.37;
NAT 路由器收到外部的数据时,又会把目标 IP 从 202.244.174.37 替换回 10.0.0.10;
在 NAT 路由器内部,有一张自动生成的,用于地址转换的表;
当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;

mark

网段划分

IP 地址分为两个部分,网络号和主机号

网络号:保证相互连接的两个网段具有不同的标识;
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;

不同的子网其实就是把网络号相同的主机放到一起,如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的 IP 地址都不相同。

手动管理子网内的 IP,是一个相当麻烦的事情。有一种技术叫做 DHCP,能够自动的给子网内新增主机节点分配 IP 地址,避免了手动管理 IP 的不便。一般的路由器都带有 DHCP 功能。因此路由器也可以看做一个 DHCP 服务器。

过去曾经提出一种划分网络号和主机号的方案,把所有 IP 地址分为五类,如下图所示:

mark

A 类 0.0.0.0 到 127.255.255.255
B 类 128.0.0.0 到 191.255.255.255
C 类 192.0.0.0 到 223.255.255.255
D 类 224.0.0.0 到 239.255.255.255
E 类 240.0.0.0 到 247.255.255.255

随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址,导致 B 类地址很快就分配完了,而 A 类却浪费了大量地址。

分类的 IP 地址的弱点:
1、IP 地址空间的利用率有时很低
2、两级 IP 地址不够灵活

针对这种情况提出了新的划分方案,称为 CIDR (Classless Interdomain Routing):
引入一个额外的子网掩码 (subnet mask) 来区分网络号和主机号;子网掩码也是一个 32 位的正整数,通常用一串 “0” 来结尾;将 IP 地址和子网掩码进行 “按位与” 操作,得到的结果就是网络号;网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关;

子网掩码可以分离出 IP 地址中的网络地址和主机地址,那为什么要分离呢?因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机,否则就需要路由网关将数据包转发送到目的地。

mark

路由

在复杂的网络结构中, 找出一条通往终点的路线;

当 IP 数据包,到达路由器时, 路由器会先查看目的 IP;路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器;依次反复;一直到达目标 IP 地址;

那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表;可以使用 route 查看路由表:

mark

路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一跳地址,Iface 是发送接
口,也就是网卡,Flags 中的 U 标志表示此条目有效 (可以禁用某些条目),G 标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;

如果要发送的数据包的目的地址是 192.168.45.3

跟第一行的子网掩码做与运算,与第一行的目的网络地址不符
跟第二行的子网掩码做与运算,与第二行的目的网络地址不符
跟第三行的子网掩码做与运算,得到 192.168.45.0,正是第三行的目的网络地址,因此从 eth1 接口发送出去;

如果要发送的数据包的目的地址是 202.10.1.2

依次和路由表前几项进行对比,发现都不匹配;
按缺省路由条目,从 eth34 接口发出去,发往 192.168.10.1 路由器;
由 192.168.10.1 路由器根据它的路由表决定下一跳地址;

ARP 协议

ARP 不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议

ARP 协议的作用:ARP 协议建立了主机 IP 地址和 MAC 地址的映射关系。

在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址;数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;因此在通讯前必须获得目的主机的硬件地址;不过 ARP 协议只能用于 IPv4,不能够用于 IPv6,IPv6 中可以用 ICMPv6 替代 ARP 发送邻居探索消息!

mark

源主机发出 ARP 请求,询问 IP 地址是 172.20.1.2 的主机的硬件地址是多少,并将这个请求广播到本地网段 (以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播);
目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自
己的硬件地址填写在应答包中;
每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间 (一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址:

mark

这种缓存可以有效减少 ARP 包的发送,反之,接受 ARP 包的主机也可以通过这个 ARP 包把发送方的 MAC 地址缓存起来,从而根据 MAC 地址发送 ARP 响应包给发送端主机,并作为响应,因此在接收主机缓存 MAC 地址也是一种提高效率的方式。

MAC 地址的缓存是有期限的,超过这个期限,缓存的内容将被清除,这使得 MAC 地址与 IP 地址对应关系发生了变化,也依旧能够将 IP 数据报正确的发给目标地址。

ARP 包格式:
mark

硬件类型指链路层网络类型,1 为以太网;

上层协议类型指要转换的地址类型,0x0800 为 IP 地址;

HLEN:MAC 地址的长度 = 6 (字节);

PLEN:IP 地址的长度 = 4 (字节);

操作码 : 该字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。

IP 地址和 MAC 地址缺一不可

如图所示,主机 A 想要发 IP 数据报给主机 B 的时候必须经过路由器 c,即使主机 A 知道了主机 B 的 MAC 地址,,由于路由器会隔断两个网络,还是无法实现从主机 A 直接发送到主机 B,此时主机 A 必须先把数据报发送给路由器 C 的 MAC 地址 C1:

mark

在以太网上发送 IP 数据包的时候,“下一次要经过那个路由发送数据包” 这一信息非常重要,而这里的 “下一个路由器” 就是相应的 MAC 地址。由此看来 IP 地址和 MAC 地址缺一不可,将这两个地址关联起来就形成了 ARP 协议。