当前位置:网络安全 > 插图|原来这就是互联网

插图|原来这就是互联网

  • 发布:2023-10-05 16:37

你是一台计算机,你的名字是A

很久以前,你没有连接到任何其他计算机,你是孤独的。

直到有一天,你想与另一台电脑B建立通信,于是你们各自打开一个网口,并用一根网线将它们连接起来。

1 {IMG_1: Ahr0CHM6LY9PBWCYMDIWLMNUYMXVZ3MUY2JSB2JSB2CVMTA5NJEWMDIXMDEVMTA5NjewMDixmjexMS0xnjg2itc1l nbuzw ==/}

我们如何通过网线将它们连接起来“通讯”呢?我可以告诉你IO、中断和缓冲区,但这不是你学习网络时应该关心的。

如果你感到困惑,要么研究操作系统如何处理网络IO,要么研究数据包如何被网卡转换成电信号并发送出去,或者干脆把它当作计算机中的小人。 拍摄~

无论如何,你们已经连接并且可以交流了。

一楼

有一天,新来了一个小伙伴C加入,但是聪明的你们很快就发现,你们可以各自打开两个网口,一共使用三根网线来连接彼此。

2 {IMG_2:Ahr0CHM6LY9PBWCYMDIWLMNUYMXVZ3MUY2JSB2JSB2CVMTA5NJEWMDIXMDEVMTA5NJEWMDIXMJEXMZIMY0XOTI5NDKYNTCXL nbuzw ==/}

随着越来越多的人加入,你发现身上的网口太多了,网线密密麻麻,混乱不堪。 (其实一台电脑不可能开放那么多网口,所以这种连接只是理论上可能的,所以我用红色虚线表示不能连接的连接,好严谨哈哈~)

所以你发明了一个中间设备。你把所有的网线都插到这个设备上,这个设备做转发,你们就可以互相通信了。本质上和之前是一样的,只是网口数量和网线数量有所不同。数字减少了,也不那么混乱了。

4 {IMG_4: Ahr0CHM6LY9PBWCYMDIWLMNUYMXVZ3MUY2JSB2JSB2CVMTA5NJEWMDIXMDEVTA5NJEWMDIXMDEXMJIZAXOS05Mdyzmje3os5WBBBBB mc =/}

你命名它hub ,它只是将电信号转发到所有插座(广播),没有任何大脑,不做任何处理,你认为它没有智商,所以我把它放在物理层

既然是转发到所有出口,那么四台BCDE机器如何知道数据包是否发送给它们呢?

首先,您需要为连接到交换机的所有设备命名。原来你的名字是ABCD,但现在你需要一个更专业的、全球唯一的名字作为标识符。您将这个更高端的名称称为MAC 地址

你的MAC地址是aa-aa-aa-aa-aa-aa,你伙伴b的MAC地址是bb-bb-bb-bb-bb-bb,以此类推,只要不重复即可。

这样,当A向B发送数据包时,只需要在包头中拼接这样的结构的数据即可。

B收到数据包后,根据包头中的目标MAC地址信息判断数据包确实是发给自己的,因此接受了

对方CDE收到数据包后,根据包头中的目标MAC地址信息判断该数据包不是发给自己的,因此丢弃

虽然集线器让整个布局变得更加简洁,但是我原本只想发送到计算机B的消息现在必须发送到所有连接到集线器的计算机,这既不安全也不节省网络资源。

二楼

如果这个集线器变得更智能并且只发送到目标MAC地址指向的计算机那就太好了。

虽然它与集线器仅略有不同,但它看起来很智能。你称这个东西为开关。正是因为这一点智能,你把它放到了另一个层面,数据链路层

8 {IMG_8:Ahr0Chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2JSB2CVMTA5NJEWMDIXMDEVTA5NJEWMDIXMDEXMDGWMS00NDU2NZY3NZY3NZUUCG 5n/}

如上图所示,这就是你的设计方式。

交换机内部维护着一个MAC地址表,记录每个具有MAC地址的设备连接到哪个端口。

MAC 地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 3
aa-aa-aa-aa-aa-aa 4
dd-dd-dd-dd-dd-dd 5

如果还想向B发送数据包,则构造如下数据结构,并从网口发送出去。

