《图解TCP/IP》
4.4 路由控制
昨儿谈完了IP地址的一部分情况,今天就该聊聊路由控制了。
知道了各小区,每家每户的门牌号是怎么定义的,那接下来就要知道如何走到各家各户门前,再把邮件放入邮箱里了。
联系到现实,就有搬家和不搬家两种。
不搬家的情况,叫做静态路由控制,需要管理员手动设置。
而搬家的情况,则叫做动态路由控制,需要路由器具有与其他路由器相互交换信息、自动刷新的能力。
IP协议始终认为路由表是正确的,即我只负责寄邮件出去,路由表本身是由“路由协议”制作而成。
一个数据包转发的过程如下图所示。根据主机与路由器之间的IP地址,和路由器中路由表记录的下一个路由器的IP地址,最终将数据包发送到目标地址。
简而言之,路由表记录了网络标识(网络地址),和下一步应该发送到路由器的地址。发送数据包时,根据在IP首部中解析到的目标地址,与路由表中的网络地址进行匹配,匹配上了就发送给下一个路由器IP地址。如果存在多条相同网络地址,那么就选择匹配度最高的(指相同位数最多)。
路由表并不适合记录所有的网络和其子网的信息,这样一个是不利于匹配,二是将占据大量的路由器内存,造成无端的浪费(因为实际中根本不会用到那么多)。所以有个默认路由,使得所有的地址都可以与之匹配,就是一个不错的选择。默认了路由一般被记为0.0.0.0/0
或者是default
。
还有一个概念叫做主机路由,通常格式为IP地址/32
,意思是32位全部参与路由,就意味着要基于主机网卡上配置的IP地址本身,而不是给予改地址的网络地址部分进行路由。主机路由多用于不希望通过网络地址路由的情况(如果主机路由用的多了,那么会导致路由表膨胀)。
接下来要说的一个概念,在搭建服务器的时候用的很多,那就是环回地址,我更觉得叫本地地址会更加合适一些。127.0.0.1
这个地址,将伴随进行流媒体学习道路的我终生。在本地开启服务器状态时,这个具体的数值也可以用localhost
来代替。使用这个IP时,数据包并不会流向网络,而是在本地进行环回。
刚刚谈了一些路由类型,那么接下来就要谈谈路由控制表,对于这些路由类型,是如何通过聚合,缩减路由表大小的。
这里有一个例子,红色的部分,原本一共有六条,聚合后就只有两条蓝色的网络地址。
此处再次谈及到为什么要控制路由表的大小。事实上,可以缩小,是路由表最大的优势(和谁比较?)。路由表越大,管理所需的内存和CPU也就越多,查找路由标的时间也会越长,导致转发数据包的性能下降。构筑大规模,高性能的网络,需要尽可能的减小路由表的大小。
不仅如此,路由聚合可以将一致的路由信息传送给周围其他的路由器,已达到控制路由信息的目的。
4.5 IP分割处理和再构成处理
之前讲过,网络层要应付数据链路层不同时,可传递的MTU大小不同的情况。
所以IP抽象化了底层的数据链路。
例如下图所示,4352字节的数据报无法一次性发送,所以路由器将该数据报划分成了3个分片进行发送。这种分片的处理,全权由路由器决定,如果有必要,就会周而复始的进行(以8字节的倍数为单位进行)。
而分片在重组时,只能有目标主机进行。路由器不会干这事儿。再者说了,啥都让路由器来干,有些欺负器的意思。
那么就必然要考虑一个问题,原本发送一个数据报,现在要发送三个,相当于路由器要给三段数据寻址。刚刚说了,最好别欺负器,因为随着时代的发展,计算机网络的传输速度不断提升,对路由器和网络的传输和数据处理能力要求更高。在安全方面上的处理,也越来越多。所以,如果允许,不希望路由器进行IP数据包的分片处理。
其次,如果一个片丢了,那么整个IP数据报就作废了。这是很不希望发生的。
为了应对以上问题,产生了一种新的技术,叫做“路径MTU发现”,指从发送端到接收端主机之间,不需要分片时,最大的MTU大小,也就是求路径中,所有数据链路中最小的MTU。主机就会按照这个最小值,进行数据发送。使用路径MTU发现,避免了在中途的路由器上进行分片处理,也可以在TCP中发送更大的包。
这个技术工作的原理是:
先将IP数据报分片禁止标志位设置为1.
这样即使遇到需要分片才能处理的大数据包,也不会分片,而是将包丢弃。随后,通过一个ICMP的不可达消息(应该说的是ICMP中消息的某一类吧),将数据链路上的MTU值发给主机。
下一回,由于上一次已经得到了MTU值,所以发送主机会根据这个数值进行分片处理,如此反复,直到数据包被发送到目标主机为止再也没有收到任何ICMP,就可以认为ICMP通知的MTU是一个合适的MTU。
由于网络传输路径不止一条,所以主机会缓存MTU的值,大概10分钟左右。过了缓存期之后,就要根据链路上的MTU再做一次路径MTU发现。
下图是UDP时的情况。
而当传输协议为TCP的时候,会根据收集到的路径MTU计算出来最大段长度(MSS),然后再根据这些信息进行数据报的发送,就不用再进行IP分片了。
下图为TCP时的情况。