详解浏览器输入网址后发生了什么


浏览器是我们平时经常使用一种工具,我们在浏览器地址栏输入一个URL后,敲下回车键,浏览器就会反馈我们一个页面。这个过程背后其实发生了很多。
讲解过程之前,先介绍一下一台主机是如何连接到网络的。

一台主机的联网过程

一台主机想要连接网络,首选需要获得一个属于自己的IP地址, IP地址用于标识主机的地址。IP的具体获得步骤简述如下:

①主机的操作系统生成一个DHCP请求报文,然后吧报文发给传输层,传输层将这个报文放入具有目的端口(DHCP服务器)和源端口(本机)的UDP报文段中, 之后UDP报文段在网络层会被添加到一个具有广播地址(255.255.255.255)和源IP地址为0.0.0.0的IP数据报中,接着包含DHCP请求报文的IP数据报被转为以太网帧(局域网CSMA/CD协议)。

②该帧会发送给以太网交换机, 并在所有的输出端口广播该帧,DHCP服务器接受到该帧时(运行在路由器中), DHCP服务器为该主机分配IP地址, 并把分配的IP地址,DNS服务器地址, 默认网关路由器地址, 网络掩码等信息一起封装成一个报文,再通过路由器的各层封装处理,发送给主机.,主机收到IP地址信息后,会再次与DHCP服务器通信来确认。

这样一台主机就获得了自己的IP地址与其他网络配置信息, 可以在浏览器里上网了。

过程简述

浏览器输入一个网址到反馈信息给用户这个过程,中间的大致流程如下:

  1. 在客户端浏览器中输入网址URL。

  2. 发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址。

  3. 有了IP后,客户端浏览器就可以与WEB服务器建立TCP(传输控制协议)连接。

  4. 客户端浏览器向对应IP地址的WEB服务器发送相应的HTTP或HTTPS请求。

  5. WEB服务器收到客户端请求,返回给用户指定的URL数据或错误信息;如果设定重定向,则重定向到新的URL地址,重新开始第一步。

  6. 客户端浏览器解析HTML源文件,解析的过程中实现对页面的排版,解析完成后,在浏览器中显示基础的页面。

  7. 分析页面中的超链接(如图片,样式等也是一个URL),过程和以上过程类似,之后再显示在当前页面,重复以上过程直至没有超链接需要发送,完成页面的全部加载。

过程详解

输入网址获取IP

比如我们现在要访问百度, 输入URL:www.baidu.com在浏览器后, 我们的主机需要知道百度的IP地址才能与百度的服务器建立TCP连接,建立连接后才可以发送HTTP请求, 下面将介绍根据DNS协议完成URL名字到IP转换的过程:
介绍具体步骤前先介绍一下DNS的概念。

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
通俗的讲,我们更习惯于记住一个网站的名字,比如www.baidu.com,而不是记住它的ip地址,比如:167.23.10.2。而计算机更擅长记住网站的ip地址,而不是像www.baidu.com等链接。因为,DNS就相当于一个电话本,比如你要找www.baidu.com这个域名,DNS翻一翻电话本,我就知道,它的电话(ip)是167.23.10.2。

第一步:
查找浏览器缓存:因为浏览器一般会缓存DNS记录一段时间,浏览器去查找这些缓存,如果有缓存,就可以直接返回IP,否则下一步。

第二步:
查找系统缓存:浏览器缓存中找不到IP之后,浏览器会进行系统调用,查找本机的hosts文件,如果找到,直接返回IP,否则下一步。

第三步:
查找路由器缓存:如果1,2步都查询无果,则需要借助网络,路由器一般都有自己的DNS缓存,这个过程具体如下:

1)把URL放入DNS报文中, 再在主机传输层根据DNS服务器端口封装为报文段,在网络层封装IP数据报, 最后在数据链路层放入到以太网帧中, 并将该帧通过物理层传输发送到你的路由器。

2)虽然在第4步中已经获得了网关路由器的IP地址, 但还不知道其MAC地址. 为了获得网关路由器的MAC地址, 需要使用ARP查询报文,接着把ARP封装进以太网帧中, 逻辑过程和上一步类似,并在以太网中广播, 最终获得网关的MAC地址。

3)有了网关MAC地址后, 承载DNS报文的数据报就能到达DNS服务器了,我们假设DNS服务器缓存有www.baidu.com的IP地址, DNS服务器会把URL对应的IP地址通过报文发送给传输层, 放入到UDP报文段中, 进而封装成包含我们主机地址的IP数据报, 并通过网络反向传输回我们的主机。
如果路由器DNS中仍然没有缓存百度的IP地址,就到转第四步。

第四步:
如果以上步骤还找不到,DNS服务器就会使用一下两种方式来间接获取IP。

  1. 递归查询:
    如果以上步骤还找不到,则DNS服务器就会进行递归查询,所谓递归查询就是如果主机所询问的本地域名服务器不知道其的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文来获得百度的IP地址,而不是让该用户主机自己进行下一步查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端。

  2. 迭代查询:
    迭代查询的方式是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序自己再继续向这些DNS服务器进行查询,直到得到查询结果为止。也就是说,迭代解析只是帮你找到相关的服务器而已,而不会帮你去查。

