2-0-如果让你来设计网络

通信

你是一台电脑,你的名字叫 A

很久很久之前,你不与任何其他电脑相连接,孤苦伶仃。

image-20220121143738195

直到有一天,你希望与另一台电脑 B 建立通信,于是你们各开了一个网口,用一根 网线 连接了起来。

image-20220121143743508

至于为什么插网线就可以通信了,这个无须关心了,大概理解就是电脑A的数据包被网卡转为电信号,发送给了电脑B。

gun-net

此时,你们俩可以通信了。

集线器

一个新伙伴 C 加入了,但聪明的你们很快发现,可以每个人开两个网口,用一共三根网线,彼此相连。

image-20220121143913590

随着越来越多的人加入,你发现身上开的网口实在太多了,而且网线密密麻麻,混乱不堪。

(而实际上一台电脑根本开不了这么多网口,所以这种连线只在理论上可行,所以连不上的我就用红色虚线表示了,就是这么严谨哈哈~)

image-20220121143944277

于是你们发明了一个 中间设备 ,你们将网线都插到这个设备上,由这个设备做转发,就可以彼此之间通信了,本质上和原来一样,只不过网口的数量和网线的数量减少了,不再那么混乱。

image-20220121144030958

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

640

MAC地址

由于转发到了所有出口,那 BCDE 四台机器怎么知道数据包是不是发给自己的呢?

首先,你要给所有的连接到集线器的设备,都起个名字。

原来你们叫 ABCD,但现在需要一个更专业的,全局唯一的名字作为标识,你把这个更高端的名字称为 MAC 地址

数据包

你的 MAC 地址是 aa-aa-aa-aa-aa-aa,你的伙伴 b 的 MAC 地址是 bb-bb-bb-bb-bb-bb,以此类推,不重复就好。(其实是通过算法得出的全球唯一地址)

这样,A 在发送数据包给 B 时,只要在头部拼接一个这样结构的数据,就可以了。

image-20220121145100251

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

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

mac

虽然集线器使整个布局干净不少,但原来我只要发给电脑 B 的消息,现在却要发给连接到集线器中的所有电脑,这样 既不安全,又不节省网络资源。

交换机

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

jiaohuanji

虽然只比集线器多了这一点点区别,但看起来似乎有智能了,你把这东西叫做 交换机

也正因为这一点点智能,你把它放在了另一个层级, 数据链路层

交换机内部工作原理。

image-20220121145504580

如上图所示,你是这样设计的。

MAC地址表

交换机内部维护一张 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 一个数据包,构造了如下的数据结构从网口出去。

image-20220121145704426

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

以太网(局域网)

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

图解MAC地址表生成

当然最开始的时候,MAC 地址表是空的,是怎么逐步建立起来的呢?

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

image-20220121150209148

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

mac_address

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

路由器

随着机器数量越多,交换机的端口也不够了,但聪明的你发现,只要将 多个交换机 连接起来,这个问题就轻而易举搞定。

image-20220121150614052

你完全不需要设计额外的东西,只需要按照之前的设计和规矩来,按照上述的接线方式即可完成所有电脑的互联,所以交换机设计的这种规则,真的很巧妙。

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

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

交换机直连

image-20220121151136029

这在只有 8 台电脑的时候还好,甚至在只有几百台电脑的时候,都还好,所以这种交换机的设计方式,已经足足支撑一阵子了。

但很遗憾,人是贪婪的动物,很快,电脑的数量就发展到几千、几万、几十万。

路由器接入

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

此时你动了歪脑筋,你发现了问题的根本在于,连出去的那根红色的网线,后面不知道有多少个设备不断地连接进来,从而使得地址表越来越大。

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

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

image-20220121151613109

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

好了,现在交换机的 MAC 地址表中,只需要多出一条 MAC 地址 ABAB 与其端口的映射关系 ,就可以成功把数据包转交给路由器了,这条搞定。

MAC地址的问题

现实中 MAC 地址的结构入手,MAC地址也叫物理地址、硬件地址,长度为 48 位,一般这样来表示

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

它是由网络设备制造商生产时烧录在网卡的EPROM(一种闪存芯片,通常可以通过程序擦写)。

其中前 24 位(00-16-EA)代表网络硬件制造商的编号,后 24 位(AE-3C-40)是该厂家自己分配的,一般表示系列号。

