由于scull模块创建了两个接口,这个接口与简单的回环设备不同,通过其中一个接口传输的任何数据,都将出现在另外一个接口上,而不是第一个接口本身。这就好像用户有两个外部链路,但实际上计算机只对自身做出响应。
分配一个IP号不能实现该效果,因为如果接口A指向接口B,那么内核如果通过A发送数据,将使用回环通道而不是scull。为了能通过scull接口建立通信,在传输过程中需要修改源及目的地址,通过某一个接口发送出去的数据包应该被另外一个接口接收,但是不能将外发数据包的接收者认为是本机。同样的规则也应该应用于已接收数据包的原地址。
以上图中remote0、sn0属于snullnet0网络,可设置IP为
snullnet0 192.168.0.0
local0 192.168.0.1 (sn0接口的IP地址)
remote0 192.168.0.2
remote1、sn1属于snullnet1网络,可设置IP为
snullnet1 192.168.1.0
local1 192.168.1.2 (sn1接口的IP地址)
remote1 192.168.1.1
如果scull接口切换原地址和目标地址的第三个octet的最低位,其效果是,发送到sn0的数据包将在sn1上出现;
所以,从sn0发送数据包到remote0相当于从remote1发送数据包到sn1,而且remote0和sn1的第四个octet要一样;
从sn1发送数据包到remote1相当于从remote0发送数据包到sn0,而且remote1和sn0的第四个octet要一样;
至于,后面有一句话 “我们无法到达属于这两个网络的任意其他“主机””,我是这样理解的:
意思就是从一个网络发出(比如从sn0接口发出)他是无法到达这个网络的任意主机(比如不能到达remote0),因为发出的接口和接收的主机的地址的第三个octet发生了改变,不在是之前那个网络的本地地址。