网络层
网络层概述
家用无线路由器组网示意图
通过ADSL或者FTTx与ISP相连
网络层提供不可靠的传输服务
面向连接
先建立起虚电路(Virtual Circuit)通过虚电路的存储转发搭配可靠的协议建立起可靠的服务。
无连接的数据报服务
因为计算机本身有强大的计算功能,因此完全可以将可靠的传输交给终端主机本身去做,网络层设计得尽量简单,向上提供简单的,无连接的,尽最大努力交付的数据报服务(datagram/packet) 不保证分组一定到达,到达也不保证顺序就是发送的顺序。
网络层的两个层面
- 控制层面:负责维护路由表,和其他路由节点进行路由数据交互。典型协议就是各种路由选择协议(OSPF、BGP)
- 数据层面:负责根据路由表将 分组/数据报 转发到其他路由器。典型协议就是IP
- SDN:软件定义网络,将控制层面用一个远程控制器实现,路由器只需要做转发数据报的工作就可以了。
IP(Internet Protocol)
各个局域网通过路由器相互连接称为一个虚拟的互联网,internet
IP 地址
IPv4 32位 有网络号和主机号两个部分,网络号唯一标识互联网中的一个网络,主机号表示网络中的一台设备(网络号+主机号才能唯一确定一台设备)
ABC 分类地址
网络号分别是前8位,前16位,前24位,随着互联网用户暴涨,固定的分类方法显然已经无法满足需求。
无类别域间路由(Classless Inter-Domain Routing,==CIDR==)
- 不采用固定分类的做法,把网络前缀的位数放到最后。
- 网络前缀完全相同的处于同一个CIDR地址块中。
- 128.14.35.7/20 表示网络号是前20位。
- 原先的分类地址法只能分出3级8/16/24,较为死板和浪费,B类地址也无法表示C类地址,导致路由表的膨胀。
1 | 192.168.0.0/24 |
- 路由聚合:这3个地址块可以用192.168.0.0/22概括起来,多个子网的地址具有相同的前缀,便于聚合。
子网掩码(subnet mask)
告诉计算机网络前缀的位数,128.14.35.7/20的子网掩码是255.255.240.0(二进制比点分十进制更加直观)子网掩码和主机的IP地址进行按位与运算结果即为网络地址。子网是在一个IP网络中划分子网使我们能将一个至少从逻辑上看上去单一的大型网络分成若干个较小的网络。而主机必须知道自己的IP地址,也要知道自己处于哪一个网段,因此mask就诞生了
Facts about IP address
- IP地址实质上是对接口指派地址,路由器有多个接口,说明接入到多个网络中,准确转发到多个网络中需要根据IP。
- 同一局域网的主机IP网络前缀相同,网络地址的主机号必须全0。
- 路由器必须处在不同网络中,必须有大于等于2个IP地址,两台交换机互连仍在同一网络中。
- 交换机只有MAC地址,没有IP地址。
匿名网络(Anoymous/Unnumbered Network)
从网络层的严格定义来说,网络层主要负责不同网络之间的路由和转发。路由器用了几个接口就表示接到几个网络
即使路由器间直接相连,也需要抽象为一个点对点网络(匿名网络)不过通常为了节省资源,并不分配IP地址
A为公网主机,D为拥有公网IP的主机,通信过程为A-B-C-D,B和C用unnumbered,没有必要占用两个ip地址了,让B、C间的口借用另一边口的地址,这样B和C就只是链路层连接[ip unnumber_百度百科](https://baike.baidu.com/item/ip unnumber/4480818) 。如果两台路由器之间还有一个拥有主机的网络E,就必须给接口指派一个网络E的地址。
地址解析协议(Address Resolution Protocol, ARP)
网络层基于IP地址(虚拟地址),主机A有IP
1= 192.168.38.10, 主机B有IP2=192.168.38.11下层为上层提供服务,所以上层可以不用管下层的实现细节,体现在:主机只需要一个包含源IP和目标IP的数据报即可交给网卡开始传输。实际上数据链路层的网卡要根据IP
2解析出应该发给哪个MAC地址,以便构造以太网帧时填入目标MAC地址。ARP就提供了IP地址到MAC地址的映射。
ARP 高速缓存(ARP Cache)
这是主机中的一个映射表,缓存了IP->MAC的关系,经常动态变换,所以也叫 ARP 高速缓存
刚刚上电,ARP Cache为空,此时就要发送一个ARP报文(广播帧 ARP request),目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.38.11的MAC地址是什么?”
网络内其他主机并不响应ARP询问,只有同一网段内的主机B接收到这个帧时,才向主机A做出回应(ARP response):“192.168.38.11的MAC地址是00-BB-00-62-C2-02”,此回应以单播方式进行。
这样,主机A就知道主机B的MAC地址,它就可以向主机B发送信息。同时它还更新自己的ARP cache,下次再向主机B发送信息时,直接从ARP缓存表里查找就可。实际上,ARP Request中包含源IP和源MAC,这样B收到帧的时候就能直接写入ARP缓存,不需要多余通信
ARP Cache 会设置生存时间(Time To Live, TTL)逾期会自动删除,给新的映射关系留下空间(因为可能有的网卡坏了MAC地址也换了,IP地址因为是软件地址,不会跟着硬件走)
ARP 代理(ARP Proxy)
ARP 只适用于同一局域网内部的IP到MAC的映射。不同局域网之间的通信依靠路由器,主机会把IP数据报发给自己的默认网关(也就是路由器)由于默认网关是IP地址形式,所以也要发一个ARP请求广播帧来获取路由器的MAC地址,随后将自己的IP数据报封装成以太网帧发给路由器R1。
路由器R1获取网帧之后经过剥离拿到IP数据报,如果目标IP恰好跟R1在同一个网络内,那么再次通过ARP找到目标IP的MAC地址即可。如果仍然不在同一个网络内,则需要查路由表来确定下一跳应该发到哪个网络。
广播域隔离:路由器并不会在不同子网间转发基于MAC地址的广播帧,同样也不会转发IP广播数据报,因为这样可能会造成广播风暴,瘫痪网络。
为什么不直接使用MAC地址通信:MAC地址相比于IP地址的劣势
- MAC帧格式并不统一(以太网帧、802.11帧
Wi-Fi等)地址转换过程非常复杂,并且和硬件绑定缺乏灵活性 - 使用更高层次的抽象IP地址就可以屏蔽上述差异,灵活分配,具体由ARP协议负责找到IP对应的MAC。
- MAC地址可轻易被伪造或篡改,而IP地址则可以结合其他协议(如防火墙和ACL)进行更复杂的安全策略。
IP 数据报首部(IP Header)
字段名称 | 长度(bit) | 功能 |
---|---|---|
版本 | 4 | 区分协议的版本 (IPv4, IPv6等) |
首部长度 | 4 | 整个首部的长度,单位4字节(0101(20字节)~1111(60字节)) |
区分服务 | 8 | 用来获得更好的服务类型,区分服务类型才使用 |
总长度 | 16 | 单位字节,首部+数据的总长度,最大65536,实际上超过1500(MTU)必须分片,如果分片,则为这个数据报分片的总长度 |
标识 | 16 | IP 软件给每个 IP 数据报分配的标识,属于同一个数据报的分片标识相同 |
标志 | 3 | 0 | DF | MF (MF = 1表示还有分片,MF = 0表示最后一个分片,DF = 1不允许分片) |
片偏移(Offset) | 13 | 单位8字节,$2^{13}\times8 = 65536$,表示分片的数据在原数据中的偏移量 |
生存时间(TTL) | 8 | 数据报的寿命,以前单位为秒,后来变成了跳数,减少路由表配置错误导致的网络风暴 |
协议 | 8 | 用来标识数据部分使用的是什么协议(ICMP, UDP, TCP, OSPF 等) |
首部校验和(Checksum) | 16 | 首部按照16位字划分成如上图的几行,将首部各行加和的反码填入,发送者会先置0,然后再运算,接收者会直接运算结果,如果不出错结果肯定是0 |
源地址 | 32 | 源 IPv4 地址 |
目的地址 | 32 | 目标 IPv4 地址 |
可变部分 | 1~40 | 用于排错、测量和安全功能,由于是可变 加重路由器的负担,可有可无,IPv6 变为定长 |
数据部分(Payload) | —— | 上层传下来的数据 |
从以太网帧中找出目的IP地址
以太网帧有14B的头,IP的目的地址之前有16B的头,因此目的地址从第31个字节开始
IP 转发分组过程
基于终点转发:前缀匹配
前缀匹配 | 下一跳 |
---|---|
128.1.2.192/26 | 直接,接口1 |
128.1.2.128/26 | 直接,接口2 |
128.1.3.64/26 | R |
ARP代理机制中,我们接触到了逐跳转发的概念,如果转发到第一个路由器和目标IP仍然不在一个网络,就要转发到路由表的下一跳。
路由表:分别是网络IP地址、子网掩码和下一跳,网络地址和子网掩码确定接口在哪个网络,下一跳同样是网络的地址而不是主机的IP地址,这主要是为了防止浪费,提高转发的效率。
匹配前缀:将子网掩码和目的地址相与 得出的网络地址匹配,则进入下一跳,否则继续匹配下一个
R1查到下一跳之后,会将下一跳IP地址传给数据链路层,用ARP解析出路由器R2的MAC地址。
因此,查找路由表的过程就是寻找前缀匹配的过程。
查询路由表
最长前缀匹配
CIDR路由聚合可以将网络前缀相同的地址块合并,初衷就是减少路由表项,但同时也减少了路由的具体性,举例:
128.1.24.0/22
与128.1.24.0/24
这两个CIDR地址块并不一致,尽管后者可以聚合到前者中,但是如果特意不聚合(比如公司B和公司A同时从ISP申请了同一网段的IP地址),放到路由表就表示不同的网段,
128.1.24.0/24:
- 掩码:
255.255.255.0
- 包含的地址范围:
128.1.24.0 ~ 128.1.24.255
(公司A)
128.1.24.0/22:
- 掩码:
255.255.252.0
- 表面上可以包含的地址范围:
128.1.24.0 ~ 128.1.27.255
- 实际上包含的地址范围:
128.1.25.0/24
,128.1.26.0/24
,128.1.27.0/24
(公司B) - 为了节省空间,使用路由聚合将公司B的3个地址块聚合成1个大地址块
多个前缀匹配成功(精确和模糊网段同时出现在路由表),模糊网段实际上并没有包括这个精确网段,路由器采取的原则是 最长前缀匹配 ,如果不这样做,会被错误路由到模糊的网段,找不到目标。
为了方便这个实践这个原则,路由表会按照前缀长度进行排序,越长防越靠前,避免发生错误多余的查找。
路由表中还有两个特殊的可选路由项:
主机路由(host route)
前缀长度是32位,直接定位到一台主机,目标IP和主机路由相同,则直接认定匹配,网络测试比较方便,免去地址聚合带来的不确定性
默认路由(default route)
网络前缀:
0.0.0.0
:表示网络地址是 0。/0
:表示前缀长度是 0 位,也就是说没有固定的前缀,所有 IP 地址的前缀都可以匹配它。
含义:
- 默认路由是路由表中的一个“兜底规则”。
- 当某个目标地址不匹配任何其他路由条目时,数据包会被转发到默认路由指向的下一跳(指定的网关)。
- 适用于对外连接较少的路由器(比如这个路由器不直接跟外网连接,而是通过另一个网关)
当路由表中存在更精确的匹配(如 /24
或 /16
),则优先使用更精确的匹配;只有当没有其他匹配时,才使用默认路由。这个可以减少路由表的条数,提高单个路由表的查询性能。
网际控制报文协议(ICMP)
ICMP报文种类
差错报告报文
终点不可达:路由器或主机无法交付数据报时向源点发送destination unreachable,比如UDP数据包目标是一个不存在的端口
时间超过:TTL归零,路由器要丢弃数据报,并向源点发送time exceeded
参数问题:IP首部出错,BAD IP HEADER
改变路由:路由器发现了更好的路由,遂向主机发送redirecting,改变默认路由
ICMP的数据部分包括IP数据报首部,和IP数据负载的前8字节(UDP,TCP的目标端口和源端口,TCP报文段的发送序列号)
询问报文
- 回送请求、回送回答:向特定主机发送的询问,收到回答用来测试可达和主机状态
- 时间戳请求、时间戳回答:利用时间戳可以计算往返时间
应用
PING
Packet InterNet Gopher ,应用层直接调用网络层的一个例子,向节点连续发送ICMP回送请求报文,可以计算出往返时间,统计出丢失的分组数(不知道原因)
ECHO REQUEST(8) ECHO REPLY(0)
socket编程实现
UNIX系统编程实现中,计算机传输层以下比较底层的部分通过socket接口封装起来,调用比较方便,socket编程接口就是应用程序访问网络,操作网卡的方式。
创建socket套接字时有不同的参数,可以选择基于字节流(TCP)/数据报(UDP),另外一个方面,还可以选择协议TCP UDP 或者ICMP,这样socket
在 TCP 传输中创建的方式是 socket(AF_INET, SOCK_STREAM, 0)
其中 AF_INET
表示将使用 IPV4 里 host:port 的方式去解析待会你输入的网络地址。SOCK_STREAM
是指使用面向字节流的 TCP 协议,工作在传输层。 创建好了 socket 之后,就可以愉快的把要传输的数据写到这个文件里。调用 socket 的sendto
接口的过程中进程会从用户态进入到内核态,最后会调用到 sock_sendmsg
方法。 然后进入传输层,带上TCP头。网络层带上IP头,数据链路层带上 MAC头等一系列操作后。进入网卡的发送队列 ring buffer ,顺着网卡就发出去了。 回到 ping , 整个过程也基本跟 TCP 发数据类似,差异的地方主要在于,创建 socket 的时候用的是 socket(AF_INET,SOCK_RAW,IPPROTO_ICMP)
,SOCK_RAW
是原始套接字 ,工作在网络层, 所以构建ICMP(网络层协议)的数据,是再合适不过了。ping 在进入内核态后最后也是调用的 sock_sendmsg
方法,进入到网络层后加上ICMP和IP头后,数据链路层加上MAC头,也是顺着网卡发出。
因此 本质上ping 跟 普通应用发消息 在程序流程上没太大差别。 这也解释了为什么当你发现怀疑网络有问题的时候,别人第一时间是问你能ping通吗?因为可以简单理解为ping就是自己组了个数据包,让系统按着其他软件发送数据的路径往外发一遍,能通的话说明其他软件发的数据也能通。
PING 127.0.0.1
PING localhost 127.0.0.1 本机IP都会走回环路径
The local network card is actually a “fake network network card”. It does not have a ring buffer like the “real network card”. The “fake network card” will push data into a linked list called input_pkt_queue
. This linked list is actually shared by all network cards, and contains various messages sent to this machine. After the message is sent to this linked list, a soft interrupt will be triggered。
0.0.0.0 ping不通,不过服务器listen0.0.0.0表示监听所有目标地址
traceroute
- 记录路由路径和路由时间
- 确定链路的MTU
连续发送多个数据报(含有目标端口非法的UDP数据报),TTL从1开始递增,路由器减TTL并准备转发,此时看到TTL归零就会向源点发送ICMP 时间超过 差错报告报文,能够记录路由的路径,如果路由到目标主机,目标主机不会继续转发,也不会减TTL,看到UDP数据报不合法向源点发送ICMP 终点不可达 差错报告报文。
每个TTL会发送3个相同数据报
第二个作用:故意设置不分片,从而确定路径的 MTU。
First, when the sending host sends an IP datagram, it sets the DF(Don’t Fragment) flag bit in the IP packet header to 1. According to this flag, routers on the way will not fragment large data packets, but will discard the packets.
Subsequently, the value of the MTU on the data link is sent to the sending host through an ICMP unreachable message. The type of the unreachable message is “Fragmentation is required but the DF-bit is set.”
Each time the sending host receives an ICMP error message, it reduces the packet size to locate an appropriate MTU value so that it can reach the target host.
网际分组管理协议(IGMP)
一对多通信
IP 单播(Unicast)
单播是点对点通信,一台设备直接与另一台设备通信。数据包通过网络传输到特定的目标地址。
特点
- 每个数据包有唯一的目标 IP 地址。
- 用于一对一的通信场景。
- 网络负载低,目标明确。
应用场景
- 普通的网页浏览、邮件通信等。
- 服务器与客户端的直接通信。
示例
一台电脑向服务器(如 192.168.1.1)请求网页内容。
IP 广播(Broadcast)
网络号 | 主机号 | 源地址使用 | 目的地址使用 | 用途 |
---|---|---|---|---|
0 | 0 | OK | NO | 本网络的本主机,用于 DHCP,此时本主机 IP 未知 |
0 | X | OK | NO | 本网络的 X 主机 |
127 | 除全0和全1 | OK | OK | 本地软件测试环回地址 (loopback) |
Y | 全1 | NO | OK | Y 网络的广播(路由器参与转发) |
全1 | 全1 | NO | OK | 本网络的广播(路由器不参与转发) |
由此可见,IP 广播主要是聚焦局域网(LAN)所有主机都会接收广播消息,无需特定的接收者。
应用场景:
- 地址解析协议(ARP)。
- 动态主机配置协议(DHCP)的请求。
IP 多播(Multicast)
- 定义:
多播是一种将数据包发送给特定一组接收者(多播组)的通信方式。这组接收者需要事先加入一个特定的多播组,只有组内的成员会接收到数据包。也叫组播 - 特点:
- 可以跨越多个网络。
- 使用 多播地址:IPv4中的多播地址范围是
224.0.0.0
到239.255.255.255
。(D类地址) - 接收者需要加入一个多播组(通过 IGMP 协议进行管理)。
- 节省带宽,因为数据只发送给需要的设备。
- 优缺点:
- 优点:更高效,特别是在需要发送给大量接收者时。
- 缺点:需要更多的配置和支持,例如多播路由器。
- 应用场景:
- 视频会议。
- 实时股票行情分发。
- 流媒体广播。
IP 任播(Anycast)
定义
任播是点对最近点通信,数据包发送给一个目标地址,但由多个具有相同地址的设备接收,最终到达距离最近的一个设备。
特点
- 使用普通的单播地址,但配置在多个设备上。
- 路由选择最近的目标(通常基于最短路径)。
- 增强服务的可用性和效率。用于负载均衡和冗余。
应用场景
- 内容分发网络(CDN)。
- 公共 DNS 服务(如 Google 的 8.8.8.8)。
示例
用户请求 DNS 服务,数据包被路由到最近的 DNS 服务器(多个 DNS 服务器配置了同样的地址 8.8.8.8)。
对比总结
类型 | 特点 | 应用场景 |
---|---|---|
单播 | 一对一通信,目标明确 | 普通网络通信(网页、邮件等) |
组播 | 一对多通信,针对订阅组传输 | 视频直播、分布式同步等 |
广播 | 一对全通信,子网内所有设备接收 | ARP、DHCP 发现等 |
任播 | 一对最近点通信,选择最近设备 | CDN、全球 DNS 服务等 |
局域网上的硬件多播
MAC地址 FF:FF:FF:FF:FF:FF为广播地址
MAC地址 第一个字节末位为1 表示多播,前25位固定不变,后23位来自D类IP地址的后23位 为MAC多播地址
协议
IGMP
多播路由协议
本质区别:多播路由需要考虑源地址的组和网络,也要考虑目的地址的组和网络
缓解IPv4地址短缺
CIDR
虚拟专用网络(Virtual Private Network, VPN)
专用IP地址与隧道技术(tunnel)
10.0.0.0 ~ 10.255.255.255
1个A类网络
172.16.0.0 ~ 172.31.255.255
16个B类网络
192.168.0.0 ~ 192.168.255.255
256个C类网络
IP地址短缺,机构内部的主机都会使用专用IP网段,如果机构内部的主机AB分隔两地需要进行通信,私密性和安全性是关键,要么向运营商租用昂贵的电信线路将他们直接连成局域网,
要么利用互联网,用两台路由器静态配置IP,将原本的IP数据报加密后封装到一个新的IP数据报中,这个新的IP数据报负责在公网进行路由传递,最终到达目标主机所在网络的路由器,由路由器将数据报交付给目标主机。
步骤 | 目标IP | 源IP | 所属网络 |
---|---|---|---|
1 | 10.2.0.3 | 10.1.0.1 | 10.1.0.0 |
2 | 194.4.5.6 | 125.1.2.3 | 公网IP |
3 | 10.2.0.3 | 10.1.0.1 | 10.2.0.0 |
步骤2是外层数据报,13都是内层的加密数据报内容。
网络地址转换(Network Address Translation, NAT)
同样是IP地址短缺的背景,路由器给主机分配了专用IP网段,内网IP的数据包根本不可能在公网上传播,因为公网上的路由器都是屏蔽掉了这些私网IP,因此主机要通过路由器的公网IP向外发送消息,但是之后外部就无法联络内部,此时就出现了网络地址转换(NAT)NAT提供了主机的专用IP地址到路由器所持公网IP的映射关系,外部发送消息到路由器的特定公网IP,NAT路由器根据映射表将消息转发到对应的主机。
NAPT
问题
网络地址转换(Network Address Translation,NAT)机制的问题在于,NAT设备自动屏蔽了非内网主机主动发起的连接,也就是说,从外网发往内网的数据包将被NAT设备丢弃,这使得位于不同NAT设备之后的主机之间无法直接交换信息。这一方面保护了内网主机免于来自外部网络的攻击,另一方面也为P2P通信带来了一定困难。Internet上的NAT设备大多是地址限制圆锥形NAT或端口限制圆锥形 NAT,外部主机要与内网主机相互通信,必须由内网主机主动发起连接,使 NAT设备产生一个映射条目,这就有必要研究一下内网穿透技术。
内网穿透(Intranet penetration)
UDP 打洞
通信双方一台位于 NAT 之后
一台主机B有一个公网 IP,另一台主机A有一个内网 IP。如图2.4所示, A 位于 NAT 之后,并拥有[IP 地址:端口]对[10.0.0.1:1234], B位于 NAT 之前,并拥有[IP 地址:端口]对[138.76.29.7:1234],NAT 拥有公网 IP 155.99.25.11。由于 B 有一个公网 IP, A 可以直接通过 TCP 连接到[138.76.29.7:1234],然而,如果 B 向 A 发起主动连接,则不会成功。此时,需要一个公有的服务器辅助进行内网穿透。 A 和 B 向服务器发起登陆请求,并保持一个 TCP 或 UDP 连接,服务器记录其 IP 地址和端口号,这里服务器对 A 是记录其经过 NAT 映射之后的 IP 和端口号。当 B 想连接 A 时,首先向服务器提出请求,服务器在收到请求后向 A 发出打洞命令,并将 B 的[IP 地址:端口]对发给 A, A 根据接收到的 IP地址和端口号向 B 发起 TCP 连接或发送 UDP 数据包。接下来 A 和 B 之间便可以建立数据传输通道。
通信双方主机均位于NAT设备之后
两台主机都处于内网中,如图2.5所示。服务器记录的[IP 地址:端口]对是 A 和 B 经过 NAT 映射之后的IP 地址和端口号,此时, A 和 B 之间任意方向的连接请求都会被对方的 NAT 设备屏蔽。 A 首先向服务器提出连接请求,服务器将 A 的 IP地址和端口号对[155.99.25.11:51200]发给 B,并向 B 发出打洞命令; B 收到服务器的打洞命令后首先向[155.99.25.11:51200]发送一定数目的 UDP探测包或 TCP 连接请求,在 NAT B 上打一个方向为[155.99.25.11:51200]的洞, B 随后向服务器报告打洞完成;服务器在收到 B 的报告后将 B 的公网IP 地址和端口号对[110.10.33.10:5000],此时由于 NAT B 上已经留下了对应于[155.99.25.11:51200]方向的洞, A 向[110.10.33.10:5000]发出的数据包或连接请求将不会被丢弃。
这项技术需要使用圆锥型NAT设备,对称型NAT不能使用这项技术。
STUN(NAT会话穿越应用程序)
NAT 穿越技术拥有这样的功能,它能够让网络应用程序主动发现自己位于 NAT 设备之后,并且会主动获得 NAT 设备的公有 IP,并为自己建立端口映射条目,注意这些都是 NAT设备后的应用程序自动完成的。
也就是说,在 NAT 穿透技术中,NAT设备后的应用程序处于主动地位,它已经明确地知道 NAT 设备要修改它外发的数据包,于是它主动配合 NAT 设备的操作,主动地建立好映射,这样就不像以前由 NAT 设备来建立映射了。
说人话,就是客户端主动从 NAT 设备获取公有 IP 地址,然后自己建立端口映射条目,然后用这个条目对外通信,就不需要 NAT 设备来进行转换了。
路由选择协议
静态配置路由导致的路由环路
聚合路由和精确路由同时出现在一张路由表中,应该按照精确地址进行匹配,(模糊地址中不包括精确地址)
路由配置错误:路由表手动配置错误导致出现路由环路。
聚合不存在的网络:路由表中只有模糊地址,但是模糊地址里面不存在某个精确地址,而目的地址是精确地址会导致数据包会被错误地路由到模糊的网络,因此路由器应当配置黑洞路由,将不存在的地址路由到黑洞中(丢弃)
网络故障:路由器检测到与其直连的网络发生故障会把路由表中的条目删除,但下次来就不知道要转发到哪里,只能交给默认路由,此时可能会导致环路,正确的做法是故障时启用对应网络的黑洞路由,恢复时关闭黑洞路由,启用正常的接口路由
路由协议概述
路由表:对网络拓扑计算最优化
转发表:使得查找过程最优化,优化路由表的查找性能
路由信息协议(Routing Information Protocol, RIP)
- 属于内部网关协议(IGP),是一个自治系统内部的路由协议
- 最早出现的距离向量路由协议,其主要应用于规模较小的、可靠性要求较低的网络。收敛速度较慢,支持的广播网络规模有限
- 路由算法是Bellman-Ford算法
原则
每隔30秒会与相邻的路由器交换子消息,以动态的建立路由表。
RIP规定度量值取0~15之间的整数,大于或等于16的跳数被定义为无穷大。
对方的路由表复制过来,下一跳全部改成对方,距离全部加1;
不存在网络B的条目,直接添加;
存在网络A的条目,下一跳相同,直接更新;
存在网络A的条目,下一跳不同,距离更短才更新;距离相同则添加条目(等价负载均衡);距离更长则不更新。
问题:坏消息传得慢
- 水平分割:水平分割指的是RIP从某个接口学到的路由,不会从该接口再发回给邻居设备。在帧中继和X.25等NBMA网络中,水平分割功能缺省为禁止状态。
- 触发更新:触发更新是指路由信息发生变化时,立即向邻居设备发送触发更新报文,通知变化的路由信息。(触发更新不会触发接收路由器重置自己的更新定时器)
检测到不可达:说明之前距离是1(直连接口)
收敛:R3 到网络距离为1,R2和R1到网络的距离为2
不可达:R3 到网络距离为16,通告给R2,变更距离为16,随后R1没来得及更新,就将自己的路由表内容发给了
开放式最短路径优先(Open Shortest Path First, OSPF)
属于内部网关协议(IGP)
在链路状态路由协议中,每个节点都知晓整个网络的拓扑信息。各节点使用自己了解的网络拓扑情况来各自独立地对网络中每个可能的目的地址计算出其最佳的转发地址(下一跳)。所有最佳转发地址汇集到一起构成该节点的完整路由表。与距离-矢量路由协议使用的那种每个节点与其相邻节点分享自己的路由表的工作方式不同,链路状态路由协议的工作方式是节点间仅传播用于构造网络连通图所需的信息。最初创建这类协议就是为了解决距离-矢量路由协议收敛缓慢的缺点,然而,为此链路状态路由协议会消耗大量的内存与处理器能力。
大多数ISP必须使用BGP来与其他ISP建立路由连接(尤其是当它们采取多宿主连接时)
采用Dijkstra 算法计算最短路径树,使用“开销(Cost)”作为路由度量。
链路状态数据库(LSDB)用来保存当前网络拓扑结构,路由器上属于同一区域的链路状态数据库是相同的(属于多个区域的路由器会为每个区域维护一份链路状态数据库)。
基于 IP 协议,路由信息直接封装在 IP 数据报中