只要不更改自己的 MAC 地址,MAC 地址在世界是唯一的。

形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性。

但是由于MAC地址无规律,且可以自己篡改,仅仅用在局域网中标识一个唯一的机器,你甚至可以每5分钟生成一个新的MAC地址,因此你没有办法确保目标的MAC地址是真实,准确的。MAC地址的用途一般是在局域网中区分不同的硬件设备。

你可以这么简单理解,这就好比送快递,你只填了你的身份证号,东西能送到你手里吗?(你说你的身份证号是唯一的,你的快递信息,你写一个假的身份证号又如何?只不过你都是无法拿到快递而已)

因此,在互联网中,MAC地址不能确定机器的位置。

那么该怎么办?

你得填写具体的收货位置,北京市昌平区沙河镇富雷科技219猿来科技,于超老师,电话15210005004收。

你要是这么写,是不是就没毛病了?

在比如,一句话总结

你是个警察,追踪一个犯人,但是你只有他的身份证号码是没用的,你得定位出他在哪个位置,在哪个旅店,在哪个网吧,然后出击。

IP诞生

此时你发明了一个新的地址,给每一个机器一个32位的编号,比如是

11000000101010000000000000000001

但是32位数字太多了,你看不清楚,因此你给它分成了四份,每份是8位,用小数点隔开了。

11000000.10101000.00000000.00000001

但是你还是觉得看不明白,你把这个二进制换成了十进制

192.168.0.1

十进制转二进制

简单的说就是十进制数反复除以2,取其余数。直至结果的小数部分为0,直接看图比较容易理解

image-20220121160143950

二进制转十进制(凑数法)

  • 从二进制的右边起,第一位数乘以 2的0次幂+第二位数乘以2的1次幂+....+第n位乘以2的(n-1)次幂

image-20220121162413406

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

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

这样一个可以随时修改的 IP 地址,就可以根据你规划的网络拓扑结构,来调整了。

image-20220121162728338

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

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

别急我们慢慢来。

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

image-20220121162829897

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

假如 A 给 B 发送数据,由于它们直接连着交换机,所以 A 直接发出如下数据包即可,其实网络层没有体现出作用。

image-20220121162853472

程序员计算器

在你了解了二进制转换十进制计算后,日常工作不需要你慢慢的去计算,快速解决问题,可以用计算器。

十进制转二进制

image-20220121182506616

192     11000000
168        10101000
0        0
1        00000001


11000000.10101000.00000000.00000001

二进制转十进制

image-20220121185315411

路由转发

但假如 A 给 C 发送数据,A 就需要先转交给路由器,然后再由路由器转交给 C。

由于最底层的传输仍然需要依赖以太网,所以数据包是分成两段的。(数据通过网卡的转化,从MAC地址发出)

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

链路层
    源MAC是 机器A AAAA
    目标MAC是 路由器端口ABAB

网络层
    源IP,机器A的 192.168.0.1
    目标IP,机器C的 192.168.1.1

image-20220121163048296

路由器到C的数据包

链路层
    源MAC,路由器端口CDCD
    目标MAC,机器C CCCC

网络层
    源IP,机器A的 192.168.0.1
    目标IP,机器C的192.168.1.1

image-20220121163324834

子网

此时你会有一个问题,为什么机器A发给机器C的数据,怎么知道要经过路由器转发?

是因为有 子网 的存在。

简单理解,就好比一个学校的两个班级,于超在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 开头的,就算是在一个子网,否则就是在不同的子网。

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

子网掩码

子网掩码是什么?配置IP地址,子网掩码是必不可少的。

小于是大一新生,学号是0517000035

小于看到一个漂亮姑娘芳芳,特别激动,想知道是不是和自己一个班的,就偷偷看了看芳芳的学号,0517000045,妈呀,一个班的,心里美滋滋。

小于又看到一个帅哥,也抓紧看看他的学号,这要是一个班的,多少会影响到自己的颜值,0517003206,给力,不是一个班的,巴适。

因此通过观察学号前面的数字,有一定的规律,范围,即可判断是不是一个班的同学。

05170000 班级编号 45 ,35是学号
05170032 班级编号,06 学号

这下我们可以理解关于分组,分段的概念。

回到ip、子网掩码

image-20220121172442239

什么是子网掩码

IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主机称之为远程网络主机,本地网络中的主机可以直接相互通信;

远程网络中的主机要相互通信必须通过本地网关(Gateway)来传递转发数据。