到达交换机时,交换机内部使用自己维护的MAC地址表,发现目标机B的MAC地址bb-bb-bb-bb-bb-bb映射到端口1,所以数据从端口1发送到B,完成~

你给这个由这种传输方式组成的小规模网络称为以太网

当然一开始,MAC地址表是空的。是如何逐渐建立起来的?

如果 MAC 地址表为空,则将以下数据发送到 B

由于这个数据包是从端口4进入交换机的,所以交换机此时可以记录MAC地址表中的第一条数据:

MAC:aa-aa-aa-aa-aa-aa-aa
端口:4

交换机看到目标MAC地址(bb-bb-bb-bb-bb-bb)在地址表中没有映射关系,于是将该数据包发送到所有端口,即,到所有机器。

后,只有机器B收到了确实发给自己的数据包,因此做出了响应。响应数据从端口1进入交换机,因此交换机更新了地址表中的第二个地址。数据:

MAC:bb-bb-bb-bb-bb-bb
端口:1

流程如下

1 {IMG_11:Ahr0Chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2CVMTA5NJEWMYMDIXMDEVTA5NJEWMDIXMZEXMDG5OC04NZQ1NZI0NJCU Z2LM/}

网络中的机器继续通信后,交换机终于完成了MAC地址表的建立~

随着机器数量的增加,交换机的端口不够用了,但是如果你聪明的话,你会发现只要连接多台交换机,这个问题就可以轻松解决~

根本不需要额外设计什么,只需要按照之前的设计和规则,按照上面的接线方式就可以完成所有电脑的互连,所以这个开关设计的规则真是巧妙。想想为什么(例如,A 要发送数据给 F)。

但是你一定要注意。上面的红线并不是MAC地址表中的记录。相反,四台 EFGH 机器与端口(端口 6)之间的所有映射都必须记录在表中。 。

最终,两个交换机将分别记录所有机器A ~ H的映射记录

左边的开关

MAC 地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 3
aa-aa-aa-aa-aa-aa 4
dd-dd-dd-dd-dd-dd 5
ee-ee-ee-ee-ee-ee 6
ff-ff-ff-ff-ff-ff 6
gg-gg-gg-gg-gg-gg 6
hh-hh-hh-hh-hh-hh 6

右侧开关

MAC 地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 1
aa-aa-aa-aa-aa-aa 1
dd-dd-dd-dd-dd-dd 1
ee-ee-ee-ee-ee-ee 2
ff-ff-ff-ff-ff-ff 3
gg-gg-gg-gg-gg-gg 4
hh-hh-hh-hh-hh-hh 6

当只有8台计算机时,甚至只有几百台计算机时,这样就可以了,所以这种交换机设计已经足够使用一段时间了。

但不幸的是,人都是贪婪的动物。很快,计算机的数量增长到数千、数万、数十万。

三楼

交换机已经无法记录如此庞大的映射关系了。

这时候你动动脑子,发现问题的根源在于红色网线连接了出去,而且你不知道有多少设备在连续连接着回来,这使得地址表变得更大。

然后我可以将红色网线连接到新设备。这个设备就像电脑一样有自己独立的MAC地址,而且还可以帮我转发一次数据包

这个设备是一个路由器,它的作用是作为一个有MAC地址的独立设备,它可以帮我转发一次数据包你把它设置在网络层。

注意路由器的每个端口都有独立的MAC地址

好了,现在交换机的MAC地址表中,只需要多一份MAC地址ABAB与其端口的映射关系,就可以成功地将数据包传输到路由器了。这个做完了。

怎么办,把发给C、D的数据包,甚至发给DEFGH的数据包都先发给路由器?

这样的想法并不难想到。如果计算机C和D的MAC地址具有相同的前缀,例如,它们是

C 的 MAC 地址:FFFF-FFFF-CCCC
D 的 MAC 地址:FFFF-FFFF-DDDD

那么我们可以说目的MAC地址是FFFF-FFFF-?开头的都先发送到路由器。

这样可行吗?答案是否定的。

我们先从现实中MAC地址的结构开始吧。 MAC地址也称为物理地址、硬件地址。它的长度是 48 位。一般是这样表达的

00-16-EA-AE-3C-40

