两台电脑之间是如何通信的

1,138 阅读12分钟

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

两台电脑.jpg 数据传输:

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

三台电脑传输.gif

这就产生了疑问:

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

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

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

传输过程:

三台电脑传输-MAC.gif

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

集线器

传输过程:

四台电脑和集线器.gif

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

这产生了很多问题

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

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

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

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

交换机

传输过程:

四台电脑和交换机.gif

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

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

一阶段:

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

四台电脑和交换机之间数据传输.gif

二阶段:

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

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

四台电脑和交换机之间数据传输2.gif

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

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

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

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

多台电脑通过交换机互联.png

假设拓扑图如上,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信息 同一子网数据传输之路由器.gif 这便是完整的通过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,至此完成。

不同子网数据传输之路由器-压缩.gif

局域网

我们把上述互通的网络称作局域网,局域网内的网络设备是互通的,我们发现了这些特征

  1. 局域网内的设备ip都是唯一的
  2. ip都是192.168.x.x开头的

因为ip的总数是有限的,如果每台设备都是全球唯一的ip,这是不现实的,于是就划分了一些特别的网段

10.0.0.0/8
172.16.0.0/12
192.168.0.0/24

上述的ip规则不再此论述

所有的局域网都使用这些网段,所以局域网1有ip为192.168.0.2的设备,局域网2可能也有。这类的ip叫做私网ip,仅供单个局域网内通信使用。

与之对应的是公网ip,公网ip是全球唯一的,例如:100.100.100.1, 公网ip一般都由网络运营商(电信,联通等)来负责分配管理。家里的付费的宽带一般都是有一个唯一的公网ip。

因为公网ip是有唯一性,所以可以使用公网ip可以在互联网中进行相互通信,一个局域网可以使用同一个公网ip,这是怎么做到的呢,一个公网ip怎么可以同时为多台电脑进行传输数据呢?

这里就需要引出新的概念,端口号。

端口号

什么是端口号呢?

一台电脑就像一个科技园区一样,有各种各样的企业,可以支持广告咨询,也可以支持影视制作。端口号就是各个企业的门牌号。找到了门牌号也就找到了企业服务。对应的电脑术语

每台电脑都可以支持大量的服务,每个服务都监听着各自的端口号。所以发送的数据包中需要有目标的端口号,这样电脑接收到数据后,就会根据端口号,把数据转发给对应的服务。

端口号在网络传输中也起了关键的作用

局域网之间通信.jpg

局域网1和局域网2就像两个封闭的系统,对于局域网1来说只能够访问到局域网2的公网ip:100.100.100.2

我们一起来看准备发送的数据包:

  • 源端口号:系统会随机分配一个端口号,空闲没被其他程序占用的端口号
  • 目标端口号:想要访问C的服务的端口号:8080(这里先保留个疑问)
  • 源IP:本机A的私网IP
  • 目标IP:私网ip仅对局域网内生效,所以目标ip为局域网2的公网IP
  • 源MAC:本机A的MAC
  • 目标MAC:由于目标IP为公网IP,非同一个网段,所以目标MAC为网关(192.168.0.1)的MAC地址:R10
  • 数据包:真正的发送的数据

路由器怎么做到将私网的数据包发送到公共网络呢?

NAT

路由器不仅维护路由表,还会维护一张NAT表,该表记录着(私网ip:端口号 和 路由器公网ip:路由器端口号)的映射。

  1. 准备好数据包,将数据包发送到路由器
  2. 路由器收到A的数据包后,会随机分配一个端口号,例如:48302,将192.168.0.2:35501 - 100.100.100.1:48302 这个映射记录到表中。并更新数据包的源IP和源端口号,源IP更换为公网IP:100.100.100.1,源端口号更换为分配的端口号48302
  3. 路由器根据自身的路由表查找目标公网ip的映射关系,更新源MAC地址为W10(公网ip接口),同时更新目标MAC地址为X0(下一跳路由器的接口MAC地址),将数据包发到下一个路由器。

运营商给分配公网IP的同时会设置好路由表,有时候会使用缺省路由,0.0.0.0/0(可以匹配任意的IP) - X0(运营商设置的下一个路由器的MAC地址)。

局域网之间通信1.gif

关于MAC地址和IP地址传输变更的问题:

MAC地址在同一个广播域传输过程中是不变的,比如同一个子网内,在跨越广播域的时候会发生改变,跨子网或跨局域网。而IP地址在传输过程中是不会改变的(除NAT的时候)

接下来我们看数据包在经历运营商的传输和转发后,如何传输到C,

端口转发

路由器2接收到数据包后,怎么传输给C呢,数据包中没有C信息,只有一个目标的端口号8080,要完成数据转发,需要提前在路由器2中手动设置好端口转发,任何发送到8080端口的数据都会转发到192.168.0.2:8080。

  1. 数据包发往路由器2
  2. 路由器2接收到数据包,根据目标端口号8080,匹配到了关系映射, 更新数据包的目标IP:192.168.0.2,目标端口号:8080
  3. 根据ARP缓存表,更新数据包的目标MAC地址,根据路由表更新源MAC地址为:E20, 将数据通过E20接口发往C
  4. 电脑接收到数据包,根据端口号,将数据包转发给监听该端口号的文件服务

局域网之间通信2.gif