计算机网络是计算机世界的基础,也是计算机世界的主要组成部分

没有计算机网络,我们如今生活中的各种线上体验,如刷视频、线上聊天、甚至大模型服务都将不复存在

因此,计算机网络是基本功,是一定要学会的

为什么要学计算机网络

你可能觉得,网络嘛,会连 WiFi、会刷手机就行了,至于它底下到底怎么运转的,跟我以后学计算机有啥关系?

还真有关系。你以后写代码,十有八九要"连"点什么——连数据库、连服务器、调一个 API 接口拿数据、调用 AI。你要是连"数据到底是怎么从我电脑跑到对方电脑去的"这个最基本的问题都说不清楚,那排查问题的时候就只能靠玄学了(虽然学会了计网,网络也是黑盒)。

而且说实话,计算机这门课,很多知识点都是"一旦你想通了就再也不会忘"的。其中,分层就是其中最典型的一个。所以这一篇,我们目标是把网络最核心最基础最实用的部分讲清楚。

先来几个基本概念:MAC 地址、IP 地址、域名、局域网、广域网,这些概念你或多或少会听说过一些,尤其是域名,比如 itouc.cn 就是一个域名,这是属于爱特工作室的域名,域名具体是做什么的,我们下面会说

网络是什么

你平时用手机/电脑上网,其实就干了一件事:把你自己的计算机里的数据,送到另一台通常叫服务器(Server)的计算机那边进行处理,再把结果送回来。

那数据怎么过去呢?送水有水管,送电有电线,网络数据也总得有个通道。最原始的通道,就是网线——两根电脑用一根线直连起来,数据就在线里跑。后来人嫌拉线麻烦,就发明了 WiFi,让数据变成无线电波在空中跑。

所以你可以把 网络 理解成一句话:

网络就是一套让很多台电脑互相传数据的规则和通道。

通道是看得见的(网线、光纤,WiFi 虽然看不见但是你别管😡),规则是看不见的(后面要讲的 IP、DNS、分层……),下面我们来讲讲这些看不见的东西:网络协议(Network Protocol)

MAC 地址

假设你宿舍里就两台电脑,用一根网线直接连起来,没有别的设备。

这时候问题来了:你的电脑要发数据,它怎么知道发给哪台电脑?就像寄快递一样,总得有一个收货方地址吧。而且一般是寄到具体的邮箱,或者快递驿站后再取件

于是,计算机需要一个叫网卡的东西收件和寄件,然后也需要一个具体的标识来记录他,这个标识就叫 MAC 地址。

关键点:

  1. 每张网卡(负责收发网络包的硬件,有线网卡、无线网卡都算)出厂时,都会被录入唯一的 MAC 地址

  2. 它是硬件层面的东西,跟网卡长在一起,出厂就定死了,基本改不了(也能改,但各个厂商的产品修改难度不同)

  3. 格式为 AA:BB:CC:DD:EE:FF,一共 6 段,每段 2 个十六进制数,共 48 个比特位,MAC 地址一共有281万亿个,按目前来说,用不完(虽然你也不用操心 MAC 地址耗尽问题)

这里有个特别容易搞混的点,现在先埋个伏笔,后面会回头解决:

MAC 地址标识的是"谁",但它管不了"在哪"。就像你知道了你家旁边的快递驿站是中国 114514 号快递驿站,但是你和别人说 114514 号驿站,谁知道在山东还是在广东。

那在哪这个问题,谁来管?这就是 IP 地址。

IP 地址

IP 地址扮演的就是"收货地址"这个角色。

比如,中国海洋大学学校代码是 10423 ,但是我怎么知道他在哪,这时候你说,中国海洋大学在 山东省青岛市崂山区松岭路 238 号,那你就知道中国海洋大学在青岛了

拿一个例子,就拿我的电脑在爱特工作室的内网中的地址:

100.68.4.92

