【扫盲系列】破玩意[0]:你管这破玩意叫网络

admin 2025年1月1日22:48:03评论19 views字数 5189阅读17分17秒阅读模式

破玩意[0]:你管这破玩意叫网络

假如你是一台电脑,名字就叫 A

【扫盲系列】破玩意[0]:你管这破玩意叫网络

这时候又来了一台电脑B,你们之间用一根网线一连。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

然后就可以这样突突突的聊天了

【扫盲系列】破玩意[0]:你管这破玩意叫网络

第一层

不久之后呢,又来了一台电脑C,那你们3个想要互相聊天给怎么办呢?
很简单嘛,你们每个人身上开两个网口,用三根网线一连就可以了

【扫盲系列】破玩意[0]:你管这破玩意叫网络

但是呢随着越来越多的人加入,你发现身上开的网口实在太多了,中间的网线也是密密麻麻,十分混乱,要是哪根连错了都不知道。(而实际上一台电脑根本开不了这么多网口,所以这种连线只在理论上可行,所以连不上的我就用红色虚线表示了,就是这么严谨哈哈~)

【扫盲系列】破玩意[0]:你管这破玩意叫网络

于是你们发明了一个中间设备,把各自的网线都插到这个设备上,然后再用这个设备做转发,这样网线多的问题就解决了。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

你给它取名叫集线器,它仅仅是无脑将传进来的一个数据包转发到所有出口(广播),不做任何处理,你觉得它是没有智商的,因此把人家定性在了物理层

【扫盲系列】破玩意[0]:你管这破玩意叫网络

有人可能会说了,假如A只想和B聊天,岂不是被所有人都看到了?而且大家也不知道是发给谁的!这还真让你说对了,这时候呢,你就想了个办法,给每个人都起了个新名字,叫MAC 地址

这样,A 在发送数据包给 B 时,只要发送的数据包前面加上从哪来到哪去这两个信息就可以了。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

B 在收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包的确是发给自己的,于是便收下

其他的 CDE 收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包并不是发给自己的,于是便丢弃

【扫盲系列】破玩意[0]:你管这破玩意叫网络

那有人又说了,这样也不太好呀,其他人还是能看到不属于自己的数据包。

第二层

如果把这个集线器弄得更智能一些,只发给目标 MAC 地址指向的那台电脑,就好了。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

这个神奇的设备很快就被你发明出来了,你把这东西叫做交换机。虽然长得差不多,但是呢稍稍有点智能,也正因为这一点点智能,你把它放在了另一个层级,数据链路层

【扫盲系列】破玩意[0]:你管这破玩意叫网络

交换机内部维护一张 MAC 地址表,记录着每一个 MAC 地址的设备,连接在其哪一个端口上。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

假如你仍然要发给 B 一个数据包,构造了如下的数据结构从网口出去。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

到达交换机时,交换机内部通过自己维护的 MAC 地址表,发现目标机器 B 的 MAC 地址 bb-bb-bb-bb-bb-bb 映射到了端口 1 上,于是把数据从 1 号端口发给了 B,完事~

你给这个通过这样传输方式而组成的小范围的网络,叫做以太网

这个时候又有人问了,最开始的时候这个 MAC 地址表是空的吧,是怎么一点点建立起来的呢?

那是因为交换机可以自己学习啊!

假如在 MAC 地址表为空时,你给 B 发送了如下数据

【扫盲系列】破玩意[0]:你管这破玩意叫网络

由于这个包从端口 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

过程如下

【扫盲系列】破玩意[0]:你管这破玩意叫网络

经过该网络中的机器不断地通信,交换机最终将 MAC 地址表建立完毕~

这说明一个极为深刻的道理:学习可以使我们进步!

【扫盲系列】破玩意[0]:你管这破玩意叫网络

随着机器数量越多,交换机的端口也不够了,这可怎么办呢?

聪明的你发现,只要将多个交换机连接起来,这个问题就轻而易举搞定~

【扫盲系列】破玩意[0]:你管这破玩意叫网络

但是你要注意,上面那根红色的线,最终在 MAC 地址表中可不是一条记录呀,而是要把 EFGH 这四台机器与该端口(端口6)的映射全部记录在表中。

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

左边的交换机

【扫盲系列】破玩意[0]:你管这破玩意叫网络

