本文主要讲述浏览器发出一个网址请求到接收到返回数据的整个过程明细。
举个例子,我们在浏览器地址栏输入baike.baidu.com地址时,浏览器第一步要做的工作就是域名解析。
域名解析
域名解析是指将域名地址如baike.baidu.com转换成IP地址的过程,域名解析工作由DNS服务器来完成。浏览器输入网址后回车,此时浏览器执行一系列过程来进行域名解析工作:
-
搜索浏览器自身缓存DNS记录
浏览器自身带有DNS缓存,用以记录最近访问的站点DNS域名解析记录,方便再次访问时快速查找目标机器IP地址。 -
搜索hosts文件
如果浏览器中没有请求地址对应的DNS缓存记录,此时将继续在本机寻找hosts文件配置,查找hosts文件配置中是否有配置域名对应的IP地址。 -
向域名解析服务器发送请求
在上述两种查找过程都无结果时,则向域名解析服务器发送请求,域名解析服务器对域名进行解析。域名解析服务器在进行域名解析时首先请求到根域服务器,根域服务器负责存储如com、cn、org等域服务器的IP,查找到com服务器IP后再请求该IP查找baidu.com服务器地址,继而再解析baike.baidu.com服务器,依次执行递归迭代域名解析。
A记录和CNAME记录
域名解析服务器对域名进行解析有A记录和CNAME两种解析方式,A记录是把一个域名解析到一个IP地址,如113.96.232.230,而CNAME记录即:别名记录。这种记录允许您将多个名字映射到另外一个域名,一般解析两个,一个是顶级域名一个是www的二级域名。例如,有一台计算机名为“host.mydomain.com”(A记录)。它同时提供WWW和MAIL服务,为了便于用户访问服务。可以为该计算机设置两个别名(CNAME):WWW和MAIL。这两个别名的全称就http://www.mydomain.com/和“mail.mydomain.com”。实际上他们都指向 “host.mydomain.com”。CNAME有一个好处就是稳定,就好像一个IP与一个域名的区别。服务商从方便维护的角度,一般也建议用户使用CNAME记录绑定域名的。
TCP 握手
获得目标服务器地址后,客户端会选择一个大于1024的本机端口向目标主机发送TCP请求,在目标服务器域名未指定端口情况下会使用默认80或443端口发送请求,建立TCP连接。TCP握手三次连接和关闭会话4次连接详情略。
HTTP请求
HTTP请求是基于TCP连接基础上建立的协议,客户端拿到TCP请求的会话连接后开始往目标主机发送HTTP请求,发送请求数据。目标主机开启nginx等web服务器,web服务器默认会监听服务器中的http请求配置的端口和域名,对接收到的请求进行解析,分发到对应的web工程进程管理器中,如fast-cgi进程管理器php-fpm。
nginx接收http请求分析参见:https://zhuanlan.zhihu.com/p/92072710