在浏览器上请求一个URL的全部过程

  当我们在浏览器中输入一个网址的时候主要经过了六个步骤来最终把网页完整的展现给我们。

  • 第一步要进行的就是域名解析

我们在浏览器中输入的是一个www.baidu.com,浏览器首先要做去获得我们想访问网页的IP地址,浏览器会发送一个UDP的包给DNS域名解析服务器。DNS就会返回给我们百度的IP地址,通常来说浏览器会把访问过的网站的IP保存下来,这样下次访问的时候就会快很多,能够节省很多时间。

通常来说在解析域名的时候,浏览器就会先看看自己本地的host文件,来看看里边有没有和域名对应的IP地址,如果有就直接使用,如果没有的话浏览器就会发送一个请求到本地的DNS服务器,本地的DNS服务器一般来说都是由网络接入商提供的,比如中国电信等。当本地的DNS服务器收到请求之后会,DNS也会先查询自己的缓存,这个过程是递归查询的,如果缓存中存在就会直接返回,如果这时候还是没有找到对应的IP本地的DNS服务器就向根DNS服务器发送请求进行查询。根DNS服务器上是没有记录哪个域名和IP的对应关系的,他会告诉本地的DNS服务器。你可以到域服务器上进行查询,并且告诉他这个域服务器的地址,这个过程是迭代查询的。这时候本地的DNS服务器会向域服务器发送请求,这里我们请求的是www.baidu.com也就是.com的域名服务器,当.com域服务器收到请求之后,并不会直接返回域名和IP的关系,而是会告诉你的域名的解析服务器的地址,最后本地的DNS服务器向域名的解析服务器发送请求,这时候就能收到一个域名和IP的对应关系,本地的DNS服务器不仅吧这个返回给用户和电脑而且还会自己保存下来,这样下次再访问的时候就能直接返回

DNS 域名系统就和我们常用的电话本一样,我们很难记住每个人的手机号,这时候我们只用把他存起来,下次再简单的时候看这些备注我们就知道是谁了。DNS服务器在查询的时候主要有两种方式:

  1. 递归查询方式

当局部的DNS服务器不能回答请求的时候,他就需要向其他DNS服务器发送请求

在浏览器上请求一个URL的全部过程

局部服务器DNS自己向其他服务器进行查询,一般来说先向该域名的根域服务器进行查询,然后再由根域名服务器向下进行查询,最后得到结果之后返回给局部服务器,然后再由局部服务器返回给我们的客户端。

     2.迭代查询的方式

在浏览器上请求一个URL的全部过程

迭代查询的方式就是,局部的DNS服务器并不会自己向其他服务器进行查询,而是把能够解析该域名的服务器IP地址返回给客户端,客户端会不断的向这些服务器进行查询,直到查询到了位置,迭代的话只会帮你找到相关的服务器,然后说我现在比较忙,你自己去找吧。

DNS还有负载均衡的作用,现在很多网站都有多个服务器,当一个网站访问量过大的时候,如果所有请求都请求在同一个服务器上,可能服务器就会崩掉,这时候就用到了DNS负载均衡技术,当一个网站有多个服务器地址时,在应答DNS查询的时候,DNS服务器会对每个查询返回不同的解析结果,也就是返回不同的IP地址,从而把访问引导到不同的服务器上去,来达到负载均衡的目的。例如可以根据每台机器的负载量,或者该机器距离用户的地理位置距离等等条件。

   之后我们就可以去建立HTTP协议链接,但是HTTP链接是必须建立在TCP链接上边的,但是想要建立TCP链接的话是需要四个东西:本机IP,服务器IP,本机端口,服务器端口现在已经有本机IP和服务器IP了,本机端口会由操作系统随机给浏览器分配一个,而服务器端口用的是一个众所周知的端口,HTTP的默认端口就是80,这时候我们就具备了进行TCP链接的条件。

  • 进行三次握手创建TCP链接。

我们都知道在创建TCP链接的时候需要进行三次握手,当三次握手成功的时候TCP链接算是成功创建了,这时候就可以发送HTTP请求了。

  • 当HTTP协议经过多个路由器成功到达了服务器之后,这时候服务器就要去处理浏览器发来的请求。

服务器在处理请求的时候主要有三种方式:第一种是用一个线程来处理所有的请求,并且同时只能处理一个请求,但是这样的话性能是非常的低的。第二种是每一个请求都给他分配一个线程但是当链接和请求比较多的时候就会导致服务器的cpu不堪重负。第三种就是采用复用I/O的方式来处理例如通过epoll方式监视所有链接当链接状态发生改变的时候才去分配空间进行处理。

  • 处理完请求之后向浏览器返回网页的html

   当服务器把文件数据发送给浏览器之后,能够直接关闭TCP吗?如果你是使用的是HTTP1.1这个版本下默认的方式是keep-alive这时候TCP是不关闭的,如果在1.0版本下有keep-alive关键字也是不能进行关闭的。

  • 解析HTML

当浏览器收到HTML之后会对其进行解析,在这个过程中可能这个HTML页面引用了大量的js、css、图片等文件,这些资源可能在刚刚的服务器上也可能在其他的服务器上,这时候浏览器就会和上边步骤一样去请求这些资源,如果需要下载的资源太多,浏览器会同时创建多个TCP链接去获取资源,但是同一时间对同一域名下请求数量也不能过多,不然服务器访问量过大,难以承受负载,这时候浏览器就要对其进行控制,例如在chrome浏览器HTTP1.1版本下同时允许最多创建六个TCP链接,在服务器发送这些js、css文件的时候通常会告诉浏览器他什么时候会过期,浏览器就可以把这些文件缓存到本地,在这些文件还没有过期之前就可以直接从缓存中进行访问。

  • 断开TCP连接

当我们数据传输结束的时候,我们就可以断开TCP连接。

这时候我们的网页就完整的展现在我们的浏览器上了。