目录
1.IP层的作用
2.主机和节点
3.网络层和数据链路层的关系
4.路由控制
4.1.路由控制的过程
4.2. IP地址与路由控制
4.3.路由控制表的聚合
4.4.静态路由和动态路由
4.5.动态路由的基础
5.数据链路的抽象化
5.1.数据链路不同,MTU则相异
5.2.路径MTU发现
6.IP属于面向无连接型
1.IP层的作用
IP(IPv4、IPv6)相当于OSI参考模型中的第3层--网络层。网络层的主要作用是“实现终端节点之间的通信”。
这种终端节点之间的通信也叫“点对点(end-to-end)通信”。
网络层的下一层--数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。
网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。
2.主机和节点
在互联网世界中,将那些配有IP地址的设备叫做“主机”。这里的主机可以是超大型计算机,也可以是小型计算机。这是因为互联网在当初刚发明的时候,只能连接这类大型的设备,因此习惯上就将配有IP地址的设备称为“主机”
然而,准确地说,主机的定义应该是指“配置有IP地址,但是不进行路由控制"的设备”。既配有IP地址又具有路由控制能力的设备叫做“路由器”,跟主机有所区别。而节点则是主机和路由器的统称
3.网络层和数据链路层的关系
数据链路层提供直连两个设备之间的通信功能。与之相比,作为网络层的IP则负责在没有直连的两个网络之间进行通信传输。那么为什么一定需要这样的两个层次呢?它们之间的区别又是什么呢?
在此,我们以旅行为例说明这个问题。有个人要去一个很远的地方旅行,并且计划先后乘坐飞机、火车、公交车到达目的地。为此,他决定先去旅行社购买机票和火车票。
旅行社不仅为他预订好了旅途过程中所需要的机票和火车票,甚至为他制定了一个详细行程表,详细到几点几分需要乘坐飞机或火车都一目了然。
当然,机票和火车票只有特定区间"内有效,当你换乘不同公司的飞机或火车时,还需要重新购票。
仔细分析一下机票和火车票,不难发现,每张票只能够在某一限定区间内移动。此处的“区间内”就如同通信网络上的数据链路。而这个区间内的出发地点和目的地点就如同某一个数据链路的源地址和目标地址等首部信息"。整个全程的行程表的作用就相当于网络层。
如果我们只有行程表而没有车票,就无法搭乘交通工具到达目的地。反之如果除了车票其他什么都没有,恐怕也很难到达目的地。因为你不知道该坐什么车,也不知道该在哪里换乘。因此,只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证到达目的地。与之类似,计算机网络中也需要数据链路层和网络层这个分层才能实现向最终目标地址的通信。
4.路由控制
4.1.路由控制的过程
路由控制(Routing)是指将分组数据发送到最终目标地址的功能。
即使网络非常复杂,也可以通过路由控制确定到达目标地址的通路。
一旦这个路由控制的运行出现异常,分组数据极有可能“迷失”,无法到达目标地址。
因此,一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。
Hop译为中文叫“跳”。它是指网络中的一个区间。IP包正是在网络中一个个跳间被转发。因此IP路由也叫做多跳路由。在每一个区间内决定着包在下一跳被转发的路径。
- 一跳的范围
一跳(1 Hop)是指利用数据链路层以下分层的功能传输数据的一个区间。
以太网等数据链路中使用MAC地址传输数据帧。此时的一跳是指从源MAC地址到目标MAC地址之间传输帧的区间。也就是说它是主机或路由器网卡不经其他路由器而能直接到达的相邻主机或路由器网卡之间的一个区间。
在一跳的这个区间内,电缆可以通过网桥或交换集线器相连,不会通过路由器或网关相连
多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全都指定出来。因为每一个区间(跳)生转发IP数据包时会分别指定下一跳的操作,直至包达到最终的目标地址。
如图,以乘坐火车旅游为例具体说明。
在前面的例子中,虽然已经确定了最终的目标车站,但是一开始还是不知道如何换乘才能到达这个终极目标地址。因此,工作人员给出的方法是首先去往最近的一个车站,再咨询这一车站的工作人员。而到了这个车站以后再询问工作人员如何才能达到最终的目标地址时,仍然得到同样的建议:乘坐某某线列车到某某车站以后再询问那里的工作人员。
于是,该乘客就按照每一个车站工作人员的指示,到达下一车站以后再继续询问车站的工作人员,得到类似的建议。
因此,即使乘客不知道其最终目的地的方向也没有关系。可以通过每到一个车站咨询工作人员的这种极其偶然"的方法继续前进,也可以到达最终的目标地址。
IP数据包的传输亦是如此。可以将旅行者看做IP数据包,将车站和工作人员看做路由器。当某个IP包到达路由器时,路由器首先查找其目标地址(IP 包被转发到途中的某个路由器时,实际上是装入数据链路层的数据帧以后再被送出。以以太网为例,目标 MAC地址就是下一个路由器的MAC地址。),从而再决定下一步应该将这个包发往哪个路由器,然后将包发送过去。当这个P包到达那个路由器以后,会再次经历查找下一目标地址的过程,并由该路由器转发给下一个被找到的路由器。这个过程可能会反复多次,直到找到最终的目标地址将数据包发送给这个节点。
这里还可以用快递的送货方式来打比方。IP数据包犹如包裹,而送货车犹如数据链路。包裹不可能自己移动,必须有送货车承载转运。而一辆送货车只能将包裹送到某个区间范围内。每个不同区间的包裹将由对应的送货车承载、运输。IP的工作原理也是如此。
- 路由控制表
为了将数据包发给目标主机,所有主机都维护着一张路由控制表(RoutingTable)。该表记录IP数据在下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输。
4.2. IP地址与路由控制
发送数据包时所使用的地址是网络层的地址,即IP地址。然而仅仅有IP地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。
保存这种信息的就是路由控制表(RoutingTable)。实现IP通信的主机和路由器都必须持有一张这样的表。它们也正是在这个表格的基础上才得以进行数据包发送的。
该路由控制表的形成方式有两种:一种是管理员手动设置,另一种是路由器与其他路由器相互交换信息时自动刷新。前者也叫静态路由控制,而后者叫做动态路由控制。为了让动态路由及时刷新路由表,在网络上互连的路由器之间必须设置好路由协议,保证正常读取路由控制信息。
IP协议始终认为路由表是正确的。然而,IP本身并没有定义制作路由控制表的协议。即IP没有制作路由控制表的机制。该表是由一个叫做“路由协议”(这个协议有别于IP)的协议制作而成。
IP地址的网络地址部分用于进行路由控制。下图即发送IP包的示例。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。
在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。
如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。所谓最为吻合是指相同位数最多的意思
例如172.20.100.52的网络地址与172.20/16和172.20.100/24 两项都匹配。此时,应该选择匹配度最长的172.20.100/24。此外,如果路由表中下一个路由器的位置记录着某个主机或路由器网卡的IP地址,那就意味着“发送的目标地址属于同一个链路”
- 默认路由
如果一张路由表中包含所有的网络及其子网的信息,将会造成无端的浪费。这时,默认路由(Default Route)是不错的选择。
默认路由是指路由表中任何一个地址都能与之匹配的记录。
默认路由一般标记为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地址/32”也被称为主机路由(Host Route)。例如,192.168.153.15/32就是一种主机路由。它的意思是整个正P地址的所有位都将参与路由。进行主机路由,意味着要基于主机上网卡上配置的IP地址本身,而不是基于该地址的网络地址部分进行路由。
主机路由多被用于不希望通过网络地址路由的情况
- 环回地址
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。计算机使用一个特殊的PP地址127.0.0.1作为环回地址。与该地址具有相同意义的是一个叫做localhost的主机名。使用这个正或主机名时,数据包不会流向网络。
4.3.路由控制表的聚合
利用网络地址的比特分布可以有效地进行分层配置。对内即使有多个子网掩码,对外呈现出的也是同一个网络地址。这样可以更好地构建网络,通过路由信息的聚合可以有效地减少路由表的条目
如图所示,在聚合之前需要6条路由记录,聚合之后只需要2条记录。
能够缩小路由表的大小是它最大的优势。路由表越大,管理它所需要的内存和CPU也就越多。并且查找路由表的时间也会越长,导致转发数据包的性能下降。如果想要构建大规模、高性能网络,则需要尽可能削减路由表的大小。
而且路由聚合可以将已知的路由信息传送给周围其他的路由器,以达到控制路由信息的目的。图中的例子中路由器C正是将已知192.168.2.0/24与192.168.3.0/24的网络这一信息聚合成为对“192.168.2.0/23的网络也已知”从而进行公示。
4.4.静态路由和动态路由
互联网是由路由器连接的网络组合而成的。为了能让数据包正确达地到达目标主机,路由器必须在途中进行正确地转发。这种向“正确的方向”转发数据所进行的处理就叫做路由控制或路由。
路由器根据路由控制表(RoutingTable)转发数据包。它根据所收到的数据包中目标主机的IP地址与路由控制表的比较得出下一个应该接收的路由器。
因此,这个过程中路由控制表的记录一定要正确无误。但凡出现错误,数据包就有可能无法到达目标主机。
那么,是谁又是怎样制作和管理路由控制表的呢?路由控制分静态"和动态两种类型。
静态路由是指事先设置好路由器和主机中并将路由信息固定的一种方法。而动态路由是指让路由协议在运行过程中自动地设置路由控制信息的一种方法。这些方法都有它们各自的利弊。
静态路由的设置通常是由使用者手工操作完成的。例如,有100个IP网的时候,就需要设置近100个路由信息。并且,每增加一个新的网络,就需要将这个新被追加的网络信息设置在所有的路由器上。因此,静态路由给管理者带来很大的负担,这是其一。还有一个不可忽视的问题是,一旦某个路由器发生故障,基本上无法自动绕过发生故障的节点,只有在管理员手工设置以后才能恢复正常。
使用动态路由的情况下,管理员必须设置好路由协议,其设定过程的复杂程度与具体要设置路由协议的类型有直接关系。
例如在RIP的情况下,基本上无需过多的设置。而根据OSPF进行较详细路由控制时,设置工作将会非常繁琐。如果有一个新的网络被追加到原有的网络中时,只要在新增加网络的路由器上进行一个动态路由的设置即可。而不需要像静态路由那样,不得不在其他所有路由器上进行修改。对于路由器个数较多的网络,采用动态路由显然是一个能够减轻管理员负担的方法。
况且,网络上一旦发生故障,只要有一个可绕的其他路径,那么数据包就会自动选择这个路径,路由器的设置也会自动重置。路由器为了能够像这样定期相互交换必要的路由控制信息,会与相邻的路由器之间互发消息。这些互换的消息会给网络带来一定程度的负荷。
不论是静态路由还是动态路由,不要只使用其中一种,可以将它们组合起来使用。
4.5.动态路由的基础
动态路由如图所示,会给相邻路由器发送自己已知的网络连接信息,而这些信息又像接力一样依次传递给其他路由器,直至整个网络都了解时,路由控制表也就制作完成了。而此时也就可以正确转发数据包了
5.数据链路的抽象化
IP是实现多个数据链路之间通信的协议。
数据链路根据种类的不同各有特点。
对这些不同数据链路的相异特性进行抽象化也是的重要作用之一。
数据链路的地址可以被抽象化为IP地址。
因此,对IP的上一层来说,不论底层数据链路使用以太网还是无线LAN亦或是PPP,都将被一视同仁。
不同数据链路有个最大的区别,就是它们各自的最大传输单位(MTU:Maxi-mum Transmission Unit)不同。就好像人们在邮寄包裹或行李时有各自的大小限制一样。下图中展示了很多运输公司在运送包裹时所限定的包裹大小。
MIU的值在以太网中是1500字节,在FDDI中是4352字节,而ATM则为9180字节。IP的上一层可能会要求传送比这些MTU更多字节的数据,因此必须在线路上传送比包长还要小的MTU。
为了解决这个问题,IP进行分片处理(IPFragmentation)。顾名思义,所谓分片处理是指,将较大的IP包分成多个较小的IP包"。分片的包到了对端目标地址以后会再被组合起来传给上一层。
即从IP的上层看,它完全可以忽略数据包在途中的各个数据链路上的MTU,而只需要按照源地址发送的长度接收数据包。IP就是以这种方式抽象化了数据链路层,使得从上层更不容易看到底层网络构造的细节。
5.1.数据链路不同,MTU则相异
每种数据链路的最大传输单元(MTU)都不尽相同。
下表列出了很多不同的链路及其MTU。每种数据链路的MTU之所以不同是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的MTU也就不同。
鉴于IP属于数据链路上一层,它必须不受限于不同数据链路的MTU大小。如上所述,IP 抽象化了底层的数据链路。
任何一台主机都有必要对IP分片(IPFragmentation)进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。
下图展示了网络传输过程中进行分片处理的一个例子。
由于以太网的默认MTU是1500字节,因此4342字节的IP数据报无法在一个当中发送完成。这时,路由器将此IP数据报划分成了3个分片进行发送。而这种分片处理只要路由器认为有必要,会周而复始地进行"。
经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。
这样的处理是由诸多方面的因素造成的。例如,现实当中无法保证PP数据报是否经由同一个路径传送。因此,途中即使等待片刻,数据包也有可能无法到达目的地。此外,拆分之后的每个分片也有可能会在途中丢失"。即使在途中某一处被重新组装,但如果下一站再经过其他路由时还会面临被分片的可能。这会给路由器带来多余的负担,也会降低网络传送效率。出于这些原因,在终结点(目标主机)端重组分片了的IP数据报成为现行的规范。
5.2.路径MTU发现
分片机制也有它的不足。首先,路由器的处理负荷加重。随着时代的变迁,计算机网络的物理传输速度不断上升。这些高速的链路,对路由器和计算机网络提出了更高的要求。另一方面,随着人们对网络安全的要求提高,路由器需要做的其他处理也越来越多,如网络过滤"等。因此,只要允许,是不希望由路由器进行IP数据包的分片处理的。
其次,在分片处理中,一旦某个分片丢失,则会造成整个P数据报作废。为了避免此类问题,TCP的初期设计还曾使用过更小"的分片进行传输。其结果是网路的利用率明显下降。
为了应对以上问题,产生了一种新的技术“路径MTU发现”(PahMTUDis-covery)。
所谓路径 MTU(Path MTU)是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小。即路径中存在的所有数据链路中最小的MTU。
而路径MTU发现从发送主机按照路径MTU的大小将数据报分片后进行发送。进行路径MTU发现,就可以避免在中途的路由器上进行分片处理,也可以在TCP中发送更大的包。现在,很多操作系统都已经实现了路径MTU发现的功能。
路径MTU发现的工作原理如下:
首先在发送端主机发送IP数据报时将其首部的分片禁止标志位设置为1。根据这个标志位,途中的路由器即使遇到需要分片才能处理的大包,也不会去分片而是将包丢弃。随后,通过一个ICMP的不可达消息将数据链路上MTU的值给发送主机”
下一次,从发送给同一个目标主机的IP数据报获得ICMP所通知的 MTU 值以后,将它设置为当前MTU。发送主机根据这个MTU对数据报进行分片处理。如此反复,直到数据报被发送到目标主机为止没有再收到任何ICMP,就认为最后一次ICMP所通知的MTU即是一个合适的MTU值。那么,当MTU的值比较多时最少可以缓存约10分钟。在这10分钟内使用刚刚求得的MTU,但过了这10分钟以后则重新根据链路上的 MTU 做一次路径 MTU 发现。
前面是UDP的例子。那么在TCP的情况下,根据路径MTU的大小计算出最大段长度(MSS),然后再根据这些信息进行数据报的发送。因此,在TCP中如果采用路径MTU发现,IP层则不会再进行分片处理。
6.IP属于面向无连接型
IP面向无连接。
即在发包之前,不需要建立与对端目标地址之间的连接。上层如果遇到需要发送给IP的数据,该数据会立即被压缩成IP包发送出去。
在面向有连接的情况下,需要事先建立连接。如果对端主机关机或不存在也就不可能建立连接。反之,一个没有建立连接的主机也不可能发送数据过来。而面向无连接的情况则不同。即使对端主机关机或不存在,数据包还是会被发送出去。反之,对于一台主机来说,它会何时从哪里收到数据也是不得而知的。通常应该进行网络监控,让主机只接收发给自己的数据包。若没有做好准备很有可能会错过一些该收的包。因此,在面向无连接的方式下可能会有很多冗余的通信。
- 那么,为什么IP要采用面向无连接呢?
主要有两点原因:一是为了简化,二是为了提速。面向连接比起面向无连接处理相对复杂。甚至管理每个连接本身就是一个相当繁琐的事情。此外,每次通信之前都要事先建立连接,又会降低处理速度。需要有连接时,可以委托上一层提供此项服务。因此,IP为了实现简单化与高速化采用面向无连接的方式。
- IP是面向无连接的,那谁来保证可靠性呢?
为了提高可靠性,上一层的TCP 采用面向有连接型
IP提供尽力服务,意指“为了把数据包发送到最终目标地址,尽最大努力。”然而,它并不做“最终收到与否的验证”。IP数据包在途中可能会发生丢包、错位以及数据量翻倍等问题。如果发送端的数据未能真正发送到对端目标主机会造成严重的问题。例如,发送一封电子邮件,如果邮件内容中很重要的一部分丢失,会让收件方无法及时获取信息。
因此提高通信的可靠性很重要。TCP就提供这种功能。如果说IP只负责将数据发给目标主机,那么TCP则负责保证对端主机确实接收到数据。
那么,有人可能会提出疑问:为什么不让IP具有可靠传输的功能从而把这两种协议合并到一起呢?
这其中的缘由就在于,如果要一种协议规定所有的功能和作用,那么该协议的具体实施和编程就会变得非常复杂,无法轻易实现。相比之下,按照网络分层,明确定义每层协议的作用和责任以后,针对每层具体的协议进行编程会更加有利于该协议的实现。
网络通信中如果能进行有效分层,就可以明确TCP与IP各自协议的最终目的,也有利于后续对这些协议进行扩展和性能上的优化。分层也简化了每个协议的具体实现。互联网能够发展到今天,与网络通信的分层密不可分。