近几天在虚拟机环境下开发tello的多机编队飞行任务,遇到了以下的一些问题,于是引发了关于网络连接中的路由结构的思考,遂做以下记录。
一、vm中的桥接模式
1、桥接
桥接模式,实际上是将虚拟机与宿主机设置为同等级别的client,可以简单看做是为虚拟机创建了一块物理网卡(至于mac什么的可以不考虑,总有办法搞定),在同一网段下他们是平级的,因此通过虚拟机可以访问与宿主机在同一网段下的各个子机。因此在将宿主机与tello连接时,是将宿主机和虚拟机同时连接到了tello的子网段下,其网关为192.168.10.1(网段为192.168.10.x)。因此这时需要将虚拟机的ip设置为192.168.10.xx,保证了他在同一网段下,这时,虚拟机可以直接向网关192.168.10.1发送数据包完成信息交互(socket实现)。
2、单层路由结构
与桥接模式类似的方式就是单层路由结构,在这种结构下同一网段下的所有主机都连接到了路由器的lan端口,通过端口映射技术为每一个client分配一个本地局域网ip(比如192.168.xx.xx),但是这些所有的主机访问外网是通过一个网关来进行的,即本地网关地址(192.168.1.1)。因此,在这个本地网段下的所有主机拥有相同的外网ip,由于端口映射导致映射关系为本地ip192.168.1.22映射成了外网ip+端口号:xxx.xx.xx.x:xx。
二、vm中的NAT模和多层路由结构
nat模式,实际上是将宿主机作为一个新的路由器形式,虚拟机则是这个新的子网络中的一台主机,这种方式不需要设置虚拟机的ip即可访问互联网。通过这种方式和tello连接时,实际的网络结构和多层路由结构是一样的,如下图。
在这种情况下原有一个局域网LAN 1,靠一台路由器R1共享Internet,现在又在其中添加了一台路由器R2,下挂另一个网段LAN 2的主机。经过设置后(将R2的wan端口指向LAN1网段下的192.168.0.100),所有主机即可实现共享Internet,但是LAN 1下的主机无法与LAN 2下的主机通信,而LAN 2的主机却能Ping通LAN 1下的主机。这是因为路由器隔绝广播,划分了广播域,此时LAN 1和LAN 2的主机位于两个不同的网段中,中间被新加入的路由器隔离了。所以此时LAN 1下的主机不能“看”到LAN 2里的主机,只能将信息包先发送到默认网关R1,而此时的网关没有设置到LAN 2的路由信息,无法做有效的转发。这种情况下,必须要设置静态路由条目。
如图所示,LAN 1为192.168.0.0这个标准C类网段,路由器R1为原有路由器,它的WAN口接入宽带(外网网线),一个LAN1口挂着一台IP为192.168.0.1的主机和路由器R2。R2(新添加)的WAN口接到LAN1中(IP为192.168.0.100)。R2的LAN2口下挂着新加入的LAN 2这个C类不同网段的主机(IP为192.168.1.1)。
如果按照共享Internet的方式简单设置,此时应将192.168.0.0的主机网关都指向R1的192.168.0.1,192.168.1.0网段的主机网关指向R2的192.168.1.1,那么只要R2的WAN口网关指向192.168.0.1,192.168.1.0网段下的主机就都能访问192.168.0.0网段的主机并能通过宽带连接上网,这是因为前面所说的宽带路由器中一条默认路由在起作用,它将所有非本网段的目的IP包都发到WAN口的网关(即路由器R2),再由R2来决定信息包应该转发到它自己连的内网还是发到外网去。但是192.168.0.0网段的主机网关是192.168.0.1,而路由器R1这时并不知道192.168.1.0这个LAN 2的正确位置(没有设置对应的路由表信息),那么此时只能上网以及本网段内的互访,不能访问到192.168.1.0网段的主机。这时就需要在R1上指定一条静态路由,使目的IP为192.168.1.0网段的信息包能转发到路由器R2去。
通过以上的分析,就可以知道为什么当采用NAT模式连接tello时,虚拟机能够ping同tello,而tello发送的信息却不能找到虚拟机的地址了。