网络篇
问题
- 为什么我打不开插件市场?
- 为什么我下载主题的速度很慢?
- 大家都在说去一个叫做 github 的地方,为什么我打不开网址?
- ……
这些都是很常见的问题,是那种新人不懂,懂的人又懒得解释的问题。有时候并非是大家不愿意解释,而是解释起来感到鸡同鸭讲,所以没了兴趣。本文会尽量用最通俗的语言,帮助你了解一些必要的网络知识,让你可以自己判断分析一下自己的问题,另一方面也可以帮助你更好地定位问题,从而获取更加精准的帮助。
本人水平有限,文章存在错误还请斧正。
网络总览
网络是个非常非常复杂的系统,不要指望自己可以从上到下理解其方方面面。为了理解,我们会把网络分成若干层次:
Loading graph...
这个层次模型并不是唯一的,甚至也不是最正统的 1。你可能会在其他地方听说「七层模型」或者「四层模型」,还有可能会有同一层用不同名称的情况(比如运输层就经常也叫做传输层)。但是这对本文的目标没有影响,按照本文的说法理解就行了。
现在,想象你使用 QQ 向朋友发送了一条消息:
- 处于应用层的 QQ 会把你的消息打包成适合网络传输的格式,然后你的消息会从左到右经过所有层的处理,最后抵达物理层,被转化为光缆的光信号,或者手机笔记本等无线设备的电磁波信号发送出去;
- 信号抵达了朋友的电脑,先是从朋友电脑的物理层开始,从右往左经过所有层处理,最后抵达应用层,朋友的电脑中的 QQ 会把传输来的消息经过处理显示到朋友的面前。
这个发送消息的过程应该很好理解。我举这个例子是为了告诉你,其实不论你在网络上做什么,网络的传输基本上都遵循这个模型。比如
- 网站上/app 上下载软件:一切软件都是二进制表示的,也就是说是一串极长的数字,所以发送软件和发送消息其实是完全一样的。你点击下载键这一消息会从左到右经过所有层进入网络,然后又从右到左经过所有层抵达网站服务器的电脑;网站服务器则把软件也经过一样的过程发送到你的设备里。
- 发送邮件:邮件也类似 QQ 消息。
- QQ 电话/视频:你的声音/视频被一边录制一边打包为同样的二进制数据,通过一样的过程,一边录制一边发送已经录制好的内容。
- ……
所以说你其实可以把网络当成物流网络来理解。不论什么货物都会被打包为「包裹」,经过统一的运输流程抵达任何地方。因此,一切和网络有关的问题都可以分类为三个部分
- 你的设备有问题
- 网络运输系统有问题
- 你的朋友的设备有问题
理解了这一些,我就可以根据一些经常见到的实际案例来告诉你如何解决问题了。
我打不开插件市场/主题市场/github
这三个问题其实是同一个问题,因为背后和你的计算机互发消息的「朋友」其实都是 github 的服务器。内置的插件市场、主题市场其实只是代替你筛选了 github 上的一部分内容显示在里面而已。
所以说如果你能顺利访问 github,那么另外两个也应该是没有问题的。如果还有,那就基本上可以判断问题出在 Obsidian 的软件本体上。可能是 Obsidian 被禁止使用网络,也可能是 Obsidian 文件有损坏了。这里面的原因仍然可能很复杂,但是往这方面想是对的。
然后就是最常见的问题:这三个我都打不开。
这个问题的根源一般在网络系统上面,但其具体原因我不能一概而论,甚至可以说其背后原因是动态变化的,只是表现出来的结果都是你无法访问这三个地方而已。当前文章写作时(2023 年 12 月 25 日),这些问题背后的原因主要是 DNS 污染 2。
DNS(Domain Name System)域名系统。要理解这个概念我还得介绍一些基础知识。
域名、IP 地址、与 DNS 污染
域名 3,一句话说清楚,就是 https://www.pkmer.cn
这样的网址;IP 地址 4,一句话说清楚,就是联网设备的独有地址,是类似 127.0.0.1
这样的一串数字。
刚才介绍了网络传输的模型,我们说网络上交流就好比之前用邮政的物流系统送信交流。那你有没有想过,邮政依靠你填的地址找到你的朋友,我们发出的网络消息是怎么从茫茫人海中找到你的朋友的设备的?
网络寻找你朋友的设备的「地址」就是 IP 地址。每一台联网设备在同一个网络里的 IP 地址必须是唯一的,就好比家庭住址必须是唯一的。但是如你所见,IP 地址这串数字不好记,所以为了方便才有了域名(Domain Name),用一串好记的字符代替难记的 IP 地址。寻找域名对应的 IP 地址的过程就叫做域名解析5,以访问 pkmer 网站为例,域名解析是这样的:
- 我想访问 pkmer 网站,我记得其域名
https://www.pkmer.cn
,我把它输入浏览器试图访问 - 浏览器在应用层,它需要知道域名对应的 IP 地址,于是就发送了一条消息询问域名服务器:
www.pkmer.cn
对应的 IP 地址是什么呢? - 域名服务器发回了回答,于是浏览器知道了 pkmer 服务器的 IP 地址,可以通过上面的流程进行交流了。
至于为什么有了 IP 地址就可以从巨大的互联网找到容易一台设备,网络是如何把你的消息传输过去的,我可以告诉你这里涉及到一套微妙又复杂的去中心化机制,只依靠一群简单的、没有任何智能、只有简单收发消息功能路由器 6,按照固定的程序转发你发送的消息,就能把你的消息转发到你的朋友那里,而且效率不低。不过这里先按下不表,谈安全的时候再了解这部分。
解决思路 1:修改 hosts
有了上面的铺垫,你应该就能猜到,DNS 污染,其实就是域名解析的过程遭到了污染。可能是访问域名服务器的过程出了问题,也可能是域名服务器本身没有返回正确的 IP 地址。这背后的原因又是无比复杂,交织着各方的心思。不论如何,总之域名转换为 IP 地址的过程被打断了。
根据这个原理,一个显而易见的解决方案就是把 IP 地址记下来,不通过 DNS 解析就不会遭到 DNS 污染。你可以直接在浏览器里面输入 IP 地址来访问网站,这是可以的。不信你可以试试。
其实这个方法确实是被广泛采用的。不管是 Windows,还是类 Unix 系统(Linux,BSD,Macintosh)都有一个 hosts 文件 7,这个文件记录着一系列域名和 IP 地址的关系。系统在得到域名的时候会优先搜索 hosts 文件,看看有没有记录对应的 IP 地址,如果没有,那才会去发消息询问域名服务器。所以我们可以把 github 的服务器的 IP 地址记录在 hosts 文件里面。不过注意,要修改 hosts 文件是需要一定权限的。
Switchhosts 就是这样一个修改工具,其核心功能是自动更新 hosts 文件的内容。因为 github 是个大网站,不可能只依靠一台服务器,所以往往会有多个服务器分摊任务(CDN 内容分发网络 8 就是类似的技术),这些服务器的 IP 很可能是不一样的,所以需要动态更新 hosts 文件。
github 上有项目会及时更新这些信息,Switchhosts 的核心功能也就是可以每天自动收集这些更新然后把更新写到你的 hosts 文件里面。
总的来说,比较推荐的是使用 瓦特工具箱 ,也就是 steam++ 来实现这个功能。这是个很方便小白上手的开源软件,可以实现 hosts 代理,系统代理,PAC 代理等方法访问一些特定网站(steam 商店、kaggle、github 等等)。不过实测来看,访问速度比较慢,需要高速稳定访问的话还得其他方法。
解决思路 2:国内镜像网站
国内镜像网站,说的是在国内建站,但是网站内容和国外的那个网站完全一样,并且同步更新,就像一面镜子一样。因为建站在国内,所以基本上不会出现任何网络问题。镜像网站是个很有中国特色的内容。
某种程度上来说,镜像网站是个相对完美的方案,基本上不需要自己做什么就解决了一切问题。但是当前来说,github 的镜像网站死伤惨重,只有一部分大学和大厂建造的镜像站做的比较好。
但是对于 obsidian 来说我们仍然有一个还不错的镜像站选项 pkmer插件市场。
解决思路 3:代理
代理(proxy)是一种不算很好的解决方法。当你被一个网络拒之门外的时候,你想进入这个网络,你可以联系一台可以进入这个网络的服务器,让它代替你和网络中的设备交流,这就叫代理。具体来说,也就是你把你要发送的消息发送给这台服务器,它替你发到网络中;它也替你接收所有网络中发来的消息,并且转发给你。
在这里,就是说我们需要一台能够正常访问 github 的设备,充当这个服务器,问题就解决了。这太服务器我们称作「代理服务器」。在 Windows 设置中就可以手动设置自己的代理服务器:
不过要注意,代理(proxy)和虚拟专用网络(Virtual Personal Network)是不一样的 9。它们之间的区别可能不太好理解,简单来说,虚拟专用网络侧重安全性更多,其主要为了保证网络上的其他人首先是不能拦截获得你的消息,然后是保证其他人也不能根据你收发消息的 IP 地址获得你的个人信息(比如所在地区等)。
国内来说,绝大多数代理服务都不能保证自身的长期稳定,不论价格。
Footnotes
讨论
若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。
反馈交流
其他渠道
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。