IP 地址由 4 段数字组成,每段 0~255(也就是每段 8 个比特位表示)。你也可能会在电脑上看到 192.168.x.x、10.140.x.x 这种,这就是家里或者宿舍内网的 IP。

那什么是内网?本质上来说,内网就是你自己的私有网络空间,里面的路由规则、ip 分配都由你的路由器决定,都由你家的路由器管理,就像你家有你家的家法,他家有他家的家法,是你自己决定的

而公网是公共的,大家都能访问的(自然,这其实也有一套很复杂的机制,但是我们先不讨论),分配需要互联网运营商和特定机构进行谨慎分配

为什么有内网和公网的区别?其中一个原因是因为早期制定 IPv4 的时候,没考虑到它的数量其实是不够的,也就是每个人根本分不到一个固定的 ip 地址。另一个原因是隐私问题,你也不想上着上着网,突然就有个美国人通过你的 ip 地址给你打电话吧?

一般来说,在公网环境下,没有办法访问到你的内网中的设备

除非你们处于一个网络环境中(也就是连着同一个 WiFi 、连着同一个路由器、交换机的接出来的网线)这样你们才能用内网地址相互访问

但是能用什么内网 ip ,自然不是你说了算,我们还需要一套国际法来约束具体哪些是私网网段,那些是公网网段,不然,万一公网有一个叫 11.4.5.14 的 ip ,全世界的联网设备都能访问,包括你的路由器,但是你内网又有一个 ip 是 11.4.5.14 ,那路由器怎么知道发给谁?

因此,内网 ip 一定不能出现在公网里,公网里也不能出现内网 ip ,常规内网一共有这几类:

A 类: 10.0.0.0 - 10.255.255.255 一共 256 256 256 个地址
B 类: 172.16.0.0 - 172.31.255.255 一共 16 256 256 个地址
C 类: 192.168.0.0 - 192.168.255.255 一共 256 * 256 个地址

当然,除了这些,还有一些网段可以用于内网,比如 100.64.0.0/10 这个网段,这个是一个共享地址,一般是给运营商使用的,防止运营商的 NAT 和 用户的 NAT 冲突(NAT 我们下节会讲)

广播地址

你家内网是 192.168.0.0 - 192.168.0.255,但是为什么从来没见过有设备分配到 192.168.0.255 这个 ip?运气不好?

那当然不是了,因为这个 ip 是广播地址,我们规定每个网段的最后一个地址,都是广播地址,只要向网络中以此 ip 为目的地,那么整个网段的主机都会收到这个包,这就和一个大喇叭一样,在教室里喊,全班都听得见

当然,这个地址的具体用途,我们之后会谈

此外,还有一个特别的 ip,是 255.255.255.255 ,这个地址也是一个广播地址,但是我感觉你们现在应该还理解不了,这里也用不上,所以我先不说

子网掩码

那路由器怎么知道你家内网有多大?比如你家就 2 台手机 + 1 台电脑,就用 A 类地址一个大段,不太合适吧,这时候,我们可以使用子网掩码规定一下具体网段的大小

100.64.0.0/10 ,这里的子网掩码就是 10 ,这个表示方法叫 CIDR 斜杠表示法,还有一种方法叫点分十进制表示法(但我们主要学习 CIDR 法),那么 10 意味着什么呢?

意味着这个网段一共有 2^22 个,也就是 4194304 个 ip,范围是 100.64.0.1-100.127.255.255,其中 100.127.255.255 是广播地址

怎么算出来 2^22 个 ip 的?我们知道 IPv4 地址要用 32 个比特表示,而 CIDR 的作用,就是把对应的高位比特位锁死,是不变的,后面的比特位则自由变换。以这里的 10 为例,就是32个比特里,10个比特是具体数值是固定的,后面22个随便变,这样,我们就能组成 2^22 个不同的二进制数,也就是 2^22 个不同 ip 地址了(CIDR Wiki)如下图所示,如何看一个 ip 属不属于某一个网段?比如下面的 10.10.1.32/27,只需要看最前面 27 位对不对得上就可以了

