我们知道,两台电脑之间可以连接一根网线就可以进行通信,但是如果三台电脑之间相互通信,那每台电脑就必须有两个网口,好像也能接受,但随着越来越多的电脑接入网络,每台电脑也需要装上越来越多的网口,很显然是不现实的,于是便出现了交换机。
所有电脑都连接到交换机,电脑之间相互通信时先把数据发送到交换机,交换机再把数据转发到目标机器。
那么,交换机是如何准确的把数据发送到目标主机呢?原因在于交换机中维护着一张mac表,表中记录了交换机每个端口所连接的电脑的mac地址,当电脑A给电脑B发送数据时,数据先发送到交换机,交换机再通过mac表查询电脑B的mac地址和交换机端口的关系,最终将数据发送到电脑B。
这个过程看似很完美,其实还存在很多问题:
- 交换机并不认识电脑A或电脑B,它只认识mac地址
- 一开始的时候交换机里面的mac表是空表,它是如何得到每台电脑mac与交换机端口的隐射关系呢?
这两个问题其实是靠IP、Arp、和广播来解决的,Arp记录着电脑IP与mac的映射关系,当电脑A与电脑B进行通信时,需要先获取电脑B的IP地址(如通过DNS解析),获取电脑B的IP地址后,电脑A会在自己的的Arp缓存表中查看B的IP所对应的mac地址,然后将目标mac和请求数据封装成数据包,然后将数据包发送给交换机,交换机再查看mac表,最终将数据包送达。如果A和B是第一次通信,那么Arp缓存表中是没有B的记录的,这时候A就会发送广播数据:
A发送广播数据包:
源mac:aa-aa-aa-aa-aa-aa
目标mac:FF:FF:FF:FF:FF:FF
内容:谁是192.168.1.3?请告诉我你的mac地址
交换机收到数据包:发现目标地址是广播地址,将数据内容发送给局域网内除了A以外的所有的电脑。
B收到广播后回复:
源mac:bb-bb-bb-bb-bb-bb
目标mac:aa-aa-aa-aa-aa-aa
内容:我是192.168.1.3,我的mac是bb-bb-bb-bb-bb-bb
A收到回复后会将B的mac添加到Arp缓存表中,这时候如果交换机中的mac表没有B的mac映射关系,则交换机会将该映射关系添加到mac表中。
继续深入,当接入的电脑越来越多,一个交换机已经满足不了需求,就需要多个交换机相连,但是这会使交换机中的mac表维护越来越困难,于是为了解决这一问题,又诞生了一个新设备,叫做路由器。
多台交换机连接在同一路由器上,路由器将这些交换机分割开,每台交换机组成的网络叫做子网,每台交换机只需维护所在子网内的mac表,跨子网数据直接丢给路由器处理。
那么,当A给B发送数据时怎么判断到底有没有跨子网呢?
靠子网掩码!A给B发送数据时会将A的IP地址和B的IP地址分别和子网掩码进行与运算,当运算结果相同即为同一子网,不相同则不在同一子网。与运算方法:二进制“同1则1,否则为0”,如:
A的IP:192.168.1.2和子网掩码255.255.255.0进行与运算:
11000000.10101000.00000001.00000010
&
11111111.11111111.11111111.00000000
11000000.10101000.00000001.00000000
即:192.168.1.0
B的IP:192.168.1.3和子网掩码255.255.255.0进行与运算:
11000000.10101000.00000001.00000010
&
11111111.11111111.11111111.00000000
11000000.10101000.00000001.00000000
即:192.168.1.0
A与B的运算结果相同,即在同一子网。其中192.168.1.0是目标网络(Destination)。
这里有一个快捷计算方法:子网掩码为255位置所对应的IP段相同则在同一子网,否则不在同一子网,因为0和任何数进行与运算都为0,所以子网掩码为0位置所对应的IP段无论怎么变最终的与运算结果都相同为0,所以只需保持255所对应的IP段一致即可。
如:
子网掩码为:255.255.255.0
192.168.2.25
192.168.2.37
255位置对应的IP段均为192.168.2,则俩IP在同一子网,因为0与25、37进行与运算结果均为0,最终结果都是192.168.2.0
上图中A与C通信时,A的数据传到路由器,路由器将数据包中的目标地址192.168.2.4与子网掩码255.255.255.0进行与运算来匹配最长前缀的目标网络(Destination)192.168.2.0,并选择与之对应的网络端口发送数据。
Destination Gateway Netmask Interface
192.168.1.0 0.0.0.0 255.255.255.0 eth0 # 直连子网1
192.168.2.0 0.0.0.0 255.255.255.0 eth1 # 直连子网2
0.0.0.0 203.0.113.1 0.0.0.0 eth2 # 默认路由