MacOS的路由表查询不是用我们熟知的route命令,而是使用命令 netstat -r 或者netstat -nr(不做域名解释)来查看

netstat -r
Routing tables

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Internet:
Destination Gateway Flags Netif Expire
default 192.168.3.1 UGSc en0
127 localhost UCS lo0
localhost localhost UH lo0
169.254 link#4 UCS en0 !
192.168.3 link#4 UCS en0 !
192.168.3.1/32 link#4 UCS en0 !
192.168.3.1 a1:9b:00:00:ea:18 UHLWIir en0 1165
192.168.3.4 51:00:00:00:ee:18 UHLWIi en0 1153
192.168.3.5/32 link#4 UCS en0 !
192.168.3.8 a1:1f:00:00:a:88 UHLWIi en0 795
224.0.0/4 link#4 UmCS en0 !
224.0.0.251 1:0:00:0:0:fb UHmLWI en0
239.255.255.250 1:0:00:11:ff:fa UHmLWI en0
255.255.255.255/32 link#4 UCS en0 !

如果加-n不解析域名也就是,那么destination就是ip,如:

netstat -nr
Routing tables

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Internet:
Destination Gateway Flags Netif Expire
default 192.168.3.1 UGSc en0
127 127.0.0.1 UCS lo0
127.0.0.1 127.0.0.1 UH lo0
169.254 link#4 UCS en0 !
192.168.3 link#4 UCS en0 !
192.168.3.1/32 link#4 UCS en0 !
192.168.3.1 a1:9b:00:00:ea:18 UHLWIir en0 1181
192.168.3.4 51:00:00:00:ee:18 UHLWIi en0 421
192.168.3.5/32 link#4 UCS en0 !
192.168.3.8 a1:1f:00:00:a:88 UHLWIi en0 669
224.0.0/4 link#4 UmCS en0 !
224.0.0.251 1:0:00:0:0:fb UHmLWI en0
239.255.255.250 1:0:00:11:ff:fa UHmLWI en0
255.255.255.255/32 link#4 UCS en0 !
  • Destination: 目标地址,确切说是用来和一个packet包里面的目标地址做匹配的字段,有3种类型的目标地址, 单个主机、 子网、 以及“default(默认)”
    • 单个主机: 单个ip
    • 子网:一个ip段,上面看到的 192.168.3.1/32 就是
    • “默认”: 如果packet里面的目标地址没有名字tables里面其他任何一条规则,则使用这个destination=default的规则
  • Gateway: 网关,意思是packet通过哪里发出去,这个要重点理解一下,网关也有3种类型
    • 单个主机:具备网关路由功能的主机ip
    • 网络接口(也叫“链路”): 如上表的link#4,它实际上指向一个数据链路层地址,#4表示第4个网卡接口,可以通过ifconfig 或者 netstat -ni(下面会讲到) 查看,顺序查下来就是了#4就是按顺序看到那个
    • 以太网物理地址值:如上表的 a1:9b:00:00:ea:18
  • Flags:路由的标志位
    • U: Up: 路由处于活动状态。
    • H: Host: 路由目标是单个主机。
    • G: Gateway: 所有发到目的地的网络传到这一远程系统上, 并由它决定最后发到哪里。
    • S: Static: 这个路由是手工配置的,不是由系统自动生成的。
    • C: Clone: 生成一个新的路由, 通过这个路由我们可以连接上这些机子。 这种类型的路由通常用于本地网络。
    • W: WasCloned: 指明一个路由――它是基于本地区域网络 (克隆) 路由自动配置的。
    • L: Link: 路由涉及到了以太网硬件。
  • Netif: 网络接口,如en0,是我的机器默认wifi接口,而lo0表示本机(“回环设备”),也就是这条规则的包不通过Lan来发出

那么上面

第一条规则

1
default            192.168.3.1        UGSc           en0

标识所有其他规则匹配不到的流量都通过en0发到目的地,也就是网关 192.168.3.1en0不需要理解包里面最终的的目的地,他只需要知道这个包的栈里面下一个是交给谁就行.

第二,三条规则

1
2
127                127.0.0.1          UCS            lo0
127.0.0.1 127.0.0.1 UH lo0

