如何设计网络?(微信公众号低并发编程)
一台电脑孤苦伶仃,两台电脑如何实现通信?很自然地想到在2台电脑之间连一根网线,![](https://i-blog.csdnimg.cn/blog_migrate/b8640c346e63115982863eac7e369f90.png)
第一层:当有3台电脑时,自然想到 当电脑越来越多,需要越来越多的网线,网线太密集了,且网口也太多了,
这时我们想到把这些混乱的线集中放在一个设备中,由这个设备集中转发,这样网口、网线数量就没那么多了,看上去也比较舒服。
这个设备就叫做集线器。它只是将电信号无脑地转发到所有出口(不做任何处理),做的工作比较傻瓜,就把它定义在了物理层。
由于转发到了所有出口,那计算机如何知道数据包是不是发给自己的呢?现在就需要给每个计算机分配一个更高端的名字称为MAC地址(全局唯一的名字)。加入你的MAC地址是 aa-aa-aa-aa-aa,你的伙伴MAC地址是 bb-bb-bb-bb-bb-bb,以此类推,不重复就好。你在给他发送数据包时在头部拼接一个这样结构的数据,
他在收到数据包后,根据MAC地址信息,判断这个数据包的信息发给自己的,就收下。其他发现数据包不是发给自己的,就丢弃。 这种方式会有安全问题,也不节省网络资源。
第二层:要是有一种设备收到数据包之后,就知道要发给谁就好了,这种工作稍微智能化一点,把它定义在数据链路层,这种设备叫交换机。可是交换机收到数据表怎么知道要发给谁呢?在交换机中有一张表,叫MAC地址表,上面标明了每台计算的MAC地址以及端口。你发送出了一个数据包,达到交换机,发现目标机器的MAC地址被映射到了端口1上,于是把数据从1号端口发给了目标机器。通过这样传输方式而组成的小网络叫作以太网。
但是,这样的MAC地址表如何建立起来?过程大概像第一层的方式,根据目标MAC地址,如果哪个端口有相应,就把这个端口和目标MAC地址写进表中。
当计算机再增多,交换机的端口也不够用了,又想到交换机之间的互联。
左边的交换机
右边的交换机
当计算机数量增多时,这种方式也不太好了
第三层:可不可以把两个交换机之间的线换成一个有自己MAC地址,并且能转发数据包的设备?把这个设备定义为路由器,定义在网络层。
每个路由器都有自己的MAC地址表!
路由器也有路由表,路由表根据路由协议制定,比较难,一般都会直接给出。
假设A发给F:1.A 的IP地址和F的IP地址与子网掩码相与,发现不相等,A将数据包发给默认网关。
2.A通过ARP协议找到默认网关的MAC地址ABAB。
3.A将源MAC地址与网关MAC地址封装在数据链路层头部。
4.交换机收到数据包后,发现目标MAC是ABAB,转发给路由器1
5.路由器1收到数据包后,发现目标IP,查看路由表,发现下一跳地址是192.168.100.5
6.查看路由表,发现匹配到端口2,将端口2MAC地址封装在数据链路层,再把包从端口2发出去。
7.路由器2收到数据包后,发现目标IP,查看路由表,匹配到端口1,数据包由端口1发出去。
8. 此时路由器2需要知道192.18.2.2的MAC地址,查看其arp缓存,找到其MAC地址为FFF,将其封装在数据链路层头部,并从端口1发送数据包。
9.交换机3收到了数据包,发现目标MAC地址是FFF,查寻其MAC地址表,匹配到端口6,于是从6号端口发送数据包。
10.最终F收到了数据包!并且发现目标MAC地址就是自己,于是收下了这个包。
总结:电脑视角:首先要知道发送方和接收方的IP
通过子网掩码判断二者是否在同一个子网
在同一个子网,就查看ARP缓存表,获取接收方的MAC地址,扔出去
不在同一个子网,就通过ARP获取默认网关的MAC地址直接扔出去
交换机视角:收到的数据包必须有目标MAC地址
通过MAC地址表查看映射关系
查到了就从对应的端口发出去
查不到就说有端口发出去
路由器视角:收到的数据包必须含有目标IP地址
通过路由表查看映射关系
查到了就从对应端口发出去
查不到就返回一个路由不可到达的数据包