概念与作用

①、子网掩码(Subnet Mask)又叫网络掩码、地址掩码,必须结合IP地址一起对应使用。 ②、只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。 ③、 子网掩码和IP地址做“与”运算,分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在本地网络上,还是在远程网络网上。
④、子网掩码还用于将网络进一步划分为若干子网,以避免主机过多而拥堵或过少而IP浪费。 image-20220122100352389

网络地址、主机地址

确定ip地址所在的网络地址

小于有自己的学号,35号,也知道自己的班级编号,05170000。

  • 小于必须知道自己是哪个班级,才能更容易追到芳芳姑娘
  • 超哥电脑主机号是96,也得知道自己是哪个网段的(192.168.31.xxx)

为什么这个192.168.31表示是一个网段?

ip地址分为两部分,前部分是 网络位 、类似班级编号, 只要网络位相同,就属于同一个网段。

ip地址后面属于 主机位 、代表单个机器的个体编号,类似小于的学号35。

子网掩码组成

①、同IP地址一样,子网掩码是由长度为32位二进制数组成的一个地址。 ②、子网掩码32位与IP地址32位相对应, IP地址如果某位是网络地址,则子网掩码为1,否则为0。
③、举个栗子:如:11111111.11111111.11111111.00000000,这是子网掩码的二进制表示,照第二条的解释,与之对应的IP地址,语法如下

子网掩码
11111111.11111111.11111111.00000000

对应的IP地址,网络地址和主机地址的设计就是比如
192.186.1.1

注:左边连续的1的个数代表网络号的长度,使用时必须是连续的,右边连续的0的个数代表主机号的长度。

子网掩码表示方法

①、点分十进制表示法

二进制转换十进制,每8位用点号隔开 例如:子网掩码二进制11111111.11111111.11111111.00000000,表示为255.255.255.0

②、斜线标记法

IP地址/n 例1:192.168.1.100/24,其子网掩码表示为255.255.255.0,二进制表示为11111111.11111111.11111111.00000000

例2:172.16.198.12/20,其子网掩码表示为255.255.240.0,二进制表示为11111111.11111111.11110000.00000000

不难发现,例1中共有24个1,例2中共有20个1,所以n是这么来的。

运营商ISP常用这样的方法给客户分配IP地址。

通过子网掩码计算IP数量

注:n为1到32的数字,表示子网掩码中网络号的长度,通过n的个数确定子网的主机数=2^(32-n)-2

(-2的原因:主机位全为0时表示本网络的网络地址,主机位全为1时表示本网络的广播地址,这是两个特殊地址)。

比如就是这俩特殊IP,无法直接使用,因此可用的IP数量要减去2个。

192.168.1.0

192.168.1.255

比如经典的
192.168.1.100/24 ,这个24位掩码,意思是二进制位有24个1,也就是这样表示11111111.11111111.11111111.00000000


因此转变为十进制,就是255.255.255.0

因此确定了  子网是192.168.1 
主机数量是 2^(32-24)-2 = 254个IP地址

最终可知,一般家庭局域网,可以用的IP范围是
192.168.1.1 ~ 192.168.1.254 

有两个保留地址 192.168.1.0 和 192.168.1.255

子网掩码计算

IP
    192.168.1.199
子网掩码
    255.255.255.0
这个掩码,表示192.168.1是网络位,只要另一个地址是192.168.1开头的,就是同一个网段


192.168.1.199
255.255.0.0

这个写法,就表示192.168.xxx.xxx是网络位,另一个地址是192.168开头,就是同一个网段。

子网掩码和IP一样,是以32位的二进制存在

二进制指的就是0和1,32位最大的子网掩码是32个1

11111111.11111111.11111111.11111111

255.255.255.255

image-20220121175255160

IP和子网掩码关系

1、两者结合,确定唯一地址的关系。

2、把两者进行2进制换算进行and算法,就是你对外的唯一地址,比如一个局域网内,每个主机的IP与掩码进行and算法后,地址都是一样的。这就是你对外的唯一地址。

3、子网掩码是用来区分网络地址和主机地址的。

举个例子来说,子网192.168.1.0,子网掩码是255.255.255.0。

255用二进制表示是8个1,11111111

3个255用二进制表示是24个1

255.255.255.0 换成二进制就是11111111.11111111.11111111.00000000 一共24个1
8+8+8+0=24
这就是斜线标记法 \24