4)这时我们的主机得到了服务器www.baidu.com的IP地址, 可以访问百度的服务器了。

建立TCP连接

有了百度服务器的IP地址后, 可以与服务器建立TCP连接。

TCP建立连接的过程(三次握手):

第一次握手:
客户端主机A将标志位SYN值设为1,再随机产生一个值为seq=J(J的取值范围为=1234567)的数据包通到各协议层封装传输到服务器,客户端A进入SYN_SENT状态(请求连接状态),等待服务端B确认;

第二次握手:
服务端B收到数据包后由标志位SYN=1就知道客户端A的请求是建立连接,服务端B将标志位ACK设为1,再设ack=J+1(这里主要ack与ACK的区分),再随机产生一个值seq=K,并将该数据包发送给客户端A以确认连接请求,服务端B进入SYN_RCVD状态(SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态)。

第三次握手:
客户端A收到数据报后,检查ack是否为J+1,如果正确则令ack=K+1,标志位ACK为1,将该数据包发送给服务端B,服务端B检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端A和服务端B进入ESTABLISHED状态(连接成功状态),完成三次握手,随后客户端A与服务端B之间可以开始传输数据了。
在这里插入图片描述

这里顺便把TCP的断开也说明一下:

TCP的断开过程(四次挥手)

第一次挥手:
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态(主动要求关闭tcp连接)。

第二次挥手:
Server收到FIN后,发送ACK给Client,确认序号为收到序号+1,Server进入CLOSE_WAIT状态(等待关闭状态)。

第三次挥手:
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态(等待远程TCP的连接中断请求的确认状态)。

第四次挥手:
Client收到FIN,接受ACK并验证后,Client进入TIME_WAIT状态(先发FIN标志位的一端就会进入time_wait状态),接着发送一个ACK给Server,确认序号为收到序号+1,Server收到ACK并验证后进入CLOSED状态,完成四次挥手。
在这里插入图片描述

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

释放连接时需要四次是因为TCP连接的半关闭造成的。由于TCP是全双工的(即数据可在两个方向上同时传递),因此,每个方向都必须要单独进行关闭,当服务器收到客户端的FIN报文通知时,它仅仅表示客户端没有数据发送服务器了;但服务器未必将所有的数据都全部发送给了客户端,所以服务器端未必马上也要关闭连接,也即服务器端可能还需要发送一些数据给客户端之后,再发送FIN报文给客户端来表示现在可以关闭连接了,所以它这度里的ACK报文和FIN报文多数情况下都是分开发送的,这也是为什么释放连接时需要交换四次报文了。

发起http请求

在三次握手的第三阶段, 我方主机需要向服务器发送ACK报文段, 就可以在ACK报文段中放入数据,并发送给服务器。客户端向服务器发起http请求的时候,会有一些请求信息。

HTTP请求信息:
HTTP请求包含三个部分:请求方法,请求头,请求正文。
| 请求方法URI协议/版本

例如:GET /books/?sex=man&name=Professional  HTTP/1.1
请求方法有很多,例如:GET Post HEAD PUT DELETE 等等

| 请求头(Request Header)

请求头包含许多有关的客户端环境和请求正文的有用信息。
例如,请求头可以声明浏览器所用的语言,请求正文的长度等。

| 请求正文:

请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束.
接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
如username=zss&password=123

服务器接收到HTTP 报文后, 会返回一个HTTP响应报文或重定向信息
HTTP响应信息:
HTTP 响应也是由三个部分组成,分别是:状态行、消息报头和响应正文
| 状态行

状态行由协议版本、数字形式的状态代码,及相应的状态描述组成
如:200 OK //客户端请求成功  404 Not Found //请求资源不存在等

| 消息报头

Date:作用:生成消息的具体时间和日期,即当前的GMT时间。
Expires:作用: 浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。

| 响应正文

响应正文就是服务器返回的资源的内容,响应头和正文之间也必须用空行分隔

最后我们的主机读取HTTP响应报文, 抽取出html数据, 并将网页显示在浏览器上。

重定向信息

对于大型网站存在多个主机站点,为了负载均衡或者导入流量,往往不会直接返回请求页面,而是重定向。返回的状态码就不是200OK,而是301,302以3开头的重定向码,浏览器在获取了重定向响应后,在响应报文中Location项找到重定向地址,浏览器重新回到第一步访问。

重定向的作用:重定向是为了负载均衡或者导入流量。利用一个前端服务器接受请求,然后负载到不同的主机上,可以大大提高站点的业务并发处理能力;重定向也可将多个域名的访问,集中到一个站点;比如baidu.com,www.baidu.com,永久重定向会将两个地址关联起来,来提高网站的自然排名。

浏览器显示 HTML

在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。比如我要获取外图片,CSS,JS文件等,类似于下面的链接:
图片:http://zhangsaisaiPNG.com/8q2anwu7.gif
CSS式样表:http://zhangsaisaiCSS.com/2plh8s4n.css
JavaScript 文件:http://zssjscript.com/c8yzb6ub.js
这些地址都要经历一个和HTML读取类似的整个访问过程
所以浏览器会在DNS中查找这些域名,发送请求,重定向等等…

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值