电脑之间是如何通信的

电脑A和B,通过网线进行连接

数据传输:

继续扩展,三台电脑呢,A向B传输数据:

这就产生了疑问:

  1. 为什么数据要在两个网线上都传输呢,不能直接发送给B吗?
  2. B和C都收到了数据,这不传错了吗?

如同寄快递一样,有效的快递包裹,有寄件和收件地址。每台电脑出厂都有自己的身份证号,叫做MAC地址。发送数据前,得人为的获取到B的MAC地址(有专门的获取方式)。将信息加到数据包中,一起传输。

数据包整理好之后,A也并不知道网线的另一端是谁,所以只能全部发送(术语广播),B和C都会接收到数据。B和C可以识别到数据包中的目标MAC地址,B发现是自己的地址,则接受,C发现不是自己的地址选择忽略。

传输过程:

如果100台电脑需要相互通信,不可能每台电脑同时插100根网线,硬件也无法支持,于是出现了集线器(也叫HUB),负责转发电信号。

集线器

传输过程:

集线器只能转发电信号,所以A发送数据包到B,集线器要将数据包对所有的接口进行发送(包括来源的A)

这产生了很多问题

  1. 任一的电脑总是会收到与自己无关的数据包,要进行忽略处理(占用电脑资源)

  2. 网线中同一时间能够传输的数据包是有上限的(硬件设施的能力上限)。线路中存在大量的广播数据,有效的数据占比低,如果大量的数据要通过集线器传输,就会变得很困难。

  3. 如果A->B,C->D同时发送数据包到集线器,两个数据包会碰到一起,这就是数据碰撞。集线器无法处理转发,只能广播告诉所有电脑有数据碰撞了,你们得重新发送数据包了。可见数据传输效率很低。

怎么优化呢,于是出现了交换机

交换机

传输过程:

交换机可以把数据包直接转发到连接B的网线接口,至于交换机如何获取到MAC的映射包?上图只是一个最终的版本,实际上交换机完成数据传输需经历以下两个阶段

交换机自身会维护一个MAC地址和它的网线接口的映射表,初始为空

一阶段:

  1. 电脑A把数据包发往交换机
  2. 交换机将A的MAC地址和接口对应关系,加入到它的映射表中
  3. 由于映射表并没有B的映射关系,所以需要泛洪(将数据包发往除了A网线的所有其他接口)
  4. 电脑B接收到数据包,其他电脑由于数据包与各自MAC不匹配则忽略数据。

二阶段:

随着电脑之间的不断发送数据,交换机的映射表就会存有所有映射关系,发送数据就变成以下方式

  1. 电脑A把数据包发往交换机
  2. 交换机查询到了目标B的MAC地址映射信息
  3. 交换机将数据从接口2发往B
  4. 电脑B接收到数据

所以在双方通过交换机相互发送过数据一次之后,交换机就可以固定线路转发数据。

所以我们发现相比于集线器来说:

  1. 广播的数据变少了,只有初始阶段的时候需要。电脑绝大部分都是处理与自己相关的数据
  2. 电脑都是与交换机不同的接口进行连接。同一时间A->B, C->D的数据不会有碰撞了,属于不同的接口。交换机直接进行了转发处理,网络利用率有了很高的提升。

随着电脑的不断增多,一台交换机已经不够了,这我们就想,那就多增加交换机,这可以解决吗?

假设拓扑图如上,12台电脑通过4台交换机互联。 电脑A向电脑J发送数据,由于交换机1不与J直连所以不会有J的MAC地址则进行泛洪,数据发送到交换机2,交换机2也需要进行泛洪,同样交换机3也是如此,交换机4有可能有J的MAC信息,泛洪或者转发给J。

电脑A给电脑J发送数据,要进行多次泛洪,就算是各个交换机维护了各自的MAC映射表,下一次的数据传输,还是要进行泛洪, 这样会带来几个问题

  1. 数据的传输效率过低,无法进行直接转发

  2. 大量的无效数据包占用着线路。线路利用率低,也会导致线路拥塞,无法传输正常数据包。类似于集线器。

  3. 如果继续扩展,成千山万台电脑通过该类拓扑连接,电脑之间将无法通信。

那么大量的电脑该怎么如何进行通信呢?