因此我们设置子网掩码可以用24 表示255.255.255.0

再比如
255.255.255.192 换成二进制就是11111111.11111111.11111111.11000000 一共26个1(二进制)
8+8+8+2=26

26数字就可以表示255.255.255.192子网掩码(十进制)

计算网络位(重要)

当知道子网掩码后(二进制)只要数一数有多少个1,就表示ip地址的前多少位是网络位。

比如

255.255.255.0 这样的子网掩码 是二进制的,转换为二进制就是
11111111.11111111.11111111.0 
一共是24个1


因此这个ip的网络位就是前24位,比如
1.我们限制的子网是192.168.0.0(十进制)
转变二进制就是
11000000.10101000.00000000.00000000


前24位就是网络位,也就是
11000000.10101000.00000000.

当算出来网络位之后
主机位,也就是这个子网掩码内,可以用的IP地址,就被限制好了


**主机位从全0到全1就是IP范围**


二进制的IP范围也就是
11000000.10101000.00000000.0000 0000
11000000.10101000.00000000.1111 1111

但是这玩意咱看着实在太累,十进制的就是 255
192.168.0.0 
192.168.0.255

与运算(计算IP范围)

子网掩码是用来判断任意两台主机的IP地址是否属于同一网络的依据,就是拿双方主机的IP地址和自己主机的子网掩码做与运算,如结果为同一网络,就可以直接通信。

位运算(图解)

从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态

计算机对二进制数据进行的运算 (+、-、*、/) 都是叫位运算,即将符号位共同参与运算的运算。

口说无凭,举一个简单的例子来看下 CPU 是如何进行计算的,比如这行代码:

int a = 35;
int b = 47;
int c = a + b;

计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的 int 变量会在机器内部先转换为二进制在进行相加:

你要说计算机聪明吧,这玩意只认识0和1,多少有点笨。

image-20220122105507415

也可以发现,如果能在程序开发里使用二进制运算,能明显提高机器的执行、计算效率。

& 与运算

与运算,也叫做 位与运算 、是计算机中常见的逻辑运算,就和加减乘除一样的概念,但是计算方式不一样。

与运算 规则

0 & 0 = 0 
0 & 1 = 0 
1 & 0 = 0 
1 & 1 = 1

规则总结:

两位同时为“1”,结果才为“1”,否则为0。

如何根据IP地址和子网掩码,计算网络地址:

①、将IP地址与子网掩码转换成二进制数。 ②、将二进制形式的 IP 地址与子网掩码做“与”运算。 ③、将得出的结果转化为十进制,便得到网络地址。 如下图:

image-20220122111306606

总结

因此当你的子网设置是192.168.0.0,掩码是255.255.255.0的时候,可用IP数量就以及确定好了。

image-20220121190423731


image-20220121190715242


image-20220121190831929

我们废了老大劲计算子网掩码、可以用的IP数量,为什么?

因为不同的公司,有不同的网络环境,服务器有不同的网络环境,你得搞清楚,服务器的IP、子网掩码,以及可用的IP范围,在一个网段内的机器才可以互相通信,才可以进行下一步的动作。

如果是同网段,那么可以直接互相通信,数据直接发送就好。

如果目标不是同一个网段,是不能直接通信的,必须要把数据交给一个中间人,也就是 网关 ,由网关进行转发。

子网掩码在线计算器

https://tool.chinaz.com/tools/subnetmask

玩一玩,子网掩码

1.修改linux虚拟机为桥接模式,和宿主机一个网段。

image-20220122112154069

重启虚拟机网络服务

image-20220122112217952

2.查看宿主机和虚拟机通信

image-20220122112250569

3.目前通信没问题,因为他们都处于 192.168.31网段 ,因为被子网掩码决定了255.255.255.0。

4.修改宿主机的子网掩码,算一算IP范围。

image-20220122112512898

计算二进制
192.168.31.77

11000000.10101000.00011111.01001101

子网掩码
255.255.255.192
11111111.11111111.11111111.11000000

与运算,得出IP范围,如图

image-20220122114558840

5.宿主机修改了网络环境,试试能和linux通信吗?

image-20220122114934049

故障排错

1.报错传输失败,常见故障;

答案
1. 分析网段
linux的ip地址是192.168.31.222/24

宿主机是192.168.31.77/26 

由于子网掩码的不同,宿主机只能和192.168.31.65 ~ 192.168.31.126 之间的IP通信。


2.由于不再一个网段,系统就去找【网关】,这就好比你在班级里找一个姑娘,找不到,你就会想着出教室【大门】,去隔壁找姑娘。
但是,我们这里没设置网关,因此报错故障,找不到大门,你不搁教室里面徘徊了么。

解决办法

1.加上网关设置

2.修改子网掩码,让这俩机器,处于同一个网段

image-20220122120124115

默认网关

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

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

比如

  • A电脑: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 也不在同一个子网,以此类推。

image-20220122133618271

所以如果 A 给 C 发消息,A 和 C 的 IP 地址分别 & A 机器配置的子网掩码,发现不相等

则 A 认为 C 和自己不在同一个子网,于是把包发给路由器,就不管了,之后怎么转发,A 不关心

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

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

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

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

对 A 来说,A 只能直接把包发给同处于一个子网下的某个 IP 上,所以发给路由器还是发给某个电脑,对 A 来说也不关心,只要这个设备有个 IP 地址就行。

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

比如超哥这个192.168.31.1,是网关,也是路由器的后台管理地址。

image-20220122134201046

路由表

路由器如何知道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

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

1

image-20220122135057506

2

image-20220122135114488

3

image-20220122135129916

4

image-20220122135144173

5

image-20220122135212846

6

image-20220122135236895

7

image-20220122135423443

刚才说的都是 IP 层,但发送数据包的数据链路层需要知道 MAC 地址,可是我只知道 IP 地址该怎么办呢?

ARP

假如你(A)此时不知道你同伴 B 的 MAC 地址,你只知道它的 IP 地址,你该怎么把数据包准确传给 B 呢?

其实在网络层里,IP地址会和机器的MAC地址对应,通过某个方式,找到192.168.0.2对应的BBBB地址。

这种方式就是 arp 协议 ,同时电脑 A 和 B 里面也会有一张 arp 缓存表,表中记录着 IP 与 MAC 地址的对应关系。

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

IP 地址 MAC 地址
192.168.0.2 BBBB

一开始的时候这个表是空的,电脑 A 为了知道电脑 B(192.168.0.2)的 MAC 地址,将会广播一条 arp 请求,B 收到请求后,带上自己的 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 协议的请求逐步完善起来的。

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

最后的网络战斗

image-20220122140610364

这时路由器 1 连接了路由器 2,所以其路由表有了 下一跳地址 这一个概念,所以它的路由表就变成了这个样子。

如果匹配到了有下一跳地址的一项,则需要再次匹配,找到其端口,并找到下一跳 IP 的 MAC 地址。

也就是说找来找去,最终必须能映射到一个端口号,然后从这个端口号把数据包发出去。

image-20220122140720735

这时如果 A 给 F 发送一个数据包,能不能通呢?如果通的话整个过程是怎样的呢?

image-20220122140931877

请求流程,动画

network-router

详细过程文字描述:

1. 首先 A(192.168.0.1)通过子网掩码(255.255.255.0)计算出自己与 F(192.168.2.2)并不在同一个子网内,于是决定发送给默认网关(192.168.0.254)

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

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

image-20220122141432674

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

5. 数据包来到了路由器 1,发现其目标 IP 地址是 192.168.2.2,查看其路由表,发现了下一跳的地址是 192.168.100.5

6. 所以此时路由器 1 需要做两件事,第一件是再次匹配路由表,发现匹配到了端口为 2,于是将其封装到数据链路层,最后把包从 2 号口发出去。

7. 此时路由器 2 收到了数据包,看到其目的地址是 192.168.2.2,查询其路由表,匹配到端口号为 1,准备从 1 号口把数据包送出去。

8. 但此时路由器 2 需要知道 192.168.2.2 的 MAC 地址了,于是查看其 arp 缓存,找到其 MAC 地址为 FFFF,将其封装在数据链路层头部,并从 1 号端口把包发出去。

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

10. F 最终收到了数据包!并且发现目的 MAC 地址就是自己,于是收下了这个包

至此,针对物理层,数据链路层,网络层,前三层协议,以及根据对应协议设计的硬件设备(网线,集线器,交换机,路由器)

一张这么简单的图,背后涉及的知识却是深似海。

image-20220122142051436

Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 2024-12-29 15:21:59

results matching ""

    No results matching ""