右边的交换机

【扫盲系列】破玩意[0]:你管这破玩意叫网络

随着电脑数量越来越多,MAC地址表越来越大,总会有一天出问题的,这可怎么办呢?

第三层

这个时候你仔细思考了一下,发现问题的根本在于,连出去的那根红色的网线,后面不知道有多少个设备不断地连接进来,从而使得地址表越来越大。

那我可不可以让那根红色的网线,接入一个新的设备,这个设备就跟电脑一样有自己独立的 MAC 地址,而且同时还能帮我把数据包做一次转发呢?

这个设备就是路由器,它的功能就是,作为一台独立的拥有 MAC 地址的设备,并且可以帮我把数据包做一次转发你把它定在了网络层。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

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

现在交换机的 MAC 地址表中,只需要多出一条 MAC 地址 ABAB 与其端口的映射关系,就可以成功把数据包转交给路由器了,后续事情都不用管。

那如何做到,把发送给CDEFGH.... 的数据包,统统先发送给路由器呢?

这个时候你想了一个巧妙的办法,在给这些电脑的MAC地址命名上做一些手脚。

假如电脑 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

【扫盲系列】破玩意[0]:你管这破玩意叫网络

这显然是不现实的。

既然固定的MAC地址不能改了,我们就给这些电脑起个新的随时都能更改的名字,姑且我们先用 32 位的0101编号,如:

11000000101010000000000000000001

你觉得有些不清晰,于是把它分成四个部分,中间用点相连。

11000000.10101000.00000000.00000001

你还觉得不清晰,于是把它转换成 10 进制。

192.168.0.1

最后你给了这个地址一个响亮的名字,IP 地址

现在每一台电脑,同时有自己的 MAC 地址,又有自己的 IP 地址,只不过 IP 地址是软件层面上的,可以随时修改,MAC 地址一般是无法修改的。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

如上图所示,假如我想要发送数据包给 ABCD 其中一台设备,不论哪一台,我都可以这样描述,"将 IP 地址为 192.168.0 开头的全部发送给到路由器,之后再怎么转发,交给它!",巧妙吧。

那交给路由器之后,路由器又是怎么把数据包准确转发给指定设备的呢?

我们先给上面的组网方式中的每一台设备,加上自己的 IP 地址

【扫盲系列】破玩意[0]:你管这破玩意叫网络

现在两个设备之间传输,除了加上数据链路层的头部之外,还要再增加一个网络层的头部。

假如 A 给 B 发送数据,由于它们直接连着交换机,所以 A 直接发出如下数据包即可,通过数据链路层就传输过去了,其实这里网络层没有体现出作用。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

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

A ~ 路由器这段的包如下:

【扫盲系列】破玩意[0]:你管这破玩意叫网络

路由器到 C 这段的包如下:

【扫盲系列】破玩意[0]:你管这破玩意叫网络