它是网络设备制造商生产时烧录到网卡中的EPROM(通常可以通过程序擦除的闪存芯片)。其中(00-16-EA)前24位代表网络硬件制造商编号,后24位(AE-3C-40)由制造商自行分配,一般表示网络硬件制造商的编号。序列号。 只要你不改变你的MAC地址,MAC地址在全球都是唯一的。形象地说,MAC地址就像身份证上的身份证号码一样,具有唯一性。

如果要将目标MAC地址表示为上面的FFFF-FFFF-怎么办?开头的是从路由器发出去给某一组设备(后面会提到这个其实就是子网的概念),那么就需要要求某个子网内的所有设备都去购买制造的设备一个厂家生产的MAC地址,或者您可以在生产网络设备和烧录MAC地址时,需要要求厂家按照您规划的子网结构提前设置好MAC地址,并且以后这个网络的结构不能轻易改变。

这显然是不现实的。

于是你发明了一个新的地址,并给每台机器一个32位的数字,如:

11000000101010000000000000000001

你觉得有点不清楚,就分成四部分,中间用点连接起来。

11000000.10101000.00000000.00000001

你还是觉得不太清楚,那就转成十进制吧。

192.168.0.1

最后你给这个地址起了一个朗朗上口的名字,IP地址。现在每台计算机都有自己的MAC地址和IP地址。但是,IP 地址位于软件级别,可以随时修改。 MAC地址一般不能修改。

这样一个可以随时修改的IP地址,可以根据你规划的网络拓扑进行调整。

如上图所示,如果我要向其中一台ABCD设备发送数据包,无论是哪一台,我都可以这样描述,“发送所有以192.168开头的IP地址。 0到Router,以后怎么转发,交给它吧!”,聪明点。

交给路由器后,路由器如何将数据包准确转发到指定设备呢?

别担心,我们慢慢来。

我们先为上述组网方式中的各个设备添加自己的IP地址

现在两个设备之间传输时,除了添加数据链路层的报头外,还必须添加网络层的报头。

如果A向B发送数据,由于它们是直连交换机的,所以A可以直接发送下面的数据包。事实上,网络层并没有体现出效果。

但是如果A向C发送数据,A需要先传输给路由器,然后路由器再传输给C。由于最底层的传输仍然依赖以太网,所以数据包被分成两段。

A ~ 路由器部分的数据包如下:

从路由器到C的数据包如下:

好啦,对于上面提到的两种情况(A->B,A->C),相信细心的读者会有很多疑问。让我们一一展开。

A向C发送了一个数据包,它如何知道是否需要通过路由器转发?

答案:子网

如果源IP和目的IP在同一子网,则直接通过交换机发送数据包。

如果源IP和目的IP不在同一子网,则让路由器处理。

好吧,现在我们只需要弄清楚在子网中意味着什么。

  • 192.168.0.1 和 192.168.0.2 位于同一子网

  • 192.168.0.1 和 192.168.1.1 位于不同子网

这两个是我们人为指定的,即对于192.168.0.1我们要表达的是:

如果以

www.sychzs.cn开头,则认为在同一个子网中,否则认为在不同子网中。

如何将其表达给计算机?于是人们发明了子网掩码

的概念

如果某台机器的子网掩码设置为255.255.255.0

这意味着源 IP 和目标 IP 与此子网掩码 AND 运算。如果相等,则它们在一个子网中,如果不相等,则它们在不同的子网中,就这么简单。

例如

  • 计算机:192.168.0.1 & 255.255.255.0 = 192.168.0.0

  • B计算机:192.168.0.2 & 255.255.255.0 = 192.168.0.0

  • C 计算机:192.168.1.1 & 255.255.255.0 = 192.168.1.0

  • D 计算机:192.168.1.2 & 255.255.255.0 = 192.168.1.0

则A和B在同一个子网,C和D在同一个子网,但是A和C不在同一个子网,D也不在同一个子网,以此类推。

所以如果A向C发送消息,并且A和C的IP地址不等于A机器上配置的子网掩码,则A认为C和自己不在同一子网中,所以它发送数据包到路由器。我不在乎,之后怎么转发,A不在乎

A 如何知道哪个设备是路由器?

答案:在A

上设置默认网关

上一步A通过检查是否与C在同一子网来确定应该将数据包发送到路由器。路由器的IP是多少?

其实说是发送到路由器并不准确。应该说A会将数据包发送到默认网关

