IP旨在让最终目标主机收到数据包,但是在这一过程中仅仅有IP是无法实现通信的。必须还要有能够解析主机名称和MAC地址功能,以及技术包在发送过程中异常情况处理的功能。
这篇主要介绍下DNS、ARP、ICMP、DHCP等协议
DNS
TCP/IP网络中要求每一个互连的计算机都具有其唯一的IP地址,并基于这个IP地址进行通信。但是IP地址太长了,不好记。
人们希望主机有自己自己的名字,这个名字是唯一的,而且容易记住。于是,诞生了主机名“域名”的概念。域名是一种为了识别主机名称和机构名的具有分层的名称,比如在域名 neu.edu.cn中,neu是主机名,edu 和 cn 是不同层次下的机构名。
为了实现这样的功能,主机往往会利用一个叫做hosts的数据库文件
但是随着网络规模的不断扩大,接入计算机的个数不断增加,这种集中在本地电脑管理的方式就不可取了。
于是出现了DNS,当我们输入主机名(域名)时,DNS会先在互联网上先自动检索那个注册了主机名和IP地址的数据库,并迅速定位到对应的IP地址。
域名和 IP 地址都可以唯一对应一台主机,DNS 协议的作用就是将自身具有意义的域名转换成不容易记住的 IP 地址。
域名是分层的,每层都有自己的 DNS 服务器用于处理 DNS 解析的请求。这样的好处在于每层的服务器不用关注过多的信息,它只要知道自己这一层下的域名服务器信息即可。以解析域名: www.abc.com为例:
根服务器其实并不知道 www.abc.com 的 IP 地址,但是它知道 abc.com 域名服务器的地址,所以它把这条查询请求转发给 abc.com 域名服务器。DNS请求被逐层下发,直到找到对应的 IP 地址为止。
解析器和域名服务器将最新了解到的信息暂时保存在缓存中酱紫可以减少每次查询时的性能消耗。
DNS就如同互联网中的分布式数据库
ARP
只要确定了IP地址,就可以向这个目标地址发送IP数据报。然而在底层数据链路层,进行实际通信时,却需要知道每个IP地址所对应的MAC地址
ARP 协议(Address Resolution Protocol)用于通过目标 IP 地址,定位下一个接收数据包的网络设备的 MAC 地址。如果目标主机处在同一个数据链路上,那么可以直接得到目标主机的 MAC 地址,否则会得到下一条路由器的 MAC 地址。
ARP 协议的工作原理可以分为两部分:ARP 请求和 ARP 响应。 首先,源主机会通过广播发送一个 ARP 请求包:“我要与 IP 地址为 xxx 的主机通话,谁知道它的 MAC地址?”。
数据链路上的所有主机都会收到这条消息并检查自己的 IP 地址,如果与 ARP 请求包中的 IP 地址一致,主机就会发送 ARP 响应包:“我就是 IP 地址为 xxx 的主机,我的 MAC 地址是:xxxx”。
下图表示了 ARP 协议的工作机制:
在实际的使用过程中,每次往目标主机发送数据都要使用 ARP 是很低效的,通常的做法是把获取到的 MAC 地址缓存一段时间。一般来说,一旦源主机向目标地址发送一个数据包,接下来继续发送多次的概率非常大,因此这种缓存非常容易命中。
当下一次发送 ARP 请求或超过一定时间后,缓存都会失效,这保证了即使 MAC 地址与 IP 地址的对应关系发生了变化,数据包依然能够被正确的发往目标地址。
IP地址和MAC地址缺一不可?
MAC 和 IP 地址虽然看上去功能类似(都是用于唯一区分主机),但是两者缺一不可。如果只有 IP 地址,虽然可以跳过 ARP,直接在数据链路上发一个广播,但是这仅适用于通信双方处于同一个数据链路下的情况。如果双方处于不同的数据链路,数据报无法穿透中间的路由器。
仅凭MAC地址,人们无法知道这台机器所处的位置。如果全世界只用 MAC 地址,那么网桥就得向全世界发包,那么请参考交换机的自学过程,可以想象这个过程会带来庞大的,不必要的流量,而且网桥要维护一张巨大的表格来维护所有学到的MAC地址,当这些信超过网桥极限,就没法工作了,也就无法通信了。
正因为 MAC 和 IP 地址缺一不可,所以才产生了 ARP 这样的协议将两者关联起来。
RARP
RARP(Reverse Address Resolution Protocol)是将ARP反过来,从MAC地址定位IP地址的一种协议。
代理ARP
通常ARP包会被路由器隔离,但是采用代理ARP的路由器可以将ARP请求转发给邻近的网段。由此两个以上网段的节点之间可以像在同一个网段中一样进行通信。
一般情况下有路由器连接多个网络时,会在每个网段定义各自的子网,从而进行路由控制,但是对于那些不支持设定子网掩码的老设备,不适用代理ARP,有时就无法更好的使用网络。
ICMP
架构IP网络时需要特别注意两点:确认网络是否正常工作,以及遇到异常时进行问题诊断。
ICMP正是提供这类功能的一种协议。
主要功能包括:确认IP包是否成功送达目标地址,通知在发送过程中IP包被废弃的具体原因,改善网络设置等。
ICMP的消息大致可以分为两类:一类是通知出错原因的错误消息,另一类是用于诊断的查询消息。
主要消息类型
DHCP(Dynamic Host Configuration Protocol)
逐一为每一台主机设置IP地址会非常繁琐的事情。特别是移动设备,每到一个新地方,就要重新设置IP地址
于是为了实现自动设置IP地址、统一管理IP地址分配,就产生了DHCP协议。
有了DHCP,计算机只要连接到网络,就可以进行TCP/IP通信。
DHCP工作机制
使用DHCP前,首先要假设一台DHCP服务器。然后将DHCP所要分配的IP地址设置到服务器上。此外,还需要将相应的子网掩码、路由控制信息以及DNS服务器的地址等设置到服务器上。
为了检查所要分配的IP地址以及已经分配了的IP地址是否可用,DHCP服务器或DHCP客户端必须具备以下功能:
- DHCP服务器:
在分配IP底之前发送ICMP回送请求包,确认没有返回应答 - DHCP客户端:
针对从DHCP哪里获得的IP地址发送ARP请求包,确认没有返回应答
在大规模组织机构的网络环境中,往往需要将DHCP统一管理
NAT
NAT (Network Address Translator) 是一种用于将局域网中的私有地址转换成全局 IP 地址的技术。
在连接上无线路由器的时候,如果检查一下设备的 IP 地址,也许你会发现是类似于 192.168.1.1 这样的局域网 IP 地址。那不同网段中,IP 地址都是 192.168.1.1 的主机改如何通信呢?
局域网中 IP 地址为 10.0.0.10 的主机向全局 IP 地址 163.221.120.9 发送数据。NAT 路由器将数据包的源地址修改成自己的全局 IP 地址:202.244.174.37。同理,接收数据时,路由器把目标地址 202.244.174.37 翻译成内网地址:10.0.0.10
下图描绘了 NAT 的工作原理:
路由器只有一个对外的全局 IP 地址,如果有多个内网主机都向外部通讯怎么办呢?这时就要使用 NAPT 技术,它和 NAT 从原理上类似,但它可以转换 TCP 和 UDP 端口号。
使用 NAPT 技术时,不同的内网 IP 被转换成同一个公共 IP 地址,也就是路由器对外显示的全局 IP 地址,但是被附加不同的端口号以示区分:
不管是 NAT 还是 NAPT,都需要路由器路由器内部维护一张自动生成的地址转换表。以 TCP 为例,建立 TCP 连接首次握手的 SYN 包发出时会生成这个表,关闭连接时会发出 FIN 包,收到这个包的应答时转换表被删除。
IP隧道
在下图所示的网络环境中,网络A、B使用IPv6,如果处于中间位置的网络C支持使用IPv4的话,A与B之间就无法直接进行通信。为了让他们之间正常通信,这是必须得采用IP隧道的功能。
IP隧道中可以将那些从网络A发过来的IPv6的包统和为一个数据,再为之追加一个IPv4的首部以后转发给网络C。
一般情况下,紧接着IP首部的是TCP或UDP的首部。然而,现在的应用中,"IP首部的后面还是IP首部"或者"IP首部的后面是IPv6的首部"等情况与日俱增。这种在网络层的首部后面继续追加网络层首部 的通信方法就叫做"IP隧道"。