前端中的计算机网络
最近在秋招的面试中,发现自己计算机网络这一块比较薄弱,于是把前端中的计算机网络好好复习了一遍,现在分享给大家。
计算机网络比较复杂,内容也比较繁多,单单是TCP/IP协议族就有很多内容,从哪里说起呢?那我们就从一个URL说起好了。
URL全称是uniform resource location,统一资源定位符,用来表示从因特网上得到所需资源的位置和访问这些资源的方法,在这里,我们会遇到第一个问题,URL和URI有什么关系呢?简单来说,URI是uniform resource identifier,即统一资源标识符,可以把URL理解为URI的一个子集,我一般是这样理解的,就是URI相当于身份证,URL相当于身份证上的家庭住址,通常情况下描述或者指定一个资源时,URL和URI可以互换使用,两者具体区别详见这里。
下面我们来看一下一个URL的格式是怎样的:
<协议名>://<域名|IP地址>:<端口号>/<带层次的文件路径><查询字符串><锚点>
http://www.example.com:80/dir/index.html/?uid=1&uname=tom#ch1
-
协议名
协议名就是表明用什么协议来获取网上的或者说服务器上的资源,常见的有http
、https
、ftp
等。 -
域名|IP地址
域名(也可以叫做主机名,通常情况下两者是一个意思)表示的是要访问的服务器的地址所在的域,例如www.example.com
这样可以被DNS解析为IP地址的域名(关于DNS协议,可以详细看我的这篇文章),当然,也可以直接给出IP地址,可以是像192.168.1.1
这样点分十进制表示的IPv4地址,也可以是[0:0:0:0:0:0:0:1]
这样用方括号括起来的IPv6地址。 -
端口号
端口号表示指定服务器连接的端口号,这一项是可选项,如果不写的话就算用默认端口号,关于端口号的详细解释涉及到了运输层的TCP/UDP协议的复用和分用以及socket套接字,详细可以看这篇文章。 -
路径
路径表示的是要访问的资源在服务器上的路径,也是可选项。 -
查询字符串
查询字符串表示可以通过查询字符串来向服务器传入任意参数,第一个参数前以?
开头,多个参数用&
分隔,也是可选项。 -
锚点
或者叫做片段标识符、hash,使用锚点通常可以标记出已获取资源中的子资源(例如文档内的某个位置),也是可选项。
这样,我们就得到了一个完整的(绝对)URL。
有了URL了,下一步一般是做什么呢,一般来说,我们见到URL最多的地方,就是在浏览器的地址栏了,那么接下来,我们就以从在浏览器地址栏中输入URL到页面呈现出来这个过程,来说说中间涉及到的网络协议,其实“从输入URL到显示页面的过程”这是一个经常会遇到的面试题,完整地弄清楚需要涉及到很多东西,不只有网络方面的东西,还包括浏览器缓存、DOM解析、重排重绘等,详细得可以看看这几篇文章:
下面只讲这个过程中涉及到网络协议的部分。
- 第一步,解析域名,查找主机的IP地址
- 在浏览器地址栏中输入一个URL之后,有些浏览器本身就有对最近查询的一些域名到IP地址映射的缓存,如果有的话,这里直接就会省去接下来的DNS查询这一步,直接返回IP地址。
- 如果浏览器没有缓存域名到IP的映射,那么接下来,操作系统就会先查找计算机上的hosts文件是否有这个网址的映射关系,如果有就直接返回,完成域名解析。
- 如果hosts文件没有这个域名的映射,就会查找本地的DNS解析器缓存,如果有直接返回完成解析。
- 如果还是没有找到映射关系,那么计算机就会向TCP/IP参数中设置的首选DNS服务器(我们叫它本地DNS服务器,下面称本地DNS服务器)进行查询,本地DNS服务器往往是互联网供应商或者某个大学或者其他一个公司机构提供的,许多台计算机共用一个本地DNS服务器,例如你在大学用校园网,那么你们学校可能就共用一个本地DNS服务器。
在本地DNS服务器接受到查询时,会先检查域名是否在本地配置区域资源中(也就是说检查要查询的域名是否也在同一个本地DNS服务器下),如果在就直接返回,完成解析,此解析具有权威性。 - 如果要查询的域名不在本地配置区域资源中,那么本地DNS服务器就会查看自己是否缓存了这个域名映射关系,如果有且没有过期,那么就直接返回,完成解析,此解析不具有权威性。
- 如果没有缓存,那么本地DNS服务器就会根据设置的是否转发(或者说是递归查询还是迭代查询)来进行查询。