电脑之间是如何通信的

电脑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,至此完成。
相关推荐
摇滚侠3 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
程序员小凯5 小时前
Spring Boot测试框架详解
java·spring boot·后端
你的人类朋友6 小时前
什么是断言?
前端·后端·安全
程序员小凯7 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存
i学长的猫7 小时前
Ruby on Rails 从0 开始入门到进阶到高级 - 10分钟速通版
后端·ruby on rails·ruby
用户21411832636028 小时前
别再为 Claude 付费!Codex + 免费模型 + cc-switch,多场景 AI 编程全搞定
后端
茯苓gao8 小时前
Django网站开发记录(一)配置Mniconda,Python虚拟环境,配置Django
后端·python·django
Cherry Zack8 小时前
Django视图进阶:快捷函数、装饰器与请求响应
后端·python·django
爱读源码的大都督9 小时前
为什么有了HTTP,还需要gPRC?
java·后端·架构
码事漫谈9 小时前
致软件新手的第一个项目指南:阶段、文档与破局之道
后端