seegongsik
网络 · 连接的原理
我的消息怎么传到地球另一边
把消息拆成小块、贴上地址、找到路、再安全地锁好送出去。从数据包到互联网,我们一步步跟着看连接的原理。
16 / 16
01✓和远处的电脑说话
网络就是“隔得很远的电脑之间,靠信号互相传话”。先把两台电脑连起来,用线也好、无线也好,做出一条路。来回的话最后都变成 0 和 1 这样的信号传过去。电脑不止两台,而是很多台像网一样连起来时,你就能和任何人说话了。远处 + 用信号 + 用网,这三样就是网络的全部。
02✓把大数据切成小块,数据包
大数据没法一次发完。所以把它切成叫数据包的小块。每块都贴上标签,写明它是第几块、要去哪里。这些块各走各的路,所以一条路堵了也能绕另一条。到了目的地,再按标签上的编号把块拼回原来的数据。切开、贴标签、再拼合。这就是数据包。
03✓家家有地址,IP
IP 地址是“给每台连上互联网的电脑的唯一地址”。像家庭住址一样,世上只该有一个,才不会弄混。它写成用点分开的数字(例如 203.0.113.5)。数据包看着收件地址,就能准确找到那台电脑。要是两台设备共用一个地址,就不知道该去哪台,所以每个地址都得是唯一的。
04✓信件经过的中转站
互联网上的数据(数据包)不会一跳就到目的地。它要经过好几个中转站(路由器),一步一步地到达。每个站先把数据包收下来,再交给下一站。收下来,再发出去。每个站都这样反复,不管多远,每次都靠近一步,最终就到了。所以地球另一边的画面,也能出现在我的屏幕上。
05✓分层各做各的,网络的层
网络不是一次把所有事都做完,而是分成层,每一层只做自己的事。发送时,把消息一层层包起来。信纸(内容)外加内信封(是否都正确到达)、外信封(去哪里的地址),最后还有邮筐(0 和 1 的真实信号)。这叫封装。接收一方反过来,先拆外信封,一层一层剥开,直到拿到里面的消息。分成层后,每一层不用管上面下面,只要做好自己的事,于是又简单又结实。
06✓数据包怎么找路,路由
路由就是把数据包一站一站地交下去,一路找到目的地。每个站点(路由器)看一张「路由表」。每个目的地都写着下一步交给谁。要是有好几条路,就挑最快的那条。最重要的是没有中央控制塔。每个站点自己判断。所以就算一个站点停了,别的站点会找绕行的路,信照样往前走。多亏了这种分散,互联网很难断。
07✓把名字换成地址的 DNS
人很难记住数字地址。所以我们用好记的名字(域名),DNS 把名字换成电脑认得的数字地址。DNS 就像一本装满名字和地址配对的巨大电话簿。问一个名字,它就告诉你地址。而且查过一次的名字会被短暂记住(缓存),再查同一个名字就不用翻簿子,快得多。多亏这样,我们只要记名字,不用记数字。
08✓可靠地发送,TCP
数据包半路可能丢失或乱序。TCP 会悄悄把它补好。收到了就回一个确认(ACK);没收到确认,就把那一片重发(重传);再按每片带的编号把顺序排好。所以收的一方总是收到完整、按顺序的内容。不只是快,而是可靠送达的约定,这就是 TCP。
09✓快速地发送,UDP
TCP 用确认(ACK)和重传把东西不丢地送到。准是准,但要为此等。UDP 省掉了那道确认。它不问到没到,只管快快地一连串发出去,就算丢几片也不停,照样往前走。所以它很适合不能迟到的事,比如游戏、视频通话、直播,丢一两片几乎察觉不到。要准在先就用 TCP,要快在先就用 UDP。两个都有,是因为目的不同。
10✓一栋楼里的许多房间,端口
IP 地址找到楼(电脑)。可一栋楼里有许多房间,也就是许多应用。每个房间的号码就是端口。所以完整的目的地是“IP 地址加端口号”:先找到楼,再找到楼里的房间。常用的应用有固定的代表房间号。网页是 80,安全网页(HTTPS)是 443。到达的数据包看端口号,进那个号码的房间,也就是对的应用。
11✓多台设备,一个地址,NAT
家里的设备各自有一个家里的地址,但要出门时会经过路由器,以一个公网地址出去。这就是 NAT。路由器把“哪台设备发去了哪里”记在一张表上,回复回来时,就看着这张表,准确地还给对的设备。所以多台共用一个地址也不会乱。加上从外面先发起的连接在表里找不到对应,就直接被挡住。只有从里面发起的才能回来。因此 NAT 还顺带当了一道天然的防火墙。
12✓收发网页,HTTP
网络靠请求和响应一对一对地运转。浏览器说“把这个给我”(请求),服务器就回一句“给你”(响应)递过来。每个请求带着一个动作,比如 GET(请给我)或 POST(请收下),告诉它想做什么。一个页面通常要来回多次请求-响应,把文字和图片的碎片凑齐拼起来。而且 HTTP 记性差得很。它把每次请求都当成头回见的客人,所以它自己记不住刚才谁做了什么。怎么补这个弱点,下一讲见。
13✓应用之间对话的窗口,API
人用眼睛看网页(HTML),可应用之间交换的是数据,不是画面。把数据按固定格式交换的那个约定窗口,就是 API。发一个约定好的请求(比如 “首尔天气?”),它回的不是图,而是干净的数据(像温度 23、晴 这样的名字和值)。所以别的应用能立刻用上这份数据。而且把几个 API 组合起来,就成了新服务。在地图 API 上叠一个天气 API,地图上就显示天气。我们用的很多应用其实就是从好几个窗口取数据、再合起来展示给我们。
14✓再来也记得我,会话和 Cookie
HTTP 很健忘,每次请求都把我们当成第一次来的客人。要是不管,登录每次都该掉。解决这个的就是 Cookie 和会话。第一次来时,服务器发给你一张小小的通行证,也就是 Cookie。客人之后每次来访,都再把那张通行证拿出来。服务器看通行证上的号码,就说“啊,那个人!”。把这是同一个客人这条线一直记下去,就是会话。多亏它,你不用每次都重新登录。靠通行证号码认出你是谁,这件事接着引出认证的故事,认证要核实你真的是那个人。
15✓锁住不让偷看,HTTPS
普通的 HTTP 内容是明文,所以中间任何人都能偷看。HTTPS 把内容用锁锁住(加密),就算半路被看到也是乱码读不出来。核心想法有两点。一,公钥是一把谁都能拿的锁,可它锁住的东西只有用你的私钥才能开。二,先用证书确认对方真的是那个网站。所以卡号也能放心地通过网络发送。这就是 HTTPS。
16✓互联网这套巨大的邮政系统
你一输入地址,这一领域学过的东西就按顺序发生。先是 DNS 把名字换成数字地址(IP),然后数据包找路过去到那个地址。TCP 给出可靠的保证,让它不丢、按顺序到达,HTTPS 把这条通道锁上,让别人看不见。在这之上,HTTP 说“给我这个页面,给你”,把页面交换过来。数据包、地址、路、分层,全都在这一条流程里。互联网说到底,就是这些约定手牵手一起转的巨大邮政系统。