什么是路由?

路由这个词,一般人可能既熟悉又陌生。熟悉的是,基本上家家都有个路由器;陌生的是这个路由器跟我们这里说的路由是一个东西吗?

路由,对应的英文是Route,即选路的意思。家用的路由器也是这个意思,即为上网收发的IP包选路。在本书讨论的Kamailio,可以认为是一个SIP路由器。

简单来说,Kamailio的路由就是控制SIP包从哪里来,到哪里去。下面,我们抛开技术细节,通过一个更一般的例子,来了解路由相关的名词术语。

如下图:假设我们有A、B、C、D四个城市,不失一般性,C(英文正好为Center)位于宇宙中心,ABD间互访都需要经过C。C就对应我们这里的Kamailio服务器。

它们互相之间的路径就称为“中继”。中继是有方向的。在本例中,中继是“双向”的,即A市的人能到C,C也能到A,其他依此类推。但某天,A市发生了疫情,C市规定,所有从A来的人都不准进入C市,但C市的人仍可去A市,这样,相当于路径CA是通的,但AC不通。这就变成了单向中继。中继的方向是相对的,CA相对A来说,就是“单入”中继,相对C来说,就是“单出”中继。

假设有人从A出发经C去往B市,但从C出发有两条路(CB和CD),不知道怎么走,就要找人“问路”,这个“问路”和“回答”的过程就称为“查找路由”,或“选路”。一旦选择了正确的路线,就可以继续前往“目的地”,当然,在Kamailio中,“目的地”对应的是CB这条中继,B也称为C的“下一跳”(Next Hop)。

C到B可能有多种交通方式,如高铁、高速公路、飞机等,可以认为是多条中继,多条中继组成一个中继组。假设有100个人同时从C到B,可能有20个人选择飞机,70个人坐高铁,10个人自驾,合在一起称为中继组的分配策略,分配策略的前提是不同的中继有不同的容量和费用。如果A市发生地震,所有人都经C市到其它城市避难,这时候可能因为AC间的路不够宽(或高铁、飞机的班次不够多,对应Kamailio就是中继资源不够用)而发生“拥塞”。

如果有人从A出发经C到B,但由于天气原因航班取消(中继故障),改乘高铁,这就称为“重选路由”,这种重选是“串行”(Serial)的。

假设A市急需一种药品,B或D都有可能提供这种药品,派出一人到达C市后,通讯中断,经多方打听仍不确认B还是D哪个城市能找到该药品,只能人到了才知道。为了增加成功率,C市也派出一人帮忙,A市的人去B,C市的人去D,这样不管B还是D有药品都能成功被找到,这称为“并行”转发。

政策发生变化,C市要在每条路的出入两个方向上都设置检查站,并收费。如果对进入C市的人收费,称为“入中继计费”,反之,称为“出中继计费”。

当然上面提到A市发生疫情的情况,A市的人无法经过C到B,但D市的人可以经C到B。所以,在C上,对于到同一个目的地(这里是B)的问路请求,还要检查这个人是从哪个城市来的,以确定是否准许通过,这个“来源”的城市就称为“呼叫源”。所以,呼叫源也是路由的一部分。

假设甲乙两个人都来自A市经C去往B市,而从C到B有多种交通方式。两人到达C后,由于单根据“呼叫源”和“目的地”无法区分甲乙两人后续行程,但甲买了飞机票,乙买了高铁票,到C后就可以通过不同的中继路由到B。这种通过预先买票决定后续行程的方式就称为“路由码”。在Kamailio中,路由码可以在SIP头域中传送,也可以在主、被叫号码中传送,相当于C把路由选择的部分权利开放给了A。

如果很不幸,C市发生了疫情,则ABD之间的交通就中断了。所以,在此,C属于一个“单点故障”点,这时要有备用的方案。一般采用两个C中心城市设计,如下图中的C1和C2。这在Kamailio网关上称为“双平面”。这种架构下,C1或C2其中一个城市发生疫情不影响ABD之前的交通(通信)。

在第一张图中,如果把C换成Kamailio网关,ABD换成电话交换机或,把城市里的“人”换成“电话”,那么,在Kamailio(C)的中继AC上来了一通电话,这通电话是A(呼叫源)打来的,主叫号码是A,被叫号码是B,C查找本地的路由表,发现一条路由A-B,目的地是CB这条中继,然后将通话发到CB中继上,电话到达B端的交换机。

条条大路通罗马,你找到去罗马的路由了吗?

注:本文来自《Kamailio实战》