整体分为这么几个过程:html
具体过程
一、DNS解析
DNS解析的过程就是寻找哪台机器上有你须要资源的过程。当输入www.baidu.com的时候,实际上是要找对应的ip地址,DNS充当了翻译的角色,实现了网址到IP地址的转换。由于互联网上的每一台计算机的惟一标识是它的IP地址。前端
解析过程:编程
DNS解析是一个递归查询的过程。json
首先在本地域名服务器中查询IP地址,若是没有找到的状况下,本地域名服务器会向根域名服务器发送一个请求,若是根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器获得baidu的IP地址并把它缓存到本地,供下次查询使用。从上述过程当中,能够看出网址的解析是一个从右向左的过程: com -> baidu.com -> www.baidu.com。可是你是否发现少了点什么,根域名服务器的解析过程呢?事实上,真正的网址是www.baidu.com.,并非我多打了一个.,这个.对应的就是根域名服务器,默认状况下全部的网址的最后一位都是.,既然是默认状况下,为了方便用户,一般都会省略,浏览器在请求DNS的时候会自动加上,全部网址真正的解析过程为: . -> .com -> baidu.com. -> www.baidu.com.。后端
二、TCP链接
三、 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。
四、服务器处理并返回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, 图片等文件就放在这一部分。
五、浏览器解析渲染页面