当然,子网掩码的这两种写法可以相互转换,比如 /24 对应 255.255.255.0 ,/10 对应 255.192.0.0,至于他们的转换,不要求掌握,没有意义,如果需要计算网段,可以使用这个工具:站长工具

127.0.0.1

很多表情包的笑点,上面写着:我的 Minecraft 服务器地址:127.0.0.1

其实 127.0.0.1 是 127.0.0.0/8 这个网段的其中一个地址,理论上这个网段的 ip 都是一个功能(说实话用这么大一个段挺浪费的),那就是指向自己

比如,你在你自己电脑上开了一个网站,问题是你发现你没有联网,没有 ip ,那你怎么访问自己的网站?那你就可以访问 127.0.0.1 访问你自己,不管你有没有联网,有没有被分配 ip ,这个 ip 都可以用

IPv6

算算 ipv4 一共有多少个?256 256 256 * 256 = 4294967296 个,算上广播地址、内网地址、回环地址这些,完全不够

所以,我们引入了 IPv6 (别问 IPv1 2 3 5 在哪,感兴趣可以查查😋)其使用 128 位比特表示,一共 2^128 个地址,根本用不完

ipv6 看起来是这样的:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 非常长,每一个 x 都是一个十六进制数

考虑到 ipv6 的各类协议和 ipv4 有明显不同,这里我们不做细究,因为对初学者来说确实比较复杂(光 ip 写法就很复杂)我们暂时不做要求

那问题来了:光有 IP 我还得记住一长串数字?

DNS 和域名

现在你知道了,访问别人的电脑/服务器,得靠 IP 地址。

但你试过去记一串 153.241.172.114、14.215.127.1 这样的数字?太反人类了。

我说让你记住山东省青岛市松岭路238号很难,那记忆中国海洋大学崂山校区总是很容易了,网络里我们也可以这样

我可以用好记的名字代替冷冰冰的数字,这个名字就是域名。

比如你不用记 14.215.127.1,你只记 baidu.com 就行了。

那问题来了:我在浏览器里敲的是 baidu.com,可计算机本身可不认这个东西,它只认 IP 地址,那我们就需要一个翻译官,一个电话本

DNS 就是干做这个的,它是计算机网络中最重要的协议之一

  1. 你在浏览器输入 baidu.com

  2. 你的电脑先去问 DNS 服务器:"baidu.com 的 IP 是多少?"

  3. DNS 服务器回你:"是 14.215.127.1"

  4. 你的电脑拿着这个 IP,就开始真正去访问它了

顺带把域名的结构也拆一下,你会发现它其实很好懂,以我们的官网为例:

www.itouc.cn
│    │      └── 顶级域名(cn 表示中国)
│    └──────── 二级域名(itouc 这是我们自己取的名字,意思是中国海洋大学爱特工作室)
└───────────── 主机名(www 通常指网站)

从右往左读,越往右级别越大:.cn 是最大的范围,itouc 表示是爱特工作室的域名,www 爱特工作室下的服务。

当然,域名也可以不止三级,比如我们还可以有 itshare.app.itouc.cn ,也很好记忆,itouc.cn 是爱特工作室的域名,.app 表示这是爱特工作室的公共线上应用服务,itshare 是这个服务的具体名字,爱特工作室资源分享站,是不是很好记忆?

或许你可以猜猜这个域名是干什么用的: shtx1.node.itouc.cn

不过,你或许想到了(虽然你没想到),这域名解析出来的都是 ipv4 地址,那我们上面提过的 ipv6 不是更长吗,能不能解析它?

当然可以!这就涉及到 DNS 的解析类型了,我们的 域名->ipv4 就是 A 记录,如果要解析 ipv6 ,那就是 AAAA 记录,非常简单!

再拓展一下思想,我们或许还可以域名解析成域名?那就是 CNAME 解析了

再再拓展一下,你发现你的 QQ 邮箱,@ 后面的 qq.com ,那不也是域名吗!?没错,这就是 MX 记录!

这几个是最常用的几个,当然,我们还有 SRV 、TXT 、NS 等记录类型,这些如果感兴趣可以问问 AI 这是什么

或许你会以为域名是大公司、单位才有的东西,但并不是,域名这个东西是所有人都能拿到的,只要十几块钱到几百块钱一年,你就能够拥有自己的域名

如果你去 Cloudflare、阿里云、腾讯云这样的服务商购买域名,他们会给你一堆像 .cn 、.xyz 、.fun 、.com 的域名前缀,这些都是顶级域名,是国际上定好的,只有国家、国际组织、超级大公司才有可能申请自己的顶级域名,个人想要拥有顶级域名几乎不可能,我们能买到的基本上都是在某个顶级域名之下的二级域名甚至三级域名

比如你选择购买 .cn 域名,然后你取一个名字:yao37 ,那么你的域名就是 yao37.cn ,其中二级域名就是你自己取的,再下一级的主机名,或者叫三级域名,那就归你管了,你只需要在运营商给你的网页控制台上添加一条 DNS 记录,比如 blog.yao37.cn 并将其解析到 11.4.5.14 。当你点击应用后,全世界的联网计算机,只要向 DNS 服务器对这个域名发起解析请求,那么结果必然是 11.4.5.14 (不考虑 DNS 污染、DNS 应用时延等情况)

DNS 和域名太好用了对吧?各级顶级域名、二级域名、N 级域名他们之间不仅互不干扰,而且还相辅相成,特别好管理,特别好理解,也特别简单

分层

可能一些“嘉豪”会说:“分层?这个我懂!OSI 七层网络架构,物理层、数据链路层、网络层、传输层、会话层、表示层、应用层!在同学面前背这个,人家可都以为你是很懂网络的黑客呢”

但是,这根本不是我们说的分层的本质,背会 OSI 七层网络架构也没办法让你学会计算机网络,这个东西对于现在的我们来说没有任何作用,背会了甚至还会弄巧成拙。

分层是计算机中一个极其重要的思想,如果不学会思想而只会死记硬背是悲哀的

来一个最直观的分层例子:

古时候,国家最高统治者是皇帝,为了更好地管理国家,他是不是需要大臣辅佐他,而大臣也需要下级官员来辅佐他,由此一级一级,只要我们规定好一个规则,各层官员各司其职,那皇帝是不是不需要知道太多事情的细节,比如具体哪个村子的治理问题,或者麦子什么时候播种。皇帝只需要下达一个指令或决策,后面具体怎么执行让各级官员根据自己的职责和实情去实施就可以了,整个国家由此稳定运行

在计算机网络中也是如此,用户就是皇帝,当你使用 QQ 聊天的时候,发出一条消息,用户能够看到的就是 QQ 这个软件在帮你发送消息,软件会将你的消息进行处理,变成一个标准而严谨的网络请求,但这个请求计算机依然看不懂,会传递给下一级的底层软件和硬件电路进行处理,直到变成明确的 01 电信号或者光信号从你的网卡里跑出去,后面这条二进制请求会被各级交换机传递,直到到达你朋友的电脑网卡,后面再逆过来把电信号变成你朋友能看懂的文字,这样你的朋友就看到你的聊天了

你看,你这个皇帝除了发信息压根什么都没干,但是下面的软件和硬件帮你都干完了,整个流程对你来说都是透明的,而且每一层软件和硬件都是各司其职的、互不干扰的,这就是分层

事实上,计算机处处都有分层,比如你并不直接使用 CPU 和你的内存条,你在使用 QQ 微信或者打游戏的时候,你所使用的程序、底层软件和硬件早就帮你调用完他们了,而你什么都不用知道,只需要傻笑就可以了

DNS 域名解析系统

