网卡的作用
计算机上有一个硬件设备叫网卡(一台计算机可能不止一个网卡),用来接受网络数据,然后再传递给上一层比如说服务器软件
tomcat
其实我们光知道服务器的IP地址还不行,我们还要知道其网卡地址,那为什么平时我们访问服务器只需要知道IP地址就可以了呢?
因为有东西自动帮我们根据IP地址解析出了网卡地址,只有知道了网卡地址之后我们才知道网络数据应该传给谁
计算机之间的通信基础
-
需要得知对方的
IP地址 -
最终是根据
MAC地址(网卡地址),输入数据到网卡,被网卡接收- 如果网卡发现数据的目标
MAC地址是自己,就会将数据传递给上一层进行处理 - 如果网卡发现数据的目标
MAC地址不是自己(用同轴电缆或者集线器连接的计算机可能会出现这种情况,即使网卡地址不是自己,也有可能接受到其它计算机发送过来的消息),就会将数据丢弃,不会将数据传递给上一层进行处理
- 如果网卡发现数据的目标
路由器的作用
路由器负责连接两个不同的网段
ARP协议和广播的简介
ARP协议,广播是在同一个网段中传播的,不同网段中是隔绝广播的
- 广播这个操作真的就像广播一样,向周围的机器都发送查询请求,直到找到与目标
IP地址一样的机器,该机器会把对应的网卡地址响应回去 - 发广播的目的:获取对方的
MAC地址 MAC地址全是1的请求代表它是一个广播请求,即在同一个网段的所有网卡都能接受到这个广播
计算机之间的连接方式 - 网线直连(交叉线)
- 在两个计算级首次通信之前,我们就算知道对方的
IP地址,但是在不知道其对应的网卡地址的情况下,并不能将网络数据发送过去。我们需要先通过ARP协议发送广播,获取到对方服务器的网卡MAC地址,这样才可以进行数据的传输 ARP是有缓存的,只要获取过了某一个IP对应的网卡地址,那么下一次再往这个IP地址发送请求消息的时候就可以直接发送过去
计算机之间的连接方式 - 同轴电缆
- 它使用的是半双工通信,即一条通道在同一时间只能进行单向的传输,比如A向B发数据,B就不能同时向A发送数据,不过这种方式现在已经被淘汰了
- 容易冲突,可能多台设备都在同时发送消息
- 不安全,容易被抓包
- 中间某个地方断了,整个网就会瘫掉
- 还有一种通信叫全双工通信,真正实现了我发给你的同时你也可以发给我,也是现在普及的方式
计算机之间的连接方式 - 集线器(Hub)
- 跟同轴电缆一样,也是半双工通信
- 容易冲突
- 不安全
- 跟同轴电缆一样没有智商,也就是说即使不是目标网卡,也有可能会受到请求消息
- 比同轴电缆好了一点就是:如果集线器或者某条线路出了问题,不会对其它计算机之间的通信造成影响
比如我们来说一下这幅图中计算机0是如何发送给计算机2的
- 首先因为一开始只知道计算机2的IP地址而不知道其网卡地址,所以需要用ARP广播得到网卡地址先
- 广播到集线器后,因为集线器没有智商,它会继续广播到计算机1和计算机2上对应的网卡上
- 由于计算机1上的网卡发现目标IP并不是自身,所以会将该消息丢弃掉
- 而计算机2发现要查询的IP地址的MAC地址就是自身,于是会响应MAC地址回去
- 响应消息要先经过集线器,然后集线器真的是没有智商,它只负责将各个计算机连接起来,然后它会把响应消息同时发送给计算机0和计算机1
- 计算机1的网卡识别到自己不是目标MAC地址,所以其依旧会丢弃数据
- 计算机0上的网卡识别到了消息就是发给自己的,于是接受下了消息,传递给了上层并将MAC地址缓存了起来,注意:集线器没有缓存功能,但是计算机有
- 有了MAC地址之后,计算机0又会按照协议发送请求消息,只不过现在的请求消息中携带了目标MAC地址
- 很遗憾的是,集线器依旧会把该请求消息传播到计算机0和计算机1处
- 计算机1识别到自己不是目标地址,丢弃消息;计算机2响应数据回去
- 集线器又会广播,还是同样的,计算机1丢弃消息,计算机0接受消息
- 并且计算机0上缓存的计算机2的MAC地址没有过期之前,向计算机2发送请求都不需要再进行ARP广播了
多台集线器相连接
集线器的端口是有限的,那么就代表着一台集线器能够连接的计算机数目是有限的,如果我们想要将多台计算机连接起来,可能就需要多个集线器进行相连(相同的设备用交叉线相连,不同的设备用的是直通线);跨集线器的计算机通信起来还是像以前一样,没有什么区别
我们想象,如果一台集线器连接了1000台计算机,那么ARP广播的时候每一条线路都要广播,计算机响应数据的时候也要经过集线器,同样要进行大规模的数据传递。这样就导致了很多无用的包出现在了网络上,又因为集线器是半双工通信的,这样就会大大占用了线路,从而导致效率问题
计算机之间的连接方式 - 网桥
- 能够通过自学习得知每个接口那侧的MAC地址,从而起到隔绝冲突域的作用
每次进行ARP广播或者发送请求,只要有消息经过了网桥,网桥都会把它在哪个方位以及其对应的MAC地址记录下来。这样的好处是什么呢?
比如现在是计算机6像计算机7发送消息,首先是进行ARP广播,由于现在网桥中还没有记忆,所以广播会经过网桥达到集线器0所在的区域,但是网桥会将计算机6所在的方位以及对应的MAC地址记录下来,计算机7响应回MAC地址的时候又会经过网桥,这样一来,网桥又记录了计算机7的MAC地址。等到计算机6真正向计算机7发送请求消息的时候,经过网桥时,由于此时网桥已经知道了计算机7在左边,所以并不会让这个消息继续传递到集线器0所在的区域,从而达到隔绝冲突域的目的,这样的好处就是,集线器1所在区域内部发送请求消息的时候,由于网络请求并不会到达集线器0所在区域,所以两个区域可以同时发送请求,提高了效率
但是这样子并没有从根本上去解决问题,因为在自己的区域内,集线器还是会傻瓜式的传播消息,还是会有冲突的情况发生,效率依旧很低下。
计算机的连接方式 - 交换机
交换机相当于是集线器和网桥的加强版,其不仅有很多的接口可以连接计算机,而且还像网桥一样有记忆功能可以记录每一个接口所对应的MAC地址
同一个网段就可以进行广播
- 相当于接口更多的网桥,其接口数量比网桥要多
- 全双工通信
- 在设备A发送消息给设备B的同时,其他的设备之间也可以相互进行通信
- 比集线器安全
- 在第一次需要广播的时候且交换机没有记录对应的MAC地址时,交换机还是会像集线器一样将消息扩散,但是这一次扩散会让交换机记录下要通信的两个设备对应的MAC地址。等到真正要发送请求消息的时候,交换机就可以直接将消息转移到目标MAC地址对应的网卡上,不会转发无意义的请求,所以效率会比集线器高很多,正因为如此,其它无关的网卡根本就不会接受到不属于它们的消息,一些安装在它们身上的抓包工具自然也不能进行抓包
- 那如果全球的设备都用交换机连接会怎么样呢?
- 首先一台交换机的连接是有数量限制的,那么可能就需要多台交换机互相连接,而且交换机进行广播必须要在一个网段下面,这样可能会导致IP地址不是很够,但这不是主要问题
- 比如说我们现在需要向美国的一台计算机进行通信,因为是第一次,需要ARP广播,这个广播就离谱了,因为全世界所有的计算机都会收到,如果此时又有其它的计算机需要进行广播,那么所有计算机又收到了,这种到处都是广播的情况被称之为广播 风暴,非常占用网络资源,效率十分低下
计算机之间的连接方式-路由器(Router)
网络直连、同轴电缆、集线器、网桥、交换机,与它们相连的设备必须要在同一网段,也就处在同一广播域下
路由器的作用:
- 可以在不同网段之间转发数据
- 同一个网段的计算机不要用路由器连接,用交换机就行了,路由器主要是用来让不同网段的设备进行通信的
- 隔绝广播域
- 一个广播不可以通过路由器达到另一个网段,因为路由器具有隔绝广播域的作用 主机发数据之前,首先会判断目标主机的IP地址跟它是否在同一个网段,有下面两种情况:
- 在一个网段:
- 通过
ARP广播获取MAC地址,然后通过交换机/集线器传递数据
- 通过
- 不在同一个网段:
- 首先我们不知道对方设备的
MAC地址,而路由器又是隔绝ARP广播的 - 所以我们只能借助网关(并不是一个计算机,但是其具有多个网卡,而且对应的
MAC地址在不同的网段)来实现数据的传输,所以我们得先通过ARP广播获取到路由器负责该网段的网关的MAC地址 - 通过
ARP广播获取路由器在相同网段下对应的MAC地址,然后与该网关进行数据通信 - 路由器接受到数据之后会根据目标
IP地址切换到目标设备所对应的网关 - 但是该网关并不知道目标设备的
MAC地址,所以要先通过ARP广播获取到目标设备的MAC地址 - 获取到
MAC地址之后,网关再将数据发送到目标设备的网卡中,这样发送数据的过程就完成了
- 首先我们不知道对方设备的
现在我们就可以回答为什么路由器两边连着同一个网段的设备的话,通信会出现问题了?
因为在发数据之前,我们的计算机会发现目标IP地址和我们在同一个网段,那么它将会去使用ARP广播获取目标设备上的MAC地址,而不是去问路由器对应网关的MAC地址,由于网关具有拦截广播的作用,所以根本就获取不到对应的MAC地址,自然通信起来就有问题了