1. 输入地址
浏览器url自动补全,匹配
2. 浏览器查找域名的ip:
- 本地hosts文件查找
- 浏览器发出DNS请求到本地DNS(公司DNS服务器或网络接入服务商的DNS服务器)
- 本地DNS服务器从缓存记录中查找,递归查询,找到则返回,没找到向DNS根服务器(13台根服务器)进行查询
- 根DNS服务器不记录具体的域名和IP对应关系,而是告诉本地DNS服务器域服务器地址(13台顶级域名服务器),找域服务器迭代查询
- 本地DNS服务器向域服务器发出请求,比如对象是.com域服务器,.com域服务器也不会直接返回域名和ip对应关系,而是告诉本地DNS域名解析服务器的地址
- 本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS把ip返回给用户电脑,同时本地DNS也会缓存方便供下次查询
知识扩展:
2.1 常用域名解析linux命令
dig、nslookup,host
2.2 DNS查询的两种方式:递归查询和迭代查询
递归查询:一般是本地DNS服务器向根域名服务器查询,然后由跟域名服务器一级级向下查询,查找到结果后返回给本地DNS服务器,然后返回给客户端
迭代查询:局部DNS服务器不是自己向其他DNS服务器进行查询,而是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序再继续向这些DNS服务器进行查询,直到得到查询结果为止
2.3 什么是DNS
域名和IP地址相互映射的一个分布式数据库
2.4 DNS域名称空间的组织方式
3. 浏览器向 web 服务器发送一个 HTTP 请求
3.1 TCP三次握手建立连接
3.2 http请求信息
请求信息包含三个部分:
第一部分:请求方法URI 协议/版本
第二部分:请求头(Request Header)
第三部分:请求正文
ps: 请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文
1 | GET /s?wd=tinyint%20mysql%20%E8%8C%83%E5%9B%B4&rsv_spt=1&rsv_iqid=0xdc5b82ba0000f8f1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=92821989_s_hao_pg&rsv_enter=1&rsv_sug3=1 HTTP/1.1 |
3.3 HTTP请求方法-get,put,post,delete含义与区别
一个URL地址,它用于描述一个网络上的资源,而HTTP中的POST,GET,PUT,DELETE,PATCH就对应着对这个资源的创建,查看,创建或更新,删除,部分更新等五种操作
方法 | 作用 | 幂等 | 安全 |
---|---|---|---|
GET | 用于信息获取 | 是 | 是 |
POST | 一般用于创建数据 | 否 | 否 |
PUT | 创建或完整更新数据 | 是 | 是 |
DELETE | 一般用于删除数据 | 是 | 是 |
PATCH | 一般用于更新部分数据( 对PUT请求的补充 | 否 | 否 |
3.4 http code与缓存层
- 200状态:当浏览器本地没有缓存或下一层失效时或用户点击CTRL+F5,直接去服务器下载最新数据
- 304状态:这一层由last-modify/etag控制。当下一层失效或用户点击F5时,浏览器会发送请求给服务器,如果服务端没有变化,则返回304给浏览器
ps:etag是对url进行标记,检测标记是否存在,但是由于分布式系统中各个机器生成的标记不同,所以一般会关闭掉 - 200(from cache):这一层由expires/cache-control控制。
1. expires(http1.0版有效)是绝对时间。
2. cache-control(http1.1版本有效),相对时间,两者都存在时,cache-control覆盖expires只要没有失效,浏览器只访问自己的缓存
总结:expires和cache-control都是本地的缓存过期时间,缓存期不会请求服务端,last-modify会发生服务端的请求,检测服务端是否有更改。
4. 服务器的永久重定向响应
4.1 为什么使用永久重定向(301)
- 提升搜索引擎排名(就像http://www.yy.com/和http://yy.com/,搜索引擎会认为它们是两个网站,结果造成每个搜索链接都减少从而降低排名,设定为301后,搜索引擎会认为是一个网站)
- 缓存友好性变差(同一个页面有好几个url时,会被重复缓存多次)
4.2 301和302的区别
共同点:都是重定向,重定向地址可以在响应头location中获取,效果是:用户输入A瞬间变成B
区别:301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO302好于301
4.3 重定向原因:
- 网站调整
- 网页被移到一个新的地址
- 多域名网站重定向到主站
4.4 什么时候进行301或者302跳转呢?
- 域名到期不想续费(或者发现了更适合网站的域名),想换个域名。
- 在搜索引擎的搜索结果中出现了不带www的域名,而带www的域名却没有收录,这个时候可以用301重定向来告诉搜索引擎我们目标的域名是哪一个。
- 空间服务器不稳定,换空间的时候。
5. 服务器处理请求
5.1 什么是反向代理,正反向代理区别
5.1.1 正向代理
原理:就是代理,原理就像一个跳板,访问不了某个网站,通过代理服务器就可以访问。比如通过vpn访问公司内网
特点:客户端为了访问原始服务器,通过请求代理服务器,然后代理向原始服务器转交请求获取内容后,转给客户端。必须要进行一些特别的设置才能使用正向代理
5.1.2. 反向代理
原理:对于客户端而言,它更像是原始服务器,客户端不需要特别的设置,直接向反向代理服务器发送请求,反向代理服务器自己判断向应用服务器转发请求,获取内容后返回给客户端。
特点:客户端不需要特别的设置,从反向代理服务器获取内容就像从原始服务器获取一样。
5.1.3. 区别
用途:
- 正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。
- 反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。
- 反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下
安全性:
- 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务
- 反向代理对外都是透明的,访问者并不知道自己访问的是一个代理
参考:
5.2 阿里云负载均衡(SLB)最佳实践
负载均衡(Server Load Balancer,下文简称 SLB)的引入,可以降低单台云服务器 ECS(下文简称 ECS)出现异常时对业务的冲击,提升业务的可用性。同时,结合弹性伸缩服务,通过动态调整后端服务器,可以快速对业务进行弹性调整(扩容或缩容),以快速应对业务的发展。
参考:
5.3 Nginx+Keepalived实现站点高可用
参考:
5.4 服务器内部处理
- redis缓存
- mysql优化
- 代码优化
- …
6. 服务器返回一个 HTTP 响应
1 | HTTP/1.1 301 Moved Permanently |
6.1 状态行
状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔
格式: HTTP-Version Status-Code Reason-Phrase CRLF
例如: HTTP/1.1 200 OK \r\n
- 1xx:信息性状态码,表示服务器已接收了客户端请求,客户端可继续发送请求。
100 Continue
101 Switching Protocols
- 2xx:成功状态码,表示服务器已成功接收到请求并进行处理
200 OK 表示客户端请求成功
204 No Content 成功,但不返回任何实体的主体部分
- 3xx:重定向状态码,表示服务器要求客户端重定向
301 永久重定向
302 临时重定向
304 页面未修改
- 4xx:客户端错误状态码,表示客户端的请求有非法内容
400 Bad Request 表示客户端请求有语法错误,不能被服务器所理解
401 Unauthonzed 表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用
403 Forbidden 表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因
404 Not Found 请求的资源不存在,例如,输入了错误的URL
- 5xx:服务器错误状态码,表示服务器未能正常处理客户端的请求而出现意外错误。
500 服务器内部未知错误
502 错误的网关
503 服务临时不可用
504 网关超时
6.2 响应头
响应头部:由关键字/值对组成,每行一对,关键字和值用英文冒号”:”分隔
典型的响应头有:
| 应答头 | 说明 |
| —————- | —————————————- |
| Allow | 服务器支持哪些请求方法(如GET、POST) |
| Content-Encoding | 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Servlet可以通过查看Accept-Encoding头检查浏览器是否支持gzip(即request.getHeader(‘Accept-Encoding’)),为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。 |
| Content-Length | 表示内容长度。 |
| Content-Type | 表示文档属于什么MIME类型。默认为text/plain,通常设置为text/html |
| Date | 当前的GMT时间(世界标准时间,加8小时为北京时间) |
| Expires | 文档过期时间,浏览器缓存失效 |
| Last-Modified | 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,只有改动时间晚于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。 |
| Location | 重定向后的地址,状态代码一般为301(永久重定向)或302(临时重定向) |
| Refresh | 表示浏览器多少时间后刷新文档,以秒计。注意Refresh的意义是”N秒后刷新页面或访问指定页面”,而不是”每隔N秒刷新本页面或访问指定页面”。想要连续刷新要求每次都发送一个Refresh头。 |
| Server | 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。 |
| Set-Cookie | 设置和页面关联的Cookie。 |
| WWW-Authenticate | 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。一般由Web服务器来控制受密码保护页面的访问(如.htaccess) |
源图片参考:典型的响应头
6.3 响应正文
包含着我们需要的一些具体信息,比如cookie,html,image,后端返回的请求数据等等.
响应正文和响应头之间有一行空格,表示响应头的信息到空格为止
7. 浏览器显示 HTML和加载静态资源
不同浏览器可能解析的过程不太一样,这里我们只介绍webkit的渲染过程,下图对应的就是WebKit渲染的过程,这个过程包括:
解析html以构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树
- 浏览器在解析html文件时,会”自上而下“加载,并在加载过程中进行解析渲染。在解析过程中,如果遇到请求外部资源时,如图片、外链的CSS、iconfont等,请求过程是异步的,并不会影响html文档进行加载
- 解析过程中,浏览器首先会解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上
- 这个过程比较复杂,涉及到两个概念: reflow(回流)和repain(重绘)
7.1 reflow和repain
DOM节点中的各个元素都是以盒模型的形式存在,这些都需要浏览器去计算其位置和大小等,这个过程称为relow;
当盒模型的位置,大小以及其他属性,如颜色,字体,等确定下来之后,浏览器便开始绘制内容,这个过程称为repain
7.2 为什么把js文件一般放到文档末尾
加载js文件时,html会挂起渲染,等待文档js文件加载完毕,并且等待解析执行完毕后,才能恢复html文档的渲染线程。
当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,
才可以恢复html文档的渲染线程。因为JS有可能会修改DOM,最为经典的document.write,这意味着,在JS执行完成前,后续所有资源的下载可能是没有必要的,这是js阻塞后续资源下载的根本原因。
所以我们平时的代码中,js是放在html文档末尾的
7.3 浏览器发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS等等)
图片、CSS式样表、JavaScript 文件,这些地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求,重定向等等。
不像动态页面,静态文件会允许浏览器对其进行缓存。有的文件可能会不需要与服务器通讯,而从缓存中直接读取,或者可以放到CDN中。
参考: