【网络知识系列】-- 换个角度理解计算机网络

news/2024/10/15 14:20:21

换个角度理解计算机网络,搭建计网知识框架

所谓换个角度,就是从三层物理设备(物理层、数据链路层、网络层)开始,串联起整个网络的工作原理
可能有些小伙伴看见物理设备天生就犯困,反手就准备关闭文章,且慢!本文只是简单的介绍这几个设备的功能,并不会涉及复杂的底层硬件原理,不一定严谨,并且摒弃了很多细节,但读起来一定通俗易懂,帮助你迅速搭建起计网的知识框架。

什么是数据?

首先我们需要知道,网络上传输的东西是什么?所谓数据,什么是数据
假设你要传输的数据是name = "小牛肉",那么经过从应用层开始经过层层封装,到达物理层进行传输的时候,你的数据已经被封装进了很多东西:

首部里面具体是什么,不是本文的重点,你只需要知道其中有这么几个字段很重要:

源 IP 地址
源 MAC 地址
目标 IP 地址
目标 MAC 地址

每一台计算机都有自己的 IP 地址和 MAC 地址。

物理层设备:集线器

假设一个网络上有 A B C D E 五台计算机,A 想要给 C 发送数据包,那么数据包被发送出来后它怎么知道 C 在哪里?
古老的物理层设备 “集线器” 出现了 👇

如上图所示,集线器上面有若干个端口,每个端口都连着一台计算机,假设 A 计算机对应端口 1, B 计算机对应端口 3,C 计算机对应端口 7......
那么 A 想要给 C 发送消息,消息要经过谁?没错,首先要经过集线器
集线器不是很聪明,他其实也不知道 C 到底在哪里,所以他会将 A 的消息广播给所有的计算机,由各个计算机自己判断是不是发送给自己的消息

数据链路层设备:交换机

虽然集线器确实有用,但也导致了消息爆炸,原来我只要发给计算机 B 的消息,现在却要发给连接到集线器上的所有计算机,这样无论是从经济还是效率上来说都不是一个很好的选择。如果把这个集线器弄得更智能一些,只发给目标计算机就好了
既然只发送给一个计算机,那我们首先需要唯一定位这个计算机。
通过什么来定位?发送出来的数据包中其实已经封装好了,就是通过目标计算机的 MAC 地址来进行唯一定位。

那具体是怎么做到的呢?
事实上,交换机内部维护一张 【MAC 地址表】,记录着每一个 MAC 地址的设备,连接在哪一个端口上。

如果发来的包首部中包含的目标 MAC 地址在 MAC 地址表中`没有`映射关系,交换机就将此包广播给所有端口,也即发给了所有机器;
如果地址表`有`映射,那就只发给那一个端口

比如 A 想要给 C 发送消息,一开始交换机的 MAC 地址表是空的,交换机并不知道 C 的端口号,因此 A 发送的消息将会被广播,同时,A 的 MAC 地址和它对应的端口号会被记录到 MAC 地址表中。

这样,C 对 A 的消息进行响应的时候,交换机就不需要进行广播消息了,因此它已经知道 A 计算机在哪个端口了,并且同样的,C 的 MAC 地址和它对应的端口号会被记录到交换机的 MAC 地址表中。

网络层设备:路由器

交换机似乎看起来已经是最优解了,但事实上,随着计算机设备越来越多,交换机的端口都不够用了,当然你肯定能想到可以用将多个交换机互相连接起来,然后每个交换机之间都互相共享他们的 MAC 地址表。但随着计算机数量的增长,比如 10 亿台设备,100 万个交换机,那这 100 万个交换机都需要各自维护包含 10 亿条记录的 MAC 地址表,无论是从经济还是效率上来说这也都不是一个很好的选择。
所以将交换机连接在一起这个思路确实没有错,但不能粗暴的直接连接在一起,得想个办法,让每个交换机仍然只需要维护和自己连接的设备的 MAC 地址表,同时还能和其他交换机进行共享
路由器应用而生
路由器同样有很多端口,每一个端口都拥有一个 MAC 地址和一个 IP 地址,每一个端口都连着一个局域网(或者说子网或者说 IP 地址段也行,本文就不过多区分子网和局域网的含义了)或者另一个路由器
举个简单的例子,有两个子网,每个子网内都只有一个交换机,交换机上连接着若干个计算机设备,用路由器把这两个交换机连接起来,当两个子网之间需要进行通信的时候,通过路由器就可以实现了。

那具体是怎么做到的呢?
事实上,路由器内部同样维护着一张表,这张表称为【路由表】,记录着每一个局域网(IP 地址段)和它对应的端口。
比如某个路由器的端口 0 上连接着192.168.0.x的 IP 地址段,端口 1 上连接着192.168.1.x的 IP 地址段,那么路由表就是下面这样:

大伙一定发现了上面路由表中还有 ”下一跳“ 这个字段,很简单,一个路由器的端口毕竟是有限的,不可能一个路由器连接所有的 IP 地址段,因此,如果该路由器发现目标计算机的 IP 地址不在自己管辖的 IP 地址段之内,就会通过下一跳地址转发给其他的管辖这个 IP 地址的路由器
路由器具体是怎么工作的呢?比如 A 给 C 发送数据,A 在子网号为192.168.0.x的子网,而 C 在子网号为192.168.1.x的子网,那么A 首先需要知道 C 和自己是不是在同一个子网

如果`是`同一个子网,那么直接把数据发送给交换机就可以了
如果`不是`同一个子网,那么需要经过路由器的转发,A 需要把数据通过交换机发送给路由器,然后由路由器决定该发送给哪个子网

这里有两个问题:
1)A 如何判断是否和 C 在同一个子网❓
答案:这个简单,也不是本文重点,不过多介绍了,就是将源 IP 与目的 IP 分别同子网掩码进行与运算,结果相等就是在同一个子网
2)A 如何知道哪个设备是路由器❓
答案:每个计算机上都要设置【默认网关】
其实说发给路由器不准确,应该说 A 会把数据包发给默认网关。
对 A 来说,A 只能直接把数据包发给同处于一个子网下的某个 IP 上,所以其实发给路由器还是发给某个计算机设备,对 A 来说并没有什么区别,反正它只认得 IP 地址。
所以默认网关,其实就是 A 在自己电脑里配置的一个 IP 地址,以便在发给不同子网的设备时,发给这个 IP 地址。

总结

如下图 A 给 F 发送一个数据包,我们来梳理下整个通信过程:

1)首先 A(192.168.0.1)通过子网掩码(255.255.255.0)计算出自己与 F(192.168.3.2)并不在同一个子网内,于是决定发送给默认网关(192.168.0.222
2)A 通过 ARP 协议找到 默认网关192.168.0.222的 MAC 地址(数据链路层需要知道 MAC 地址才能传输数据)
3)A 将源 MAC 地址(AA-AA-AA-AA)与网关 MAC 地址(MM-MM-MM-MM)封装在数据链路层头部,又将源 IP 地址(192.168.0.1)和目的 IP 地址(192.168.3.2)(注意这里千万不要以为填写的是默认网关的 IP 地址,从始至终这个数据包的两个 IP 地址都是不变的,只有 MAC 地址在不断变化)封装在网络层头部,然后发送数据包

4)第一个交换机收到数据包后,发现目标 MAC 地址是MM-MM-MM-MM,转发给第一个路由器
5)数据包来到了第一个路由器,发现其目标 IP 地址是192.168.3.2,查看其路由表,发现了下一跳的地址是192.168.100.21
6)所以此时该路由器需要做两件事,一是再次匹配路由表,找到下一跳192.168.100.21匹配的端口号,二是从这个端口把数据包转发出去
7)此时第二个路由器收到了数据包,看到其目的地址是192.168.3.2,查询其路由表找到匹配的端口号,并准备从该端口把数据包转发出去
8)但此时路由器需要知道192.168.3.2的 MAC 地址才行,于是查看其 ARP 缓存,找到其 MAC 地址为FF-FF-FF-FF,并将其封装在数据链路层头部,从上个步骤确定的端口将包转发出去。
9)如上图所示,对应的交换机收到了数据包,发现目的 MAC 地址为FF-FF-FF-FF,查询其 MAC 地址表,从对应的端口把数据包发出去。
10)数据包最终成功抵达计算机 F,F 发现目的 MAC 地址就是自己,于是收下了这个数据包

文章来源于飞天小牛肉 ,作者小牛肉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/26488.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

C#学习笔记-字段、属性、索引器

字段字段表示与对象或者类型(类或结构体)关联的变量(成员变量),为对象或类型存储数据。与对象关联的字段称为“实例字段”,隶属于某个对象。与类型关联的字段称为“静态字段”,表示某一个类型当前的状态。静态字段使用 static 关键字修饰。字段在没有显示初始化的情况下…

力扣-203. 移除链表元素

1.题目 题目地址(203. 移除链表元素 - 力扣(LeetCode)) https://leetcode.cn/problems/remove-linked-list-elements/ 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2…

网络接收全流程

网卡简介 网卡是一块通信硬件。属于数据链路层。用户可以通过电缆或无线相互连接。每一个网卡都有一个独一无二的MAC地址(48位),它被写在卡上的一块ROM中。IEEE负责为网卡销售商分配唯一的MAC地址。 可以在终端运行sudo lshw -C network来查看网卡型号 可以在/lib/modules/$(u…

《痞子衡嵌入式半月刊》 第 99 期

痞子衡嵌入式半月刊: 第 99 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

Codeforces Round 942 Div.2 题解

ds 这么聪明的。蹭个热度,挽救一下 cnblogs 蒸蒸日上的阅读量。Q: 你是手速狗吗? A: 我觉得我是。2A 因为选的 \(w\) 一定可以让它合法,一次操作可以看作 \(a\) 数组向右平移一位。枚举操作次数后暴力判断即可。 #include <bits/stdc++.h>void work() {int n;std::cin…

linux下调试串口设备

USB转串口常用CH34x芯片,该芯片有linux下的驱动。 在默认情况下,大部分linux发行版都包含了CH34x的驱动,唯一缺点就是版本比较久。 可以先插上开发板, 一般是挂载到/dev/ttyCH341USB0文件下,如果该文件不存在,有两种可能,一种是驱动版本太久,可以下载官方的驱动文件,然…

BSP视频教程第30期:UDS ISO14229统一诊断服务CAN总线专题,常用诊断执行流程精讲,干货分享,图文并茂(2024-04-30)

视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 【前言】 1、继前面分享了CANopen和J1939的专题后,这次继续为大家分享UDS专题视频第1期。 2、统一诊断服务(Unified Diagnostic Services,简称UDS)是车用电子的通信协议,是电子控制器EC…

Reverse Card (Hard Version)

事情是这样的,我验了这一场 CF。显然我玩原神玩多了有一个很奇怪的、不能过的算法,哦,当然,在我本机可以过。为了展现自己的智慧糖,我写一下。 出题人是先发给我了一个限制都是 \(n\) 的,因此只有这个。\(n,m\) 改改就是了。 要求 \(1\le a\le n,1\le b\le n\) 满足\(a+b…