仅仅通过MAC地址已经无法做到有效的跨交换机通信,这里就要新引出新的概念,ip和路由器。

路由器

ip是一串有规则的数字,例如:192.169.0.2, 我们给互联的每台电脑都设置ip 先看一个有趣的事情,电脑可以通过ip自动帮我们寻找目标的MAC地址,这样不需要人为的去找目标电脑的MAC地址来加到数据包,这就是所谓的ARP协议。

传输过程:

每台电脑都有一个arp缓存表,用来记录其他电脑的ip和MAC的对应关系

  1. 准备数据包,由于本机的ARP缓存表中没有B的MAC地址,所以会特殊发送ARP数据包,该数据包中的目标MAC设置为00
  2. 数据包发往交换机1,交换机1 由于00的特殊地址,于是进行泛洪
  3. B接收到数据后,ARP表存储A的IP-MAC信息后,发送ARP回复包给A。回复包中目标MAC地址为AA,所以进行单播
  4. A接收到回复包后,添加B的IP-MAC信息,并重新更新初始的数据包中的MAC信息 这便是完整的通过ip获取MAC地址的ARP协议。

于是A发送数据包给B,在IPP的帮助下,电脑会自动根据IP获取B的MAC信息,来补全数据包,补全后就是单交换机下A与B的通信。

那么A向D如何发送数据包呢?目前我们只是发现路由器的作用是给电脑设置IP,还有其他的作用吗?

这里我们引入一些概念。

子网:图中路由器设置了两个网段,网段1:192.168.0.0/24,网段2:192.168.1.0/24,只要是192.168.0.x这个规则的ip都属于网段1(x最大值为255),显然,A,B,C属于网段1,D,E,F属于网段2,同一个网段内可以直接相互通信,如同上文描述,不同网段直接需要路由器进行转发来实现。

网关:路由器的接口E0和E1 都有自己的ip,192.168.0.1和192.168.1.1,这就是网关ip,网段1的网关ip为192.168.0.1,该网段下的每台电脑上都存储了这个网关ip信息。

处于不同网段的A和D的通信流程如下:

  1. 准备数据包,由于A和D处于不同的网段,不能直接通信,数据的转发需要有路由器处理,所以将目标的MAC地址设置为网关(192.168.0.1)的MAC地址(这里省略了一个环节,A通过APR获取到网关的MAC,假设之前已经获取过)
  2. 交换机1接收到数据包,根据自身的MAC映射表,将数据包转发给路由器接口E0。 3. 路由器收到数据包后,增加A的IP-MAC关系到ARP缓存表。缓存表中并没有D的MAC信息,识别到D的ip属于网段192.168.1.0/24,使用接口E1,于是发出ARP数据包寻找D的MAC
  3. D收到ARP包后,将网关IP-MAC增加到ARP缓存表,并发送ARP回复包给网关E1
  4. 路由器收到ARP回复包后在ARP缓存表增加D的信息。并将原始数据包中的目标MAC更新为D的MAC地址
  5. 路由器将完整的数据包,通过E1接口发送。通过交换机传输到D,至此完成。
相关推荐
海绵波波1071 小时前
flask后端开发(10):问答平台项目结构搭建
后端·python·flask
网络风云2 小时前
【魅力golang】之-反射
开发语言·后端·golang
Q_19284999062 小时前
基于Spring Boot的电影售票系统
java·spring boot·后端
运维&陈同学3 小时前
【Kibana01】企业级日志分析系统ELK之Kibana的安装与介绍
运维·后端·elk·elasticsearch·云原生·自动化·kibana·日志收集
Javatutouhouduan6 小时前
如何系统全面地自学Java语言?
java·后端·程序员·编程·架构师·自学·java八股文
后端转全栈_小伵6 小时前
MySQL外键类型与应用场景总结:优缺点一目了然
数据库·后端·sql·mysql·学习方法
编码浪子7 小时前
Springboot高并发乐观锁
后端·restful
uccs7 小时前
go 第三方库源码解读---go-errorlint
后端·go
Mr.朱鹏7 小时前
操作002:HelloWorld
java·后端·spring·rabbitmq·maven·intellij-idea·java-rabbitmq
编程洪同学9 小时前
Spring Boot 中实现自定义注解记录接口日志功能
android·java·spring boot·后端