2020 年春节,新型冠状病毒肺炎肆虐中国。虽然面对的困难很多,但相比于 2002 年 SARS 病毒席卷而来的时候,政府和人民显然应对得更加及时。在缺乏有效治疗手段的艰难时期,信息的高效传递成为对抗病毒的有力武器。
这都要感谢移动互联网的普及和互联网的诞生。互联网究竟如何传递信息?当你在微信里打开一篇文章,在你看不见的地方究竟发生了什么?
这是一篇《计算机网络》课程的先导入门文章,也是一篇科普文,考试必考,请同学们做好笔记。
打开一篇微信文章,你会进入到微信内置的浏览器,大约两秒钟后,当前肺炎的实时数据页面呈现在你面前。其实你输入到浏览器里的是一个网址,比如下面这个腾讯新闻肺炎数据的网址:
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&_=5774620
一、从网址到 IP
这是一个 URL(Uniform Resource Locator),统一资源占位符,最初由蒂姆 • 伯纳斯 • 李提出,用于指定网页(或者其他资源)所在地址。它就像是信息在网络上的门牌。
其中 https 是协议类型,view.inews.qq.com 是服务器地址,/g2/getOnsInfo 是路径,name=disease_h5 和 _=5774620 为两个查询,查询之间用 & 隔开,查询与路径之间用 ? 隔开。在服务器地址和路径中间还可以加入 :[端口号] 用于指定去往服务器的特定端口。
这个 URL 是如何从你的手机出发,获取地球某处的一个服务器的信息呢?
首先,浏览器会将域名,也就是上文所说的服务器地址 view.inews.qq.com 发送给 DNS 服务器,无论你的域名长成什么样子,比如ᗣ.com、卐.com、☺.com、t.tt、wufazhuce.com,最终都会被 DNS 服务器解析成一个被点分隔为四个部分,每个部分 8 个 bit,总共 32 位的数字组合,这串数字就是 IP 地址。
当然,现在互联网上那么多电子设备,这种 IP 地址早就不够用了,所以你还能见到其他诸如 IPv6 的地址。
二、信息的封装和传输
获取了地址后,你的手机会先和服务器打个招呼。
张总的手机:您好,我是张总的手机。
腾讯的服务器:您好张总的手机,我是腾讯的服务器。
张总的手机:您好腾讯的服务器。
这被称作是 TCP 协议的三次握手,因为 HTTP 协议是基于 TCP 协议的,也就是说在上层的 HTTP 协议封装了请求后一定会经过下层的 TCP 协议,因此要先握手,建立 TCP 连接。
那么问题来了,TCP 协议是如何定位到目标服务器的?
TCP 协议处于传输层,它并不会定位目标服务器,自己做不了,就把事情丢给自己的下一层网络层去做,当然 TCP 协议是要传输一些信息的,比如记录下客户端的端口号和服务器的端口号。
到达网络层,IP 协议会记录上层是 TCP 协议以及版本号等信息,最重要是存放源(设备) IP 地址和目标(服务器) IP 地址。这时你的手机会判断这个目标 IP 地址和当前机器的 IP 地址是否在同一个网段(是不是本地人)。
显然,你想访问的页面不在本地,而是存放在世界上的某个角落。你需要把这些信息发给网关,网关就类似于你所在的局域网的海关,出了海关才能去往远方。
网关在哪?如果不经过 MAC 层信息就会迷路。在 MAC 层,通过 ARP 协议可以获取网关的 MAC 地址。将源 MAC 和网关 MAC 放入 MAC 头,再加入一些其他信息,就可以发送给网关了。
路由器(俗称猫),被叫做网关,虽然并不准确,但不妨先这样理解。
网关会先把 MAC 头取下来,发现 MAC 符合,是发送给自己的,接着取出 IP 头,这里存储着目标服务器的 IP 地址,网关自己存储着一个转发信息库,被称作路由表,通过目标 IP 地址查询路由表决定该把信息发向何处,即下一个路由的 IP 地址。路由器再发送 ARP 获取这个 IP 地址的 MAC 地址。
知道了下一关的 MAC 地址,就可以转发给下一个路由了,再转发之前,MAC 层的目标 MAC 地址会更新成下一站的地址,方便校验。
就这样,一个请求会被分割成多个小块,每个小块都一跳一跳最终到达目标服务器,再以同样的方式将响应传回来。
三、分层的意义
你可能会奇怪:传个页面为什么要搞这么复杂?设置这么多层和协议的意义是什么?
可以说,分层既是个人的努力,也要考虑历史的进程。
个人的努力方面:链路层(MAC 层)用来处理连接网络的硬件部分;网络层(IP 协议属于网络层)用来处理在网络上流动的数据包,规定了通过怎样的路径(所谓的传输路线)到达目标计算机;TCP 位于传输层,提供可靠的字节流服务;最上层即应用层,包括 HTTP, HTTPS, DNS 等协议,直接面向用户提供服务。
从历史的进程来看,为复杂的流程分层是必然的:既可以增强系统的可维护性,也让每一层的设计变得相对简单了。
当你打开一个页面时,在你看不见的地方,无数技术协议都在为确保信息及时送达、确保信息准确做出各种努力。在灾难面前,信息让沟通更及时,让专家的建议更快速地传达。这是开发者们经年累月付出的结果,每一个程序员都应该善待技术,合理应用技术,在面对挑战的时候才能更有信心和勇气。
疫情当前,力扣再次提醒大家做好防护,我们一起努力用科技改变世界,战胜困难。