【URL请求过程】
-
浏览器缓存
这里将浏览器机制放在第一步是考虑如果浏览器中有了缓存数据,浏览器再次向目标URL发送请求时,在数据不过期的情况下,会直接使用浏览器缓存的数据,而不需要向服务端请求。
根据是否需要向服务器重新发起HTTP请求将缓存结果分为两个部分,分别是强制缓存(也叫本地缓存)和协商缓存,当然这只是两种叫法,有些人把缓存分为Expires/Cache-control和Last-Modifed/Etag这两种表现,本质上是一样的。
浏览器缓存分为内存缓存(from memory cache) 和硬盘缓存(from disk cache):
-
内存缓存(from memory cache):具有两个特点,分别是快速读取和时效性:
快速读取: 内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内部资源,以方便下次运行使用时的快速读取
时效性:一旦进程关闭,则该进程的内存则会清空。
-
硬盘缓存(from disk cache): 硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。
-
-
DNS域名解析
DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是将主机名和域名转换为IP地址的工作
DNS域名解析的请求过程分为以下几步:
第一步: 检查浏览器缓存中是否有这个域名对应的解析过的IP地址
浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存时间也有限制,通常情况下为几分钟到几小时不等,域名被缓存的时间限制可以通过TTL属性来设置,时间要设置的合理。
第二步: 检查操作系统缓存中是否有这个域名对应的解析结果
如果用户的浏览器缓存没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。其实操作系统也会有一个域名解析的过程,在Windows中可以通过C:\Windows\System32\drivers\etc\hosts文件来设置,在Linux中这个配置是 /etc/hosts。在这两个文件中,你可以将任何域名解析到任何能够访问的IP地址
第三步: 向本地服务器查询(LDNS)
如果前面两个过程都无法解析,操作系统会把这个域名发送给这里设置的LDNS,也就是本地区的的域名服务器。这个DNS通常都提供给你本地互联网接入的一个DNS解析服务。比如你在学校接入互联网,那么本地DNS服务器就在你的学校。实际上大约80%的域名服务解析都在这里就完成了,LDNS承担了主要的域名解析工作
第四步: LDNS没有命中,直接到Root Server域名服务器请求解析
根域名服务器是最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址
第五步:根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址
gTLD就是前面说的国际顶级域名服务器,如.com,.cn等。
第六步: 本地域名服务器再向上一步返回的gTLD服务器发送请求
第七步:接受请求的顶级域名服务器查询并返回此域名对应的权威服务器(Name Server)
这个权威服务器就是你注册的域名服务器,比如阿里万网的域名服务器,你这此申请的域名,那么域名的解析任务就由这个域名提供商的服务器来完成。
第八步:权威服务器会查询存储的域名和IP的映射关系表并返回
正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器。对于返回的IP和TTL,本地域名服务器会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制。
第九步:把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束
-
TCP连接
-
HTTP请求与响应
浏览器与服务器建立TCP连接以后,然后就可以开始发起HTTP请求了,客户端按照指定格式开始向服务器发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,返回一个HTTP响应给客户端