表示127开头的地址的包不会发出去,都是留在本地,127.0.0.1代表主机自己本身(lo0是回环设备–loopback interface)

第四五六条规则

1
2
3
169.254            link#4             UCS            en0      !
192.168.3 link#4 UCS en0 !
192.168.3.1/32 link#4 UCS en0 !

link#4 代表主机上的第4个以太网接口,意思是上面这几个子网的请求通过第四个网络接口在数据链路层直接发出(也就是时候link#4就是en0),基本上这些包在链路层级别,不需要路由,因为会直接发往其他主机都监听的通道(相同的物理网段)上,任何人主机监听可以直接监听物理层的这些通道(相同的物理网段)数据,然后根据地址来接收自己的需要的包(不是发给自己的则直接丢弃)。一般连接到子网的物理网络的主机都会直接监听这类包(被主机路由功能直接加到路由配置里,Flags是C)。

实际主机的路由通过将发往远程主机的数据包封装到发往路由器的第2层数据包中,从而利用了第2层的优势,然后路由器会将第2层封装解开,检查它是否发往另外一个网络,将其移动到面向外部的接口,并再次作为发往下一个外部局域网(子网)的第2层数据包发送给下一个路由器(或其他主机)。

如何查看link各个对应什么接口

netstat -ni | grep Link

1
2
3
4
5
6
7
8
9
10
11
12
13
14
lo0   16384 <Link#1>                       6254194     0  6254194     0     0
gif0* 1280 <Link#2> 0 0 0 0 0
stf0* 1280 <Link#3> 0 0 0 0 0
en0 1500 <Link#4> 80:...........:98 3872737 0 3738407 0 0
en1 1500 <Link#5> 82.............c0 0 0 0 0 0
en2 1500 <Link#6> 82:...........:c1 0 0 0 0 0
bridg 1500 <Link#7> 82............:c0 0 0 0 0 0
p2p0 2304 <Link#8> 02:...........:98 0 0 0 0 0
awdl0 1484 <Link#9> 2e:...........:5a 1828 0 1157 0 0
llw0 1500 <Link#10> 2e:...........:5a 0 0 0 0 0
utun0 1380 <Link#11> 0 0 88 0 0
utun1 2000 <Link#12> 0 0 88 0 0
utun3 1380 <Link#14> 4298 0 7034 0 0
utun4 1380 <Link#15> 0 0 2 0 0

好了 ,那么我们在细看link#4是怎么管理网络的

netstat -i

1
2
3
Name       Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
en0 1500 <Link#4> 80:...........:98 3891788 0 3761878 0 0
en0 1500 192.168.3 192.168.3.5 3891788 - 3761878 -
  1. 这个定义了link#4关联的物理地址是80:………..:98 这个物理接口
  2. 然后他所在的网段是 192.168.3, 自己的ip地址是 5

netstat -i # 断开网络,切换到手机的共享wifi再看看

1
2
3
Name       Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
en0 1500 <Link#4> 80:...........:98 3891150 0 3760929 0 0
en0 1500 172.20.10/28 172.20.10.4 3891150 - 3760929 - -

切换手机的共享wifi,可以看到网段是10, 范围是28个子网掩码非0的范围(也就是255.255.255.240),自己在这个网段里面的ip是4

第七条规则

1
192.168.3.1        a1:9b:00:00:ea:18  UHLWIir        en0   1181

FreeBSD 会自动识别在同一个以太网中的任何主机, 并为其新增一个路由, 并通过那个以太网接口en0直接与它通讯(FLAGS是H),这条规则就是自动识别添加进去的。FreeBSD是通过一种叫“路由信息协议(Routing Information Protocol)”的机制来识别这种主机,也就是具备路由功能的主机。

上面四五六七这几条规则,一般我们把网络断开它们就不见了,因为是路由器功能自动生成的(FALGS是CW)。

那么七和四五六这几条有什么区别呢,一般来说,主机已经通过路由广播信息知道了其他主机的信息,然后就直接配置他们的物理地址在路由表里,然后通过en0发出去的给这些其他主机的时候就知道怎么发了(FLAGS:H,也就是目标是单个主机)(第七条),而link#4规则 它不需要知道子网里面他的所有的机器的具体ip,只需要知道一个网段,然后就可以直接广播了(四五六等link#4规则)