对于A来说,A只能直接将数据包发送到同一子网中的IP,所以无论是发送到路由器还是发送到某台计算机,对于A来说都没有关系,因为只要设备有 IP 地址。

所以默认网关是A在自己电脑上配置的一个IP地址,这样他发送到不同子网的机器时就可以发送到这个IP地址。

就这样!

路由器如何知道C在哪里?

答案:路由表

现在A想要向C发送一个数据包,并且可以成功发送到路由器。最后一个问题是,路由器如何知道接收到的数据包应该从自己的哪个端口出去,最终能否直接(或间接)到达目的地C。

路由器收到的数据包有一个目的IP,就是C的IP地址,需要转换成从哪个端口出去。人们很容易想到应该有一个表,就像MAC地址表一样。

此表称为 路由表

至于这个路由表是怎么出来的,有很多种路由算法。本文就不展开了,因为我也不知道怎么做哈哈~

与MAC地址表不同,路由表没有明确的一对一关系。让我们看一下路由表的结构。

目的地址子网掩码下一跳端口
192.168.0.0 255.255.255.0 0
192.168.0.254 255.255.255.255 0
192.168.1.0 255.255.255.0 1
192.168.1.254 255.255.255.255 1

我们学习了一种新的表示方法。由于子网掩码实际上表示的是表示子网网段的前几位数字,所以192.168.0.0(255.255.255.0)也可以缩写为192.168.0.0/24

目的地址下一跳端口
192.168.0.0/24 0
192.168.0.254/32 0
192.168.1.0/24 1
192.168.1.254/32 1

这个很容易理解。路由表显示子网 www.sychzs.cn 下的所有内容都转发到端口 0,子网 www.sychzs.cn 下的所有内容都转发到端口 0.端口 1。下一跳列还没有值,我们暂时忽略它

看结构图(子网掩码和默认网关都在这里完成了)

刚才讲的是IP层,但是发送数据包的数据链路层需要知道MAC地址,但是如果只知道IP地址怎么办?

答案:arp

如果您 (A) 不知道 您伙伴 B 的 MAC 地址(您实际上不知道,我们只是假设它已知),并且您只知道其 IP 地址,你应该如何准确的将数据包传输给B呢?

答案很简单。在网络层,需要找到IP地址对应的MAC地址,即通过某种方式找到192.168.0.2对应的MAC地址BBBB

这个方法就是arp协议。同时,计算机A和B也会有一个arp缓存表,记录着IP和MAC地址对应关系。

IP 地址MAC 地址
192.168.0.2 BBBB
一开始,这张桌子是空的。为了知道计算机B的MAC地址(192.168.0.2),计算机A将广播一个ARP请求。请求后,带上你的MAC地址,给A一个回复。这时,A更新了它的arp表。

这样,大家不断地广播arp请求,最终所有计算机都会彻底更新arp缓存表。

总结一下

好吧,总结一下,到目前为止只有一些规则

从各个节点来看

电脑视角

  • 首先我需要知道我的IP和对方的IP

  • 使用子网掩码判断我们是否在同一个子网

  • 同一子网,通过arp获取对方mac地址,直接扔掉

  • 如果不在同一个子网,通过arp获取默认网关的mac地址,直接扔掉

切换视角:

  • 我收到的数据包必须有目标MAC地址

  • 通过MAC地址表查看映射关系

  • 一旦找到就会按照映射关系从我指定的端口发送

  • 找不到的话,所有端口都会发出来

路由器视角:

  • 我收到的数据包必须有目标IP地址

  • 通过路由表查看映射关系

  • 一旦找到就会按照映射关系从我指定的端口发出(不在任何子网范围内,路由器的默认网关也能找到)

  • 如果找不到,会返回路由不可达的数据包

如果你的嗅觉够敏锐,应该能感觉到下面这句话:

网络层(IP协议)本身没有传输数据包的功能。数据包的实际传输委托给数据链路层(以太网中的交换机)。

涉及的三个表分别是

  • 交换机中有一个 MAC 地址 表,用于映射 MAC 地址及其端口

  • 路由器中有一个 路由表 用于映射 IP 地址(网段)及其端口

  • 电脑和路由器都有 arp缓存表用于缓存IP和MAC地址的映射关系

这三张桌子是从哪里来的

  • 以太网中的节点之间通过交换机不断进行通信,不断完善MAC地址表。

  • 通过各种路由算法+手动配置逐步完善路由表。

  • arp缓存表是通过arp协议的请求逐步完善的。

