# 路由

## 路由

### IP选路

![](/files/-LDZS5QDduvRU5u4bxFb)

1. 搜索路由表的优先级

   ```
    主机地址
    网络地址
    默认路由
   ```
2. 路由表
3. 如果找不到匹配的路由，则返回“主机不可达差错”或“网络不可达差错”

一个典型的路由表如下：

```bash
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0      0.0.0.0         255.255.192.0   U     0      0        0 eth0
0.0.0.0         192.168.0.1      0.0.0.0         UG    100    0        0 eth0
```

Flags各项的含义：

* U    该路由可用
* G    该路由是一个网关，如果没有该标志，则是直接路由
* H    该路由是一个主机，如果没有该标志，则是一个网络
* D    该路由是由重定向报文创建的
* M    该路由被ICMP重定向报文修改过

### 路由的修改

可以通过route命令来修改路由表，ICMP重定向报文也会修改路由表

一般在系统的配置文件中会设置默认路由.

### ICMP重定向差错

当IP数据报应该被发送到另一个路由器时，收到数据报的路由器就要给发送端回复一个ICMP重定向差错报文。

重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。

### ICMP路由器发现报文

一般来说，主机在引导以后要广播或多播一份路由器请求报文，一台或多台路由器响应一份路由器通告报文。路由器也会定期地广播或多播路由器通告报文。

### 路由协议

路由协议用来从多条路由路径中选择一条最佳的路径，并沿着这条路径将数据流产送到目的设备。

* 路由信息协议（RIP）：采用距离向量算法，收集所有可到达目的地的不同路径，并且保存有关到达每个目的地的最少站点数的路径信息，；同时路由器也把这些信息用RIP协议通知相邻路由器。RIP只适用于小型网络（最大15跳）。
* 开放式最短路径协议（OSPF）：基于链路状态，每个路由器向其同一管理域的所有其它路由器发送链路状态广播信息，并将自制域划分为区，并根据区的位置执行区内路由选择和区间路由选择。
* IS-IS：链路状态路由协议，和OSPF相同，IS-IS也使用了“区域”的概念，同样也维护着一份链路状态数据库，通过最短生成树算法（SPF）计算出最佳路径。
* 边界网关协议（BGP）：外部网关协议，用于与其它自治域的BGP交换网络可达信息（通过TCP确保可靠性）。

### STP和Trill

为了提高网络的可靠性，交换网络通常会使用冗余链路，这会带来环路的风险。而STP和Trill就是为了解决环路问题而生的。

STP（Spanning Tree Protocol）的基本原理是在交换机之间传输BPDU（Bridge Protocol Data Unit）报文，并使用生成树来确定网络拓扑：

* 生成树初始化，建立根网桥
* 根端口选举，选择的依据是端口到根网桥的路径开销最小，如果路径开销相同则使用端口ID最小的端口
* 网段指定端口选举，选择的依据也是到根网桥路径开销最小
* 网络收敛后，只有指定端口和根端口可以转发数据。其他端口为预备端口，被阻塞，不能转发数据

STP最大的问题是二层链路利用率不足，且收敛慢，不适合大型数据中心。IETF又提出了Trill技术来克服STP的种种缺陷。Trill（TRansparent Interconnection of Lots of Links）的核心思想是将成熟的三层路由的控制算法引入到二层交换中，将原先的L2报文加一个新的封装(隧道封装)，转换到新的地址空间上进行转发。而新的地址有与IP类似的路由属性，具备大规模组网、最短路径转发、等价多路径、快速收敛、易扩展等诸多优势，从而规避STP/MSTP等技术的缺陷，实现健壮的大规模二层组网。支持TRILL技术的以太网交换机被称为`RBridge`。

## MPLS

MPLS（Multi-Protocol Label Switching）利用标签进行数据转发，而不是向传统路由决策那样每次数据包进行解包，大大减少了路由决策的时间。当分组进入MPLS网络时，为其分配固定长度的短标记，并将标记与分组封装在一起，在整个转发过程中，交换节点仅根据标记进行转发。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sdn.feisky.xyz/wang-luo-ji-chu/index/route.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
