文章目录
- IP协议相关技术
- 仅凭IP无法完成通信
- DNS
- ARP
IP协议相关技术
仅凭IP无法完成通信
人们在上网的时候其实很少直接输入某个具体的IP地址。
在访问Web站点和发送、接收电子邮件时,我们通常会直接输入Web网站的地址或电子邮件地址等那些由应用层提供的地址,而不会使用由十进制数字组成的某个IP地址。因此,为了能让主机根据实际的IP包进行通信,就有必要实现一种功能—将应用中使用的地址映射为IP地址。
此外,在数据链路层也不使用IP地址。在以太网的情况下只使用MAC地址传输数据包。而实际上将众多IP数据包在网络上进行传送的就是数据链路本身,因此,必须了解发送端MAC地址。如果不知道MAC地址,那么通信也就无从谈起。
由此可知,在实际通信中,仅凭IP远远不够,还需要众多支持IP的相关技术才能够最终通信。一些IP的辅助技术,具体包括DNS、ARP、ICMP、ICMPv6、DHCP、NAT等。还包括如IP隧道、IP多播、IP任播、质量控制(Qos)以及网络拥塞的显示通知和Mobile IP技术。
DNS
我们平常在访问某个网站时不使用IP地址,而是用一串由罗马字和点好组成的字符串。而一般用户在使用TCP/IP进行通信时也不使用IP地址。能够这样做是因为有了DNS(Domain Name System)功能的支持。DNS可以将那串自动转换为具体的IP地址。这种DNS不仅适用于IPv4,还适用于IPv6。
IP地址不便记忆
TCP/IP网络中要求每一个互连的计算机都具有其唯一的IP地址,并基于这个IP地址进行通信。然而,直接使用IP地址有很多不便之处。例如,在进行应用操作时,用户必须指定对端的接收地址,此时如果使用IP地址的话应用就会有很多不便之处。因为IP地址是由一串数据序列组成,并不好记。
为此,TCP/IP世界中从一开始就已经有了一个叫做主机识别码的东西。这种识别方式是指为每台计算机赋予唯一的主机名,在进行网络通信时可以直接使用主机名称而无需输入一大长串的IP地址。并且此时,系统必须自动将主机名转换为具体的IP地址。为了实现这样的功能,主机往往会利用一个叫做hosts的数据库文件。如下图:
DNS的产生
在上述背景下,产生了一个可以有效管理主机名和IP地址之间对应关系的系统,那就是DNS系统。在这个系统中主机的管理机构可以对数据进行变更和设定。也就是说,它可以维护一个用来表示组织内部主机名和IP地址之间对应关系的数据库。
在应用中,当用户输入主机名(域名)时,DNS会自动检索那个注册了主机名和IP地址的数据库,并迅速定位对应的IP地址。而且,如果主机名和IP地址需要进行变更时,也只需要在组织机构内部进行处理即可,而没必要再向其它机构进行申请或报告。
有了DNS,不论网络规模变得多么庞大,都能在一个较小的范围内通过DNS进行管理。可以说DNS充分地解决了ARPANET初期遇到的问题。就算到现在,当人们访问任何一个Web站点时,都能够直接输入主机名进行访问,这也要归功于DNS。
域名的构成
在理解DNS规范时,首先需要了解什么是域名。域名是指为了识别主机名称和组织机构名称的一种具有分层的名称。例如,仓敷艺术科学大学的域名如下:
kusa.ac.jp
域名由几个英文字母(或英文字符序列)用点号连接构成。在上述域名中最左边的“kusa”表示仓敷艺术科学大学(Kurashiki University of Science and the Arts)固有的域名。而“ac”表示大学(academy)或高等专科以及技术专门学校等高等教育相关机构。最后边的“jp”则代表日本(japan)。
在使用域名时,可以在每个主机名后面追加上组织机构的域名。例如,有pepper、piyo、kinoko等主机时,它们完整的带域名的主机名将呈如下形式:
pepper.kusa.ac.jp
piyo.kusa.ac.jp
kinoko.kusa.ac.jp
在启用域名功能之间,单凭主机名还无法完全管理IP地址,因为在不同的组织机构中不允许有同名的主机。然而,当出现了带有层次结构的域名之后,每一个组织机构就可以自由地为主机命名了。
域名服务器
域名服务器是指管理域名的主机和相应的软件,它可以管理所在分层的域的相关信息。其所管理的分层叫做ZONE。如下图,每层都设有一个域名服务器:
根部所设置的DNS叫做根域名服务器。它对DNS的检索数据功能起着至关重要的作用。根域名服务器中注册着根以下第1层域名服务器的IP地址。根域名服务器中,注册了那些管理的域名服务器的IP地址。反之,如果想要新增一个类似jp或org的域名或修改某个已有域名,就得在根域名服务器中进行追加或变更。
类似地,在根域名服务器的下一层域名服务器中注册了再往下一层域名服务器的IP地址。根据每个域名服务器所管理的域名,如果下面再没有其它分层,就可以自由地指定主机名称或子网名称。不过,如果想修改该分层的域名或重新设置域名服务器的IP地址,还必须得在其上层的域名服务器中进行追加或修改。
因此,域名和域名服务器需要按照分层进行设置。如果域名服务器宕机,那么针对该域的DNS查询也就无法正常工作。因此,为了提高容灾能力,一般会设置至少两个以上的域名服务器。一旦第一个域名服务器无法提供查询时,就会自动转到第二个甚至第三个域名服务器上进行,以此可以按照顺序进行灾备处理。
所有的域名服务器都必须注册根域名服务器的IP地址。因为DNS根据IP地址进行检索时,需要从根域名服务器开始按顺序进行。
DNS查询
那么DNS查询的机制是什么呢?用一个例子进行说明,图中kusa.co.jp域中的计算机想要访问网站www.ietf.org,此时的DNS查询流程如下图:
解析器为了调查IP地址,向域名服务器进行查询处理。接收这个查询请求的域名服务器首先会在自己的数据库进行查找。如果有该域名所对应的IP地址就返回。如果没有,则域名服务器再向上一层根域名服务器进行查询处理。因此,从根开始对这棵树按照顺序进行遍历,直到找到指定的域名服务器,并由这个域名服务器返回想要的数据。
解析器和域名服务器将最新了解到的信息暂时保存在缓存里。这样,可以减少每次查询时的性能消耗。
ARP
只要确定了IP地址,就可以向这个目标地址发送IP数据报。然而,在底层数据链路层,进行实际通信时却有必要了解每个IP地址所对应的MAC地址。
ARP概要
ARP是一种解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的MAC地址。如果目标主机不在同一个链路上时,可以通过ARP查找下一跳路由器的MAC地址。不过ARP只适用于IPv4,不能用于IPv6。IPv6中可以使用ICMPv6替代ARP发送邻居探索消息。
ARP:Address Resolution Protocol
ARP的工作机制
那么ARP又是如何知道MAC地址的呢?简单地说,ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。
如下图:
假定主机A向同一链路上的主机B发送IP包,主机A的IP地址为172.20.1.1,主机B的IP地址为172.20.1.2,它们互不知道对方的MAC地址。
主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包。这个包中包含了想要了解其MAC地址的主机IP地址。也就是说,ARP请求包中已经包含了主机B的IP地址172.20.1.2。由于广播的包可以被同一个链路上所有的主机或路由器接收,因此ARP的请求包也就会被这同一个链路上所有的主机和路由器进行解析。如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A。
总之,从一个IP地址发送ARP请求包以了解其MAC地址,目标地址将自己的MAC地址填入其中的ARP响应包返回到IP地址。由此,可以通过ARP从IP地址获得MAC地址,实现链路内的IP通信。
根据ARP可以动态地进行地址解析,因此,在TCP/IP的网络构造和网络通信中无需事先知道MAC地址究竟是什么,只要有IP地址即可。
如果每发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,那将会造成不必要的网络流量,因此,通常的做法是把获取到的MAC地址缓存一段时间。即把第一次通过ARP获取到的MAC地址作为IP对MAC的映射关系记忆到一个ARP缓存表中,下一次再向这个IP地址发送数据报时不需要再重新发送ARP请求,而是直接使用这个缓存表当中的MAC地址进行数据报的发送。每执行一次ARP,其对应的缓存内容都会被清楚。不过在清楚之前都可以不需要执行ARP就可以获取到想要的MAC地址。这样,在一定程度上也防止了ARP包在网络上被大量广播的可能性。
一般来说,发送过一次IP数据报的主机,继续发送多次IP数据报的可能性会比较高。因此,这种缓存能够有效地减少ARP包的发送。反之,接收ARP请求的那个主机又可以从这个ARP请求包获取发送端主机的IP地址及其MAC地址。这时它可以将这些MAC地址的信息缓存起来,从而根据MAC地址发送ARP响应包给发送端主机。类似地,接收到IP数据报的主机又往往会继续返回IP数据报给发送端主机,以作为响应。因此,在接收主机端缓存MAC地址也是一种提高效率的方法。
IP地址和MAC地址缺一不可
有些读者可能会提出这样的疑问:“数据链路上只要知道接收端的MAC地址不就知道数据是准备发送给主机B的吗,那还需要知道它的IP地址吗?”
乍听起来确实让人觉得好像是在做多余的事。此外,还有些读者可能会质疑:“只要知道了IP地址,即使不做ARP,只要在数据链路上做一个广播不就能发给主机B了吗?”那么,为什么既需要IP地址又需要MAC地址呢?
如果读者考虑一下发送给其它数据链路中某一个主机时的情况,这件事就不难理解了。如下图:
主机A想要发送IP数据报给主机B时必须得经过路由器C。即使知道了主机B的MAC地址,由于路由器C会隔断两个网络,还是无法实现直接从主机A发送数据报给主机B。此时,主机A必须得先将数据报发送给路由器C的MAC地址C1。
此外,假定MAC地址就用广播地址,那么路由器D也将会收到广播消息。于是路由器D又将该消息转发给路由器C,导致数据包被重复发送两次。
在以太网上发送IP包时,“下次要经过由哪个路由器发送数据报”这一信息非常重要。而这里的“下一个路由器”就是相应的MAC地址。
如此看来,IP地址和MAC地址两者缺一不可。于是就有将这两个地址相关联的ARP协议。