你有没有想过,为什么爱特工作室的域名要叫 itouc.cn ,直接在浏览器输入 爱特工作室 就进入不行吗?当然不行了,这是有考究的

实际上,我们域名的完整写法是:www.itouc.cn.

为什么要多加一个 . ,因为这代表根(root),一个人,只要留下了根,他的子子孙孙就会无穷尽也,一个家族的家谱呈现一个树状结构,DNS 解析系统也是

全世界一共有 13 个 DNS 根域名服务器,他们的职责是告诉用户,解析顶级域名的 DNS 服务器在哪,比如专门解析 .cn 、.xyz 这些的服务器在哪,这里我们以解析 www.itouc.cn 为例,找到解析 .cn 的域名服务器后,这台服务器再找解析 .itouc.cn 的服务器,以此类推,直到找到这个域名的具体解析结果

但一般我们的请求也不会直接去问根域名服务器,我们会先问离我们最近的 DNS 服务器,比如你的路由器,你路由器的下一级路由器之类的,他们很有可能缓存了之前的查询结果,如果实在找不到,才去问根服务器,这也是分层

这样做的好处是好管、高效,如果 DNS 域名解析系统不是分层的,那么大家的请求就都要直接去问 DNS 服务器的"皇帝",这样皇帝会累死的

IP 和 MAC 地址

我们刚刚说了 IP 和 MAC 地址,他们的职责我们也有所了解了,但是为什么说他们是分层的上下级关系?他们的职责看上去也没什么关系啊,这就谈到分层的另外一个好处了

我们说过,MAC 地址本身没有 “收货地址” 这个功能,但 IP 地址可以承担这个角色,计算机内部会缓存 IP 地址和 MAC 地址的对应关系,只要知道了 IP,就可以知道 MAC,只要知道 MAC,我就知道 IP

当我们借助上一层的 IP 地址完成了路由寻址(也就是找到了从你的计算机到另外一台计算机的网络路径),那我们就可以把任务交给 MAC 地址了。一条网络路径或许很长,但是细化到从一台电脑到另一台电脑或者路由器的通信,MAC 地址还是能够胜任的,比如人家让你拿东西给同一楼的小王,虽然人家没告诉你小王家具体在哪,但是你叫大喊一声小王(广播),小王就自己出来拿东西了,那就不需要具体的地址辅助你找了。也就是说在这个时候,发送从一个 MAC 地址到另外一个 MAC 地址就非常简单了,不需要 IP 地址辅助了

什么?你说为什么不舍弃 MAC 地址,直接用 IP 地址?可别忘了,IP 地址是一个虚拟的东西,而 MAC 地址是写在硬件里的,是硬件上的东西。松岭路 238 号这个名字是虚的,但是中国海洋大学一定是真实存在的,这就是区别

你看,通过分层,就可以把一个原来做不到或者很难做到的功能轻松做到。你如果想要和你另一个部门的部长沟通或许很难,因为人家不认识你,你也不懂业务流程,但是你可以和你部门的部长沟通让他去和另一个部长沟通就会很轻松了

动动手

  1. 学习使用 nslookup 指令,查查 itshare.app.itstudio.club ,看看它的解析结果是什么,他是内网 ip 还是公网 ip?什么情况下能够访问这个网站?

  2. 连接校园网,尝试查看自己的校园网 ip 地址是什么,它的子网掩码是什么?网段范围是多少?

  3. 学习使用 traceroute 或者 tracert 指令,看看从你的电脑到 www.itouc.cn 的路径是怎么走的

  4. 尝试查看你的网卡的 MAC 地址是什么

  5. 查看你的电脑使用的 DNS 服务器是什么

  6. 使用上面提到的站长工具,看看如果要表示 100.68.32.0~100.68.64.0 的子网掩码网段表示是什么,而 10.3.5.1/14 对应的网段又是什么

  7. (选做)尝试查看当你使用 DNS 解析一个域名时,它的查询过程