上一节,我们封装了一个长长的网络包,“大炮”准备完毕,开始发送。
发送的时候可以说是重重关隘,从手机到移动网络、互联网,还要经过多个运营商才能到达数据中心,到了数据中心就进入第二个复杂的过程,从网关到VXLAN隧道,到负载均衡,到Controller层、组合服务层、基础服务层,最终才下单入库。今天,我们就来看这最后一段过程。
7.一座座城池一道道关,流控拥塞与重传
网络包已经组合完毕,接下来我们来看,如何经过一道道城关,到达目标公网IP。
对于手机来讲,默认的网关在PGW上。在移动网络里面,从手机到SGW,到PGW是有一条隧道的。在这条隧道里面,会将上面的这个包作为隧道的乘客协议放在里面,外面SGW和PGW在核心网机房的IP地址。网络包直到PGW(PGW是隧道的另一端)才将里面的包解出来,转发到外部网络。
所以,从手机发送出来的时候,网络包的结构为:
源MAC:手机也即UE的MAC;
目标MAC:网关PGW上面的隧道端点的MAC;
源IP:UE的IP地址;
目标IP:SLB的公网IP地址。
进入隧道之后,要封装外层的网络地址,因而网络包的格式为:
外层源MAC:E-NodeB的MAC;
外层目标MAC:SGW的MAC;
外层源IP:E-NodeB的IP;
外层目标IP:SGW的IP;
内层源MAC:手机也即UE的MAC;
内层目标MAC:网关PGW上面的隧道端点的MAC;
内层源IP:UE的IP地址;
内层目标IP:SLB的公网IP地址。
当隧道在SGW的时候,切换了一个隧道,为从SGW到PGW的隧道,因而网络包的格式为:
外层源MAC:SGW的MAC;
外层目标MAC:PGW的MAC;
外层源IP:SGW的IP;
外层目标IP:PGW的IP;
内层源MAC:手机也即UE的MAC;
内层目标MAC:网关PGW上面的隧道端点的MAC;
内层源IP:UE的IP地址;
内层目标IP:SLB的公网IP地址。
在PGW的隧道端点将包解出来,转发出去的时候,一般在PGW出外部网络的路由器上,会部署NAT服务,将手机的IP地址转换为公网IP地址,当请求返回的时候,再NAT回来。
因而在PGW之后,相当于做了一次欧洲十国游型的转发,网络包的格式为:
源MAC:PGW出口的MAC;
目标MAC:NAT网关的MAC;
源IP:UE的IP地址;
目标IP:SLB的公网IP地址。
在NAT网关,相当于做了一次玄奘西游型的转发,网络包的格式变成:
源MAC:NAT网关的MAC;
目标MAC:A2路由器的MAC;
源IP:UE的公网IP地址;
目标IP:SLB的公网IP地址。
出了NAT网关,就从核心网到达了互联网。在网络世界,每一个运营商的网络成为自治系统AS。每个自治系统都有边界路由器,通过它和外面的世界建立联系。
对于云平台来讲,它可以被称为Multihomed AS,有多个连接连到其他的AS,但是大多拒绝帮其他的AS传输包。例如一些大公司的网络。对于运营商来说,它可以被称为Transit AS,有多个连接连到其他的AS,并且可以帮助其他的AS传输包,比如主干网。
如何从出口的运营商到达云平台的边界路由器?在路由器之间需要通过BGP协议实现,BGP又分为两类,eBGP和iBGP。自治系统间,边界路由器之间使用eBGP广播路由。内部网络也需要访问其他的自治系统。
边界路由器如何将BGP学习到的路由导入到内部网络呢?通过运行iBGP,使内部的路由器能够找到到达外网目的地最好的边界路由器。
网站的SLB的公网IP地址早已经通过云平台的边界路由器,让全网都知道了。于是这个下单的网络包选择了下一跳是A2,也即将A2的MAC地址放在目标MAC地址中。
到达A2之后,从路由表中找到下一跳是路由器C1,于是将目标MAC换成C1的MAC地址。到达C1之后,找到下一跳是C2,将目标MAC地址设置为C2的MAC。到达C2后,找到下一跳是云平台的边界路由器,于是将目标MAC设置为边界路由器的MAC地址。
你会发现,这一路,都是只换MAC,不换目标IP地址。这就是所谓下一跳的概念。
在云平台的边界路由器,会将下单的包转发进来,经过核心交换,汇聚交换,到达外网网关节点上的SLB的公网IP地址。
我们可以看到,手机到SLB的公网IP,是一个端到端的连接,连接的过程发送了很多包。所有这些包,无论是TCP三次握手,还是HTTPS的密钥交换,都是要走如此复杂的过程到达SLB的,当然每个包走的路径不一定一致。
当网络包走在这个复杂的道路上,很可能一不小心就丢了,怎么办?这就需要借助TCP的机制重新发送。