从输入URL到页面展现全过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从输入URL到页面展现全过程相关的知识,希望对你有一定的参考价值。
参考技术A 为什么输入url就可以展现对应的页面呢?背后经历了什么?总体为以下几个过程
在浏览器输入网址(URL)后,首先要经过域名解析,因为浏览器只能通过IP地址找到对应的服务器,输入的是域名,那么就需要解析成IP地址。
DNS协议就是通过域名查找IP地址,或者逆向通过IP地址查找域名的服务。
DNS 是一个网络服务器(域名服务器),我们的域名解析简单来说就是在DNS服务器上记录一条信息记录
在客户端发送数据之前会发起TCP三次握手用以同步客户端和服务端的序列号的确认号,并交换TCP窗口大小信息。
考虑这样子的一种情况,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”。主要目的防止server端一直等待,浪费资源。
对于不同用户发送的请求,会结合配置文件,把不同请求委托给服务器上处理相应请求的程序进行处理(例如 CGI 脚本,JSP 脚本,servlets,ASP 脚本,服务器端 javascript,或者一些其它的服务器端技术等),然后返回后台程序处理产生的结果作为响应信息。
响应信息会以响应报文的形式返回给客户端,最后浏览器通过渲染引擎将网页呈现在用户面前
响应报文由响应行(request line)、响应头部(header)、响应主体三个部分组成
浏览器解析渲染页面分为一下五个步骤:
从输入URL到页面展现在用户面前,都发生了什么?
总体分为这么几个过程:
- DNS解析
- TCP连接
- 发送HTTp请求
- 服务器处理并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
具体过程
1、DNS解析
DNS解析的过程就是寻找哪台机器上有你需要资源的过程。当输入www.baidu.com的时候,其实是要找对应的ip地址,DNS充当了翻译的角色,实现了网址到IP地址的转换。因为互联网上的每一台计算机的唯一标识是它的IP地址。
解析过程:
DNS解析是一个递归查询的过程。
首先在本地域名服务器中查询IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到baidu的IP地址并把它缓存到本地,供下次查询使用。从上述过程中,可以看出网址的解析是一个从右向左的过程: com -> baidu.com -> www.baidu.com。但是你是否发现少了点什么,根域名服务器的解析过程呢?事实上,真正的网址是www.baidu.com.,并不是我多打了一个.,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求DNS的时候会自动加上,所有网址真正的解析过程为: . -> .com -> baidu.com. -> www.baidu.com.。
2、TCP连接
3、 HTTP请求
其实这部分又可以称为前端工程师眼中的HTTP,它主要发生在客户端。发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口(HTTP协议80/8080, HTTPS协议443)。HTTP请求报文是由三部分组成: 请求行, 请求报头和请求正文。
请求行
格式如下:
Method Request-URL HTTP-Version CRLF
eg: GET index.html HTTP/1.1
常用的方法有: GET, POST, PUT, DELETE, OPTIONS, HEAD。
TODO:
GET和POST有什么区别?
请求报头
请求报头允许客户端向服务器传递请求的附加信息和客户端自身的信息。
PS: 客户端不一定特指浏览器,有时候也可使用Linux下的CURL命令以及HTTP客户端测试工具等。
常见的请求报头有: Accept, Accept-Charset, Accept-Encoding, Accept-Language, Content-Type, Authorization, Cookie, User-Agent等。
请求正文
当使用POST, PUT等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中。在请求包头中有一些与请求正文相关的信息,例如: 现在的Web应用通常采用Rest架构,请求的数据格式一般为json。这时就需要设置Content-Type: application/json。
4、服务器处理并返回HTTP报文
自然而然这部分对应的就是后端工程师眼中的HTTP。后端从在固定的端口接收到TCP报文开始,这一部分对应于编程语言中的socket。它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。这一部分工作一般是由Web服务器去进行,我使用过的Web服务器有Tomcat, Jetty和Netty等等。
HTTP响应报文也是由三部分组成: 状态码, 响应报头和响应报文。
状态码
状态码是由3位数组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。平时遇到比较常见的状态码有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500(分别表示什么请自行查找)。
TODO:
301和302有什么区别?
HTTP缓存
响应报头
常见的响应报头字段有: Server, Connection...。
响应报文
服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。
5、浏览器解析渲染页面
参考:http://blog.csdn.net/aishangy...
以上是关于从输入URL到页面展现全过程的主要内容,如果未能解决你的问题,请参考以下文章