3.3.5 找不到匹配路由时选择默认路由
不是所有的转发目标都需要配置在路由表中
如果是公司或者家庭网络,这样的做法也没什么问题,但互联网中的转发目标可能超过 20 万个,如果全部要配置在路由表中实在是不太现实。
其中有一行子网掩码为 0.0.0.0,意思是网络包接收方 IP 地址和路由表目标地址的匹配中需要匹配的比特数为 0,换句话说,就是根本不需要匹配。
只要将子网掩码设置为 0.0.0.0,那么无论任何地址都能匹配到这一条记录,这样就不会发生不知道要转发到哪里的问题了。
只要在这一条记录的网关列中填写接入互联网的路由器地址,当匹配不到其他路由时,网络包就会被转发到互联网接入路由器。
默认路由和默认网关
因此这条记录被称为默认路由,这一行配置的网关地址被称为默认网关。
在计算机的TCP/IP 设置窗口中也有一个填写默认网关的框,意思是一样的。
计算机上也有一张和路由器一样的路由表,其中默认网关的地址就是我们在设置窗口中填写的地址。
路由表中子网掩码为 0.0.0.0 的记录表示“默认路由”。
由于匹配的比特数越长优先级越高(最长匹配原则),因此子网掩码为0.0.0.0 的记录优先级是最低的,只有当找不到其他匹配的记录时,才会选择这条记录。
3.3.6 包的有效期
更新生存时间TTL字段防止包进入死循环
在网络包被转交给输出端口之前,路由器还需要更新 IP 头部中的 TTL 字段。
TTL 字段表示包的有效期,包每经过一个路由器的转发,这个值就会减 1,当这个值变成 0 时,就表示超过了有效期,这个包就会被丢弃。
这个机制是为了防止包在一个地方陷入死循环,如果其中的信息有问题,或者由于设备故障等原因切换到备用路由时导致暂时性的路由混乱,就会出现这样的情况。
发送方在发送包时会将 TTL 设为 64 或 128,也就是说包经过这么多路由器后就会“寿终正寝”。
现在的互联网即便访问一台位于地球另一侧的服务器,最多也只需要经过几十个路由器,因此只要包被正确转发,就可以在过期之前到达目的地。
3.3.7 通过分片功能拆分大网络包
路由器端口支持多种通信技术
路由器的端口并不只有以太网一种,也可以支持其他局域网或专线通信技术。
不同的线路和局域网类型各自能传输的最大包长度也不同,因此输出端口的最大包长度可能会小于输入端口。
即便两个端口的最大包长度相同,也可能会因为添加了一些头部数据而导致包的实际长度发生变化。
无论哪种情况,一旦转发的包长度超过了输出端口能传输的最大长度,就无法直接发送这个包了。
IP协议对超过端口输出数据最大长度的包进行分切
遇到这种情况,可以使用 IP 协议中定义的分片功能对包进行拆分,缩短每个包的长度。
需要注意的是,这里说的分片和第 2 章介绍的 TCP 对数据进行拆分的机制是不同的。
IP分切包和TCP拆分数据的不同
TCP 拆分数据的操作是在将数据装到包里之前进行的,换句话说,拆分好的一个数据块正好装进一个包里。
从 IP 分片的角度来看,这样一个包其实是一个未拆分的整体,也就是说,分片是对一个完整的包再进行拆分的过程。
分片操作的过程如图 3.15 所示。首先,我们需要知道输出端口的MTU,看看这个包能不能不分片直接发送。
最大包长度是由端口类型决定的,用这个最大长度减掉头部的长度就是 MTU,将 MTU 与要转发的包长度进行比较。
如果输出端口的 MTU 足够大,那么就可以不分片直接发送;如果输出端口的 MTU 太小,那么就需要将包按照这个 MTU 进行分片。
先查询IP头中标志字段能否分片
在此之前需要看一下 IP 头部中的标志字段,确认是否可以分片。
如果不能分片那么就丢弃这个包,并通过ICMP 消息通知发送方。否则,就可以按照输出端口 MTU 对数据进行依次拆分。
下面两种情况不能分片
①发送方应用程序等设置了不允许分片
②这个包已经是经过分片后的包
TCP头部和数据一起被拆分
在分片中,TCP 头部及其后面的部分都是可分片的数据,尽管TCP 头部不属于用户数据,但从 IP 来看也是 TCP 请求传输的数据的一部分。
数据被拆分后,每一份数据前面会加上 IP 头部,其大部分内容都和原本的 IP 头部一模一样,但其中有部分字段需要更新,这些字段用于记录分片相关的信息。
3.3.8 路由器的发送操作和计算机相同
包的发送操作
根据不同输出端口转换信号
这一步操作取决于输出端口的类型。如果是以太网端口,则按照以太网的规则将包转换为电信号发送出去;如果是 ADSL 则按照 ADSL 的规则来转换,以此类推。
在家庭网络中,路由器后面一般连接 ADSL 等线路接入互联网,因此路由器会根据接入网的规则来发送包。
不过,要理解具体的操作过程,需要先理解相应的通信线路,比较复杂,因此我们留到下一章探索互联网内部时再讲解。
以太网发送包的过程
假设路由器位于公司等局域网的内部,即输出端口也是以太网,看看这种情况是如何操作的。
以太网的包发送操作是根据以太网规则来进行的,即便设备种类不同,规则也是相同的。
也就是说,其基本过程和协议栈中的 IP 模块发送包的过程是相同的,即在包前面加上 MAC 头部,设置其中的一些字段,然后将完成的包转换成电信号并发送出去。
查询路由表
首先,为了判断 MAC 头部中的 MAC 地址应该填写什么值,我们需要根据路由表的网关列判断对方的地址。
如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址;如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址。
路由器判断下一个转发目标的方法
①如果路由表的网关列内容为 IP 地址,则该地址就是下一个转发目标。
②如果路由表的网关列内容为空,则 IP 头部中的接收方 IP 地址就是下一个转发目标。
根据IP使用ARP查询MAC
知道对方的 IP 地址之后,接下来需要通过 ARP 根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方MAC 地址。
路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。
路由器也会使用 ARP 来查询下一个转发目标的 MAC 地址。
接下来是发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0080(十六进制)。
将数字信息转成电信号发送
网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。
如果以太网工作在半双工模式,需要先确认线路中没有其他信号后才能发送,如果检测到碰撞,则需要等待一段时间后重发。
如果以太网工作在全双工模式,不需要确认线路中的信号,可以直接发送。
网络包到达下一个路由器
如果输出端口为以太网,则发送出去的网络包会通过交换机到达下一个路由器。
由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。
接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。
3.3.9 路由器与交换机的关系
将IP包装进以太网包的数据部分委托以太网传输
计算机在发送网络包时,或者是路由器在转发网络包时,都需要在前面加上 MAC 头部,准确的说法应该是将 IP 包装进以太网包的数据部分中。
给包加上 MAC 头部并发送,从本质上说是将 IP 包装进以太网包的数据部分中,委托以太网去传输这些数据。
IP 协议本身没有传输包的功能,因此包的实际传输要委托以太网来进行。
路由器是基于 IP 设计的,而交换机是基于以太网设计的,因此 IP 与以太网的关系也就是路由器与交换机的关系。
换句话说,路由器将包的传输工作委托给交换机来进行。
除了使用交换机,还可以使用集线器,或者用交叉双绞线直接连接到路由器端口都可以。
关键是,在委托传输时,只要能按照以太网规则传输包,不管是什么样的设备都可以。
当然,这里讲的内容只适用于原原本本实现 IP 和以太网机制的纯粹的路由器和交换机,实际的路由器有内置交换机功能的。
比如用于连接互联网的家用路由器就属于这一种,对于这种路由器,上面内容可能就不适用了。
但是,如果把这种“不纯粹”的路由器拆分成“纯粹”的路由器和“纯粹”的交换机,则它们各自都适用上面的内容。
IP委托以太网传输到下一个路由器
从包的转发目标也可以看出路由器和交换机之间的委托关系。
IP 并不是委托以太网将包传输到最终目的地,而是传输到下一个路由器。
ARP查询的就是下一个路由器的MAC地址
在创建MAC 头部时,也是从 IP 的路由表中查找出下一个路由器的 IP 地址,并通过 ARP 查询出 MAC 地址,然后将 MAC 地址写入 MAC 头部中的。
这表示 IP 对以太网的委托只是将包传输到下一个路由器就行了。
当包到达下一个路由器后,下一个路由器又会重新委托以太网将包传输到再下一个路由器。
随着这一过程反复执行,包就会最终到达 IP 的目的地,也就是通信的对象。
到这里我们已经梳理了路由器与交换机之间的关系。
简单来说,IP(路由器)负责将包发送给通信对象这一整体过程,而其中将包传输到下一个路由器的过程则是由以太网(交换机)来负责的。
IP不负责包的传输只委托其他协议到下一个路由器
如果和下一个路由器之间是通过无线局域网连接的,那么就委托无线局域网将包传输过去;
如果是通过互联网线路连接的,那么就委托它将包传输过去。
除了这里列举的例子之外,世界上还有很多其他类型的通信技术,它们之间的关系也是一样的,都是委托所使用的通信技术将包传输过去。
IP 本身不负责包的传输,而是委托各种通信技术将包传输到下一个路由器。
这样的设计是有重要意义的,即可以根据需要灵活运用各种通信技术,这也是 IP 的最大特点。
正是有了这一特点,我们才能够构建出互联网这一规模巨大的网络。