IP(IPv4、IPv6)相当于OSI参考模型中的第3层—网络层。
网络层的主要作用是“实现终端节点之间的通信”。这种终端节点之间的通信也叫做“点对点(end-to-end)通信”。
我们知道网络层的下一层—数据链路层的主要作用是互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。如下图:
主机与节点
在互联网世界中,将那些配有IP地址的设备叫做“主机”。这里的主机可以是超大型计算机,也可以是小型计算机。这是因为互联网在当初刚发明的时候,只能连接这类大型的设备,因此习惯上就将配有IP地址的设备称为“主机”。
然而准确地说,主机的定义应该是指“配置有IP地址,但是不进行路由控制的设备”。什么叫做路由控制?路由控制的英文是Routing。是指中转分组数据包。
既配有IP地址又具有路由控制能力的设备叫做“路由器”,跟主机有所区别。而节点则是路由器和主机的统称(这些都是IPv6的规范RFC2460中所使用的名词术语。在IPv4的规范RFC791中,将具有路由控制功能的设备叫做“网关”,然而现在都普遍叫做路由器)。
数据链路层提供直连两个设备之间的通信功能。与之相比,作为网络层的IP则负责在没有直连的两个网络之间进行通信传输。那么为什么一定需要这样的两个层次呢?它们之间的区别又是什么呢?
在此,我们以旅行为例说明这个问题。有个人要去一个很远的地方旅行,并且计划先后乘坐飞机、火车、公交车到达目的地。为此,他决定先去旅行社购买机票和火车票。
旅行社不仅为他预订好了旅途过程中所需要的机票和火车票,甚至为他制定了一个详细行程表,详细到几点几分需要乘坐飞机或火车都一目了然。
当然,机票和火车票只有特定区间内有效,当你换乘不同公司的飞机或火车时,还需要重新购票。
仔细分析一下机票和火车票,不难发现,每张票只能够在某一限定区间内移动。此处的“区间内”就如同通信网络上的数据链路。而这个区间内的出发地点和目的地点就如同某一个数据链路的源地址和目标地址等首部信息。整个全程的行程表的作用就相当于网络层。
如果我们只有行程表而没有车票,就无法搭乘交通工具到达目的地。反之,如果除了车票其他什么都没有,恐怕也很难到达目的地。因为你不知道该坐什么车,也不知道该在哪里换乘。因此,只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证到达目的地。与之类似,计算机网络中也需要数据链路层和网络层这个分层才能实现向最终目标地址的通信。
IP大致分为三大作用模块,它们是IP寻址、路由、以及IP分包与组包。
在计算机通信中,为了识别通信对端,必须要有一个类似于地址的识别码进行标识。我们知道数据链路的MAC地址。MAC地址正是用来标识同一个链路中不同计算机的一种识别码。
作为网络层的IP,也有这种地址信息。一般叫做IP地址。IP地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”。因此,在TCP/IP通信中所有主机或路由器必须设定自己的IP地址。
路由控制(Routing)是指将分组数据发送到最终目标地址的功能。即使网络非常复杂,也可以通过路由控制确定到达目标地址的通路。一旦这个路由控制的运行出现异常,分组数据极有可能“迷失”,无法到达目标地址。因此,一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。
发送数据至最终目标地址
Hop译为中文叫“跳”。它是指网络中的一个区间。IP包正是在网络中一个个跳间被转发的。因此IP路由也叫做多跳路由。在每一个区间内决定着包在下一跳被转发的路径。
多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全都指定出来。因为每一个区间(跳)在转发IP数据包时会分别指定下一跳的操作,直至包达到最终的目标地址。
如下图,以乘坐火车旅游为例,如下图:
在前面的例子中,虽然已经确定了最终的目标车站,但是一开始还是不知道如何换乘才能到达这个终极目标地址。因此,工作人员给出的方法是首先去往最近的一个车站,再咨询这一车站的工作人员。而到了这个车站以后再询问工作人员如何才能到达最终的目标地址时,仍然得到同样的建议:乘坐某某线路列车到某车站以后再询问那里的工作人员。
于是,该乘客就按照每一个车站工作人员的指示,到达下一车站以后再继续询问车站的工作人员,得到类似的建议。
因此,即使乘客不知道其最终目的地的方向也没有关系。可以通过每到一个车站咨询工作人员的这种方法继续前进,也可以到达最终的目标地址。
IP数据包的传输也是如此。可以将旅行者看做IP数据包,将车站和工作人员看做路由器。当某个IP包到达路由器时,路由器首先查找其目标地址,从而再决定下一步应该将这个包发往哪个路由器,然后将包发送过去。当这个IP包到达那个路由器以后,会再次经历查找下一目标地址的过程,并由该路由器转发给下一个被找到的路由器。这个过程可能会反复多次,直到找到最终的目标地址将数据包发送给这个节点。
路由控制表
为了将数据包发给目标主机,所有主机都维护着一张路由控制表(Routing Table)。该表记录IP数据在下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输。如下图:
IP是实现多个数据链路之间通信的协议。数据链路根据种类的不同各有特点。对这些不同数据链路的相异特性进行抽象化也是IP的重要作用之一。数据链路的地址可以被抽象化为IP地址。因此,对IP的上一层来说,不论底层数据链路使用以太网还是无线LAN亦或是PPP,都将被一视同仁。
不同数据链路有个最大的区别,就是他们各自的最大传输单位不同。
IP面向无连接。即在发包之前,不需要建立与对端目标地址之间的连接。上层如果遇到需要发送给IP的数据,该数据会立即被压缩成IP包发送出去。
在面向有连接的情况下,需要事先建立连接。如果对端主机关机或不存在,也就不可能建立连接。反之,一个没有建立连接的主机也不可能发送数据过来。
而面向无连接的情况则不同。即使对端主机关机或不存在,数据包还是会被发送出去。反之,对于一台主机来说,它会何时从哪里收到数据也是不得而知的。通常应该进行网络监控,让主机只接收发给自己的数据包。若没有做好准备很有可能会错过一些该收的包。因此,在买你想无连接的方式下可能会有很多冗余的通信。
那么,为什么IP要采用面向无连接呢?
主要有两点原因:一是为了简化,而是为了提速。面向连接比起面向无连接处理相对复杂。甚至管理每个连接本身就是一个相当繁琐的事情。此外,每次通信之前都要事先建立连接,又会降低处理速度。需要有连接时,可以委托上一层提供此项服务。因此,IP为了实现简单化与高速化采用面向无连接的方式。
为了提高可靠性,上一层的TCP采用面向有连接型
IP提供尽力服务,意思是说“为了把数据包发送到最终目的地址,尽最大努力。”然而,它并不做“最终收到与否的验证”。IP数据包在图中可能会发生丢包、错位以及数据量翻倍等问题。如果发送端的数据未能真正发送到对端目标主机会造成严重的问题。例如,发送一封电子邮件,如果邮件内容中很重要的一部分丢失,会让收件方无法及时获取信息。
因此提高通信的可靠性很重要。TCP就提供这种功能。如果说IP只负责将数据发给目标主机,那么TCP则负责保证对端主机确实接收到数据。
那么,有人可能会提出疑问:为什么不让IP具有可靠传输的功能,从而把这两种协议合并到一起呢?
这其中的缘由就在于,如果要一种协议规定所有的功能和作用,那么该协议的具体实施和编程就会变得非常复杂,无法轻易实现。相比之下,按照网络分层,明确定义每层协议的作用和责任以后,针对每层具体的协议进行编程会更加有利于该协议的实现。
网络通信中如果能进行有效分层,就可以明确TCP与IP各自协议的最终目的,也有利于后续对这些协议进行扩展和性能上的优化。分层也简化了每个协议的具体实现。互联网能够发展到今天,与网络通信的分层密不可分。
在用TCP/IP通信时,用IP地址识别主机和路由器。为了保证正常通信,有必要为每个设备配置正确的IP地址。在互联网通信中,全世界都必须设定正确的IP地址。否则,根本无法实现正常的通信。
因此,IP地址就像是TCP/IP通信的一块基石。
IP地址(IPv4地址)由32位正整数来表示。TCP/IP通信要求将这样的IP地址分配给每一个参与通信的主机。IP地址在计算机内部以二进制方式被处理。然而,由于人类社会并不习惯于采用二进制方式,需要采用一种特殊的标记方式。那就是将32位的IP地址以每8位为一组,分成4组,每组以“.”隔开,再将每组数转换为十进制数。下面举例说明这一方法:
从这个计算结果可知,最多可以允许43亿台计算机连接到网络。
实际上,IP地址并非是根据主机台数来配置的,而是每一台主机上的每一块网卡(NIC)都得设置IP地址。通常一块网卡只设置一个IP地址,其实一块网卡也可以配置多个IP地址。此外,一台路由器通常都会配置两个以上的网卡,因此可以设置两个以上的IP地址。
因此,实际上连网的计算机肯定会比43亿台少很多,所以随着以后计算机的发展,越来越壮大,到时候IPv4肯定不能满足了,所以现在出现了IPv6正在逐渐的替代IPv4。
IP地址由网络和主机两部分标识组成
IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。
如上图所示,网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的“主机标识”则不允许在同一个网段内重复出现。
由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的IP地址都不会互相重叠。即IP地址具有了唯一性。
如上图所示,IP包被转发到途中某个路由器时,正是利用目标IP地址的网络标识进行路由。因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机。
那么,究竟从第几位开始到第几位算是网络标识,又从第几位开始到第几位算是主机标识呢?关于这点,有约定俗成的两种类型。最初二者以分类进行区别。而现在基本以子网掩码(网络前缀)区分。
IP地址的分类
IP地址分为四个级别,分别为A类、B类、C类、D类。它根据IP地址中从第1位到第4位的比特列对其网络标识和主机标识进行区分。
A类地址
A类IP地址是首位以“0”开头的地址。从第1位到第8位是它的网络标识。用十进制表示的话,就是0.0.0.0~127.0.0.0是A类的网络地址。A类地址的后24位相当于主机标识。因此,一个网段内可容纳的主机地址上限为11111111 11111111 11111111个,也就是16777214个。
B类地址
B类IP地址是前两位为“10”的地址,从第1位到第16位是它的网络标识。用十进制表示的话,128.0.0.0~191.255.0.0是B类的网络地址。B类地址的后16位相当于主机标识。因此,一个网段内可容纳的主机地址上限为11111111 11111111个,也就是65534个。
C类地址
C类IP地址是前三位为“110”的地址。从第1位到第24位是它的网络标识。用十进制表示的话,就是192.0.0.0~223.255.255.0是C类的网络地址。C类地址的后8位相当于主机标识。因此一个网段内可容纳的主机地址上限为11111111个,也就是254个。
D类地址
D类IP地址是前四位为“1110”的地址。从第1位到第32位是它的网络标识。用十进制表示的话,就是224.0.0.0~239.255.255.255是D类的网络地址。D类地址没有主机标识,常被用于多播。
关于分配IP主机地址的注意事项
在分配IP地址时关于主机标识有一点需要注意。即要用比特位表示主机地址时,不可以全部为0或全部为1。因为全部为只有0在表示对应的网络地址或IP地址不可获知的情况下才使用。而全部为1的主机地址通常作为广播地址。
因此,在分配过程中,应该去掉这两种情况。这也是为什么C类地址每个网段最多只能有254(2的八次方减2)个主机地址的原因。
发送数据包时所使用的地址是网络层的地址,即IP地址。然而仅仅有IP地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表(Routing Table)。实现IP通信的主机和路由器都必须持有一张这样的表。他们也正是在这个表格的基础上才得以进行数据包发送的。
该路由控制表的形成方式有两种:一种是管理员手动设置,另一种是路由器与其它路由器相互交换信息时自动刷新。前者也叫静态路由控制,而后者叫做动态路由控制。为了让动态路由及时刷新路由表,在网络上互连的路由器之间必须设置好路由协议,保证正常读取路由控制信息。
IP协议始终认为路由表是正确的。然而,IP本身并没有定义制作路由控制表的协议。即IP没有制作路由控制表的机制。该表是由一个叫做“路由协议”(这个协议有别于IP)的协议制作而成。
IP地址与路由控制
IP地址的网络地址部分用于进行路由控制,如下图即发送IP包的示例:
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。所谓最为吻合是指相同位数最多的意思。
默认路由
如果一张路由表中包含所有的网络及其子网的信息,将会造成无端的浪费。这时,默认路由是不错的选择。默认路由是指路由表中任何一个地址都能与之匹配的记录。
默认路由一般标记为0.0.0.0/0或default。这里的0.0.0.0/0并不是指IP地址是0.0.0.0。由于后面是“/0”,所以并没有标识IP地址。它只是为了避免人们误以为0.0.0.0是IP地址。有时默认路由也被标记为default,但是在计算机内部和路由协议的发送过程中还是以0.0.0.0/0进行处理。
环回地址
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。计算机使用一个特殊的IP地址127.0.0.1作为环回地址。与该地址具有相同意义的是一个叫做localhost的主机名。使用这个IP或主机名时,数据包不会流向网络。
IP报文的分片与重组
任何一台主机都有必要对IP分片(IP Fragmentation)进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。
如下图就展示了一个网络传输过程中进行分片处理的一个例子,如下图:
由于以太网的默认MTU是1500字节,因此4342字节的IP数据报无法在一个帧当中发送完成。这时,路由器将此IP数据报划分成了3个分片进行发送。而这种分片处理只要路由器认为有必要,会周而复始地进行。
经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。
这样的处理是由诸多方面的因素造成的。例如,现实当中无法保证IP数据报是否经由同一个路径传送。因此,途中即使等待片刻,数据包也有可能无法到达目的地。此外,拆分之后的每个分片也有可能会在途中丢失。即使在途中某一处被重新组装,但如果下一站再经过其他路由时还会面临被分片的可能。这会给路由器带来多余的负担,也会降低网络传送效率。出于这些原因,在终结点(目标主机)端重组分片了的IP数据报成为现行的规范。
IPv6的必要性
IPv6(IP version 6)是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议。IPv4的地址长度为4个8位字节,即32比特。而IPv6的地址长度则是原来的4倍,即128比特,一般写成8个16位字节。
从IPv4切换到IPv6极其耗时,需要将网络中所有主机和路由器的IP地址进行重新设置。当互联网广泛普及后,替换所有IP地址会是更为艰巨的任务。
也是出于上述原因,IPv6不仅仅能解决IPv4地址耗尽的问题,它甚至试图弥补IPv4中的绝大多数缺陷。目前,人们正着力于进行IPv4与IPv6之间的相互通信与兼容性方面的测试。