六岁小朋友也能懂的计算机术语

如果你不能向一个六岁小孩解释某件事,那么你自己就没有真正理解它。—— 爱因斯坦

中午休息时,突然想到上午的一个 https 连接问题,类比了拨打电话的过程,于是便有了本文。

DNS

你的手机通讯录就相当于 DNS 服务器,你不可能记得住每个人的电话号码,所以手机通讯录存储了小红 138xxx,老李 176xxx,小张 155xxx等,当你要拨打一个电话时,实际拨打的都是电话号码。

http 也一样,你打开百度(www.baidu.com)的时候,http 也会去 DNS 服务器查询 www.baidu.com 对应的 IP 地址,当你最后请求时,发送的是 IP 地址。

如果你知道一个人的电话号码,这样就不用去翻通讯录,直接拨打会快很多,同样,直接用 IP 访问会比域名快一些,只不过网络很快的情况下感觉不是那么明显。

DNS 污染

有人恶意修改了你的通讯录,把小红的电话号码改成了老李的,老李的电话号码改成了小张的,这样你想给小红打电话时,实际是在给老李打电话。

在现实生活中,你在公司打开淘宝时,最终打开的页面可能是公司【不要上班摸鱼】的警告页。

DDoS 攻击

在正常情况下,胡歌的电话能正常接听她妈的电话,但有一天电话号码被泄露在了网上,就开始有人不停的给他打电话,而他妈在这个过程中则无法拨入,后来知道的人越来越多了,手机充电都来不及,手机直接死机了。在这种情况下,胡歌的电话被骚扰电话一直占线,真正想给他打电话的人却一直打不进去,一直到最后的手机死机。

服务器在受到 DDoS 攻击时,就是恶意请求将资源耗尽,导致正常请求无法接入,直至最终的服务器宕机。每年的双十一和春节的 12306 抢票都在经历着大规模的 “DDoS 攻击”,心疼累垮的服务器一秒钟。

HTTP 通信过程

HTTP 通信过程非常类似于拨打电话,快递小哥给你打电话让你下楼取快递,电话号码即为 HTTP 的 IP 地址,拨打电话即为请求建立 HTTP 连接。首先,他要解锁手机才能拨打电话(401,请求未被认证),如果解锁时密码输入错误(403,请求认证失败),或者电话号码时只输入了十位(400,错误的请求无法被理解)小哥都无法拨通电话,他修正了这些错误后,终于拨下了你的电话。接下来,快递小哥的电话可能会被接听(200,成功),也可能会得到空号或者不在服务区(404,资源不存在),正在通话中(100,请求已接收,待处理),变更了号码并告知新号码(301,永久重定向),未变更(304)则等待接听,对方拒接或无人接听(500,服务内部错误),已停机或已关机(503,服务不可用)等,如果对方长时间无人接听,快递小哥等的不耐烦了,挂断了电话(499)。

需要注意的是,499 状态码是 Nginx 定义的扩展状态码,非标准状态码

电话拨通后,通话的内容即为 HTTP 报文内容,虽然电话允许通话双方同时说话,但这样的结果是谁也没有明白对方的意思,所以我们通常都是一方在讲,另一方在听,HTTP 也是如此。电话接通后,快递小哥说“下楼来取下快递”,这相当于 HTTP 请求方发送了请求内容,然后你说“好的,我马上下来”,这就相当于 HTTP 的请求消息得到了响应,当你们两个通话结束后,就可以由任一方挂断电话,这就是关闭 HTTP 连接了(在 TCP 连接中,先关闭连接一方会进入TIME_WAIT,被动关闭连接的另一方会进入 CLOSE_WAIT,当确认对方关闭连接后,才会彻底关闭,这也就是为什么 TCP 是可靠连接)。

HTTPS

如果司令部给前方战士下达指令,肯定不能直接在电话里说“明天中午 12 点发起总攻”,这样有人恶意监听电话后,不仅作战计划被泄露,也可能会被篡改为“暂时按兵不动”,因此,这是非常不安全的。如果他们提前协商好了火星语,电话里叽里咕噜说了一通,监听的人不知道说的什么,等他们破译结果出来时,已经被团灭了。在 HTTPS 中,通过 HTTP + TLS 将原本明文传输的内容进行加密,以保证通信双方内容的安全性。

代理

在美苏冷战时期,东德与西德无法直接通信,此时你需要先把电话打到中立国瑞士的一个朋友那里,你把你想说的话经瑞士的朋友转述告诉对方,瑞士的朋友在这里就充当了代理的角色。在这种情况下的代理,你不仅可以突破无法访问的限制,也可以隐藏自己的身份,让西德的接听方以为是瑞士的人在和她交谈。

另一个代理的例子是,假如你想从北京邮寄一份文件给深圳的朋友,你可以选择携带文件乘坐火车或者飞机直接送到深圳,同样可以托管给快递,让快递小哥把文件带给你朋友,这里的快递小哥就是扮演了代理的角色。在这种情况下,代理可以监管包裹,禁止邮递违禁危险物品,但同样引入代理可能导致包裹的遗失损毁,快递小哥生病导致延迟到达的问题。

正向代理 VS 反向代理

仍以冷战期间的通话为例,西德的接听方不知道电话的内容是东德的朋友打来的,以为是瑞士的朋友打的,这就是正向代理;如果东德的朋友不知道通话的内容是西德的朋友说的,这就是反向代理。简而言之,正向代理隐藏拨打方(客户端),反向代理隐藏接听方(服务端)。

来自反向代理为何叫反向代理? - 刘志军的回答

静态编译型语言 VS 动态解释型语言

静态编译型语言就像是做好了一桌子菜再开吃,动态解释型语言就像是吃火锅,边做边吃。

来自 程序的编译与解释有什么区别? - 知乎

I/O 多路复用模型

假设你是一个老师,让 30 个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:

  1. 第一种选择:按顺序逐个检查,先检查 A,然后是 B,之后是 C、D。。。这中间如果有一个学生卡主,全班都会被耽误。这种模式就好比,你用循环挨个处理 socket,根本不具有并发能力。
  2. 第二种选择:你创建 30 个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者线程处理连接。
  3. 第三种选择,你站在讲台上等,谁解答完谁举手。这时 C、D 举手,表示他们解答问题完毕,你下去依次检查 C、D 的答案,然后继续回到讲台上等。此时 E、A 又举手,然后去处理 E 和 A。。。 这种就是 IO 复用模型,Linux 下的 select、poll 和 epoll 就是干这个的。将用户 socket 对应的 fd 注册进 epoll,然后 epoll 帮你监听哪些 socket 上有消息到达,这样就避免了大量的无用操作。此时的 socket 应该采用非阻塞模式。

来自I/O多路复用技术(multiplexing)是什么? - 柴小喵的回答

因为热爱,所以执着。