网络请求的流程
我们来表述一个浏览器发出HTTP请求的过程:
首先,我们在浏览器输入了URL(例 :www.baidu.com),按下回车,开始我们的HTTP请求
1.通过URL找IP
首先我们的浏览器是不认识baidu.com这个域名的,(注意:是baidu.com,不是www.baidu.com。 因为www是服务器的名字,而baidu.com是域名,相当于这个服务器的地址,com是公司的意义,baidu是公司名,www是公司的一个服务器名称),要将这个服务器的IP地址找到。
如何去找IP地址呢,首先先是本地的缓存,一般是以Hosts文件的形式存在,维持着一个带域名的服务器地址对IP的对应关系,路由器缓存(也算是DNS服务器缓存)
如果没有结果,则会向上层DNS服务器询问,上层DNS服务器的本地缓存中如果没有该记录,则再向上层询问,一直到DNS根服务器。
在根域名服务器中虽然没有每个域名的具体信息,但储存了负责每个域(如COM、NET、ORG等)的解析的域名服务器的地址信息。根域名服务器会将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器,这样你的域名查询请求会进入到相应的顶级域名服务器。顶级域名服务器收到请求后查看区域文件记录,若找到则将其管辖范围内主域名(不带任何前缀的域名,如 baidu.com)服务器的IP地址告诉本地DNS服务器。如果还是没有找到,则进入到下一级域名服务器进行查找。如此重复,直到找到正确的 结果为止,返回 IP地址结果给本地DNS服务器。
本地DNS服务器缓存结果,设置(Time-To-Live)即一条域名解析记录在DNS服务器上缓存时间,关于TTL如果IP经常改变,那么TTL设的短一点长一点都没有太大的 影响,而如果IP经常不变,可以把TTL时间拉长,这样有利于提高命中率。
2.对IP结果建立TCP连接
自己主机IP端口的对目标IP的端口(例:http://www.baidu.com http协议所占用的TCP端口为80端口)三次握手建立TCP连接。
3.向服务器发送数据
浏览器将网络请求封装成HTTP报文,把HTTP报文通过TCP的分包,分成一个个TCP数据包。IP层把上层传输层数据包打包成IP层数据包,并把该数据包发送到更低层数据链路层,相反,IP层也把从低层接收来的数据包传送到更高层TCP或UDP层。(补:IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址))
通过这套封装包过程,发送到服务器端,服务器端则是一个拆包的过程,IP层是不可靠的,所以没有确认的机制,而在上层的TCP层则会对数据包的可靠性进行验证,丢失则会重传数据。保证传输的可靠性。服务器最终解包会拼接成一个完整的HTTP报文,完成整个数据的发送。
4.服务器解析,并返回
对HTTP报文进行解析,根据HTTP报文决定它请求了什么。将处理的结果组装成响应报文(如www.baidu.com , 请求报文为GET,要获取的是缺省值默认的index.html这个主页,则返回网页的源码,将网页源码添加到响应报文正文中),其中比较关键的是状态码(200OK表示成功没毛病),然后将响应报文,通过之前的过程返还给咱们的主机IP。
5.浏览器解析HTML
浏览器加载显示html的顺序是:从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。如果遇到语义解释性的标签嵌入文件(JS脚本,CSS 下载过程会启用单独连接进行下载,并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载(断点)。最终加载完成显示在浏览器上。