知道了以上,就可以完整解释当前网络上两个节点如何发送数据包的过程了!

2 {IMG_22:Ahr0Chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2CVMTA5NjewMDIXMDEVMTA5NJEWMDIXMDEXMZE2MTCZOTE1MY0XOTI5odi2mdiw Lnbuzw ==/}

那就放本章最后一张 网络拓扑图,请做好战斗

2 {IMG_23:Ahr0chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2CVMTA5NJEWMYMDIXMDEVMTA5NJEWMDIXMZEXMDE4MY0XMZY5ODK3M​​JYU CG5N/}

此时,路由器1连接到了路由器2,所以它的路由表就有了下一个地址的概念,所以它的路由表就变成这样了。如果匹配到有下一跳地址的项,则需要再次匹配,找到其端口,找到下一跳IP的MAC地址。

也就是说,找了一圈之后,一定要映射到一个端口号,然后数据包就从这个端口号发出去。

目的地址下一跳端口
192.168.0.0/24 0
192.168.0.254/32 0
192.168.1.0/24 1
192.168.1.254/32 1
192.168.2.0/24 192.168.100.5
192.168.100.0/24 2
192.168.100.4/32 2

此时,如果A向F发送数据包,能通过吗?如果是的话,整个过程是怎样的?

想一想...

详细流程动画说明:

详细流程文字说明:

? .0.254)

2. A通过ARP查找到默认网关192.168.0.254的MAC地址。

3.A 将源 MAC 地址(AAAA)和网关 MAC 地址(ABAB)封装在数据链路层报文头中,然后封装源 IP 地址(192.168.0.1)和目的 IP 地址(192.168.1)。 2.2 ) (注意,千万不要以为这里填写的是默认网关的IP地址,这个数据包的两个IP地址自始至终都没有变化,只有MAC地址在不断变化。)封装在网络层头部,然后Dispatch

2 {IMG_26:Ahr0Chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2CVMTA5NJEWMYMDIXMDEVMTA5NJEWMDIXMZEXMDA3NJA4MDI5NJCU CG5N/}

4. 交换机1收到数据包后,发现目标MAC地址为ABAB,转发给路由器1

6. 所以此时Router 1需要做两件事。首先是重新匹配路由表。发现匹配的端口为2,于是将其封装到数据链路层,最后将数据包从2号发出。

7. 此时,Router 2 收到数据包,发现其目的地址为 192.168.2.2。查询路由表发现端口号为1,准备将数据包从端口1发送出去。

8.但此时Router 2需要知道192.168.2.2的MAC地址,于是检查其arp缓存,发现其MAC地址为FFFF,将其封装在数据链路层报头中,从 1 开始 端口号用于将数据包发送出去。

9. 交换机3收到数据包,发现目的MAC地址为FFFF。它检查了自己的MAC地址表,发现自己应该从6号端口出去,于是就将数据包从6号端口发出去。

10. F 终于收到包裹了! 并且发现目的地MAC地址是自己,于是他收下了包裹

更细致、更精准的流程:

相信大家看完这篇都累了。了解了上面的流程就基本上清楚了网络层以下的一些主要流程。如果想要更专业的这个过程的流程描述,可以公众号低并发编程后台回复网络,获取我模拟这个过程的Cisco Packet Tracer源文件。

2 {IMG_27:Ahr0Chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2CVMTA5NjewMDixmDevMTA5NjewyMDixmzemjCZEWOTUXMTGU CG5N/}

数据包传输的每一步都会有每一层的原始数据和专业的流程描述

同时,在此基础上,你还可以设计自己的网络拓扑,并进行各种实验,加深对网络传输过程的理解。

后记

至此,经过物理层、数据链路层、网络层这前三层的协议,以及根据这些协议设计的各种网络设备(网线、集线器、交换机、路由器),理论上只要拥有对方的 IP 地址,就已经将地球上任意位置的两个节点连通了。

本文经过了很多次的修改,删减了不少影响主流程的内容,就是为了让读者能抓住网络传输前三层的真正核心思想。同时网络相关的知识也是多且杂,我也还有很多搞不清楚的地方,非常欢迎大家与我交流,共同进步。

相关文章