好了,上面说的两种情况(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 来说:

192.168.0.xxx 开头的,就算是在一个子网,否则就是在不同的子网。

那对于计算机来说,怎么表达这个意思呢?于是人们发明了子网掩码的概念

假如某台机器的子网掩码定为 255.255.255.0

这表示,将源 IP 与目的 IP 分别同这个子网掩码进行与运算,相等则是在一个子网,不相等就是在不同子网,就这么简单。

比如

【扫盲系列】破玩意[0]:你管这破玩意叫网络

那么 A 与 B 在同一个子网,C 与 D 在同一个子网,但是 A 与 C 就不在同一个子网,与 D 也不在同一个子网,以此类推。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

所以如果 A 给 C 发消息,A 和 C 的 IP 地址分别 & A 机器配置的子网掩码,发现不相等,则 A 认为 C 和自己不在同一个子网,于是把包发给路由器,就不管了,之后怎么转发,A 不关心

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

答案:在 A 上要设置默认网关

上一步 A 通过是否与 C 在同一个子网内,判断出自己应该把包发给路由器,那路由器的 IP 是多少呢?

其实说发给路由器不准确,应该说 A 会把包发给默认网关

默认网关,就是 A 在自己电脑里配置的一个 IP 地址,以便在发给不同子网的机器时,发给这个 IP 地址。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

仅此而已!

刚才说的都是 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

一开始的时候这个表是空的,电脑 A 为了知道电脑 B(192.168.0.2)的 MAC 地址,将会广播一条 arp 请求,B 收到请求后,带上自己的 MAC 地址给 A 一个响应。此时 A 便更新了自己的 arp 表。

这样通过大家不断广播 arp 请求,最终所有电脑里面都将 arp 缓存表更新完整。

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

答案:路由表

现在 A 要给 C 发数据包,已经可以成功发到路由器这里了,最后一个问题就是,路由器怎么知道,收到的这个数据包,该从自己的哪个端口出去,才能直接(或间接)地最终到达目的地 C 呢。

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

这个表就叫路由表

不同于 MAC 地址表的是,路由表并不是一对一这种明确关系,我们下面看一个路由表的结构。

【扫盲系列】破玩意[0]:你管这破玩意叫网络

我们学习一种新的表示方法,由于子网掩码其实就表示前多少位表示子网的网段,所以如 192.168.0.0(255.255.255.0) 也可以简写为 192.168.0.0/24

【扫盲系列】破玩意[0]:你管这破玩意叫网络

这就很好理解了,路由表就表示,192.168.0.xxx 这个子网下的,都转发到 0 号端口,192.168.1.xxx 这个子网下的,都转发到 1 号端口。下一跳列还没有值,我们先不管

配合着结构图来看(这里把子网掩码和默认网关都补齐了)图中 & 笔误,结果应该是 .0

【扫盲系列】破玩意[0]:你管这破玩意叫网络

总结一下

好了,总结一下,到目前为止就几条规则

从各个节点的视角来看

电脑视角

【扫盲系列】破玩意[0]:你管这破玩意叫网络

交换机视角:

【扫盲系列】破玩意[0]:你管这破玩意叫网络

路由器视角:

【扫盲系列】破玩意[0]:你管这破玩意叫网络

如果你嗅觉足够敏锐,你应该可以感受到下面这句话

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

涉及到的三张表分别是

【扫盲系列】破玩意[0]:你管这破玩意叫网络

这三张表是怎么来的

【扫盲系列】破玩意[0]:你管这破玩意叫网络

知道了以上这些,目前网络上两个节点是如何发送数据包的这个过程,就完全可以解释通了!

【扫盲系列】破玩意[0]:你管这破玩意叫网络

那接下来我们 趁热打铁一下,请做好 战斗 准备!

【扫盲系列】破玩意[0]:你管这破玩意叫网络

这时路由器 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]:你管这破玩意叫网络

思考一分钟...

详细过程动画描述:

【扫盲系列】破玩意[0]:你管这破玩意叫网络

你是不是以为到这里就结束了?

不,好戏才刚刚开始!

请休息一分钟,我们继续战斗!

经过刚刚的一番折腾,只要你知道另一位伙伴 B 的 IP 地址,且你们之间的网络是通的,无论多远,你都可以将一个数据包发送给你的伙伴 B
【扫盲系列】破玩意[0]:你管这破玩意叫网络
这就是物理层、数据链路层、网络层这三层所做的事情。
站在第四层的你,就可以不要脸地利用下三层所做的铺垫,随心所欲地发送数据,而不必担心找不到对方了。
【扫盲系列】破玩意[0]:你管这破玩意叫网络
虽然你此时还什么都没干,但你还是给自己这一层起了个响亮的名字,叫做传输层
你本以为自己所在的第四层万事大吉,啥事没有,但很快问题就接踵而至。

问题来了

前三层协议只能把数据包从一个主机搬到另外一台主机,但是,到了目的地以后,数据包具体交给哪个程序(进程)呢?

【扫盲系列】破玩意[0]:你管这破玩意叫网络

所以,你需要把通信的进程区分开来,于是就给每个进程分配一个数字编号,你给它起了一个响亮的名字:端口号

【扫盲系列】破玩意[0]:你管这破玩意叫网络

然后你在要发送的数据包上,增加了传输层的头部,源端口号目标端口号
【扫盲系列】破玩意[0]:你管这破玩意叫网络
OK,这样你将原本主机到主机的通信,升级为了进程和进程之间的通信

原文始发于微信公众号(利刃信安):【扫盲系列】破玩意[0]:你管这破玩意叫网络

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月1日22:48:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【扫盲系列】破玩意[0]:你管这破玩意叫网络https://cn-sec.com/archives/3568943.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息