可以针对不同模块进行性能优化
DNS域名解析(CDN原理)
- CDN是将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。
部署了CDN的时候
- 浏览器将域名解析为IP地址,向本地DNS发送请求
- 本地DNS依次向根服务器、顶级域名服务器、权限服务器发送请求;得到全局负载均衡系统(GSLB)的IP地址
- 本地DNS再向GSLB发出请求。GSLB主要是根据DNS的IP判断请求的位置,筛选到距离用户较近的SLB的位置,并将SLB的IP作为结果返回给DNS
- DNS将SLB的IP发送给浏览器,浏览器向其发送请求
- SLB根据请求的资源,选择最优的缓存服务器发回给浏览器
- 浏览器将请求重定向到缓存服务器
- 缓存服务器有其请求的资源就返回;没有的话,向源服务器请求,并返回资源
没有部署CDN的时候
- 浏览器需要将域名解析为IP地址,因此向本地DNS发出请求
- 本地DNS依次向根服务器、顶级域名服务器、权限服务器发出请求,最终得到域名的IP地址。
- DNS将IP发送给浏览器,浏览器向网站服务器IP地址发出请求,得到请求的资源
TCP/IP链接
- 32 比特的序号字段和确认号字段,TCP 字节流每一个字节都按顺序编号。确认号是接收方期望从对方收到的下一字节的序号。
- ACK 标志位,用于指示确认字段中的值是有效的 ACK=1 有效,ACK=0 无效。
- SYN 标志位,用于连接建立,SYN 为 1 时,表明这是一个请求建立连接报文。
- FIN 标志位,用于连接拆除,FIN 为 1 时,表明发送方数据已发送完毕,并要求释放连接。
三次握手
TCP 标准规定,ACK 报文段可以携带数据,但不携带数据就不用消耗序号。
- TCP 报文段到达服务器主机后,服务器提取报文段,并为该 TCP 连接分配缓存和变量。然后向客户端发送允许连接的 ACK 报文段(不包含应用层数据)。这个报文段的首部包含 4 个信息:ACK 置 为 1,SYN 置为 1;确认号字段置为客户端的序号 + 1;随机选择自己的初始序号(一般为 0)
- 收到服务器的 TCP 响应报文段后,客户端也要为该 TCP 连接分配缓存和变量,并向服务器发送一个 ACK 报文段。这个报文段将服务器端的序号 + 1 放置在确认号字段中,用来对服务器允许连接的报文段进行响应,因为连接已经建立,所以 SYN 置为 0。最后一个阶段,报文段可以携带客户到服务器的数据。并且以后的每一个报文段,SYN 都置为 0
- 客户端发送一个不包含应用层数据的 TCP 报文段,首部的 SYN 置为 1,随机选择一个初始序号(一般为 0)放在 TCP 报文段的序号字段中。(SYN 为 1 的时候,不能携带数据,但要消耗掉一个序号)
四次分手
- FIN 报文段即使不携带数据,也要消耗序号
- 服务器回送一个确认报文段
- 服务器发送 FIN 置为 1 的报文段
- 客户端回送一个确认报文段
- 客户端发送一个 FIN 置为 1 的报文段
为什么是四次分手,不是三次
- 当 A 给 B 发送 FIN 报文时,代表 A 不再发送报文,但仍可以接收报文
- B 可能还有数据需要发送,因此先发送 ACK 报文,告知 A “我知道你想断开连接的请求了”。这样 * A 便不会因为没有收到应答而继续发送断开连接的请求(即 FIN 报文)
- B 在处理完数据后,就向 A 发送一个 FIN 报文,然后进入 LAST_ACK 阶段(超时等待)
- A 向 B 发送 ACK 报文,双方都断开连接
HTTP请求(书:图解Http)
浏览器将CORS请求分成两类:跨域资源共享 CORS 详解
简单请求:
1.GET/POST/HEAD
2.HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
GET
- 参数URL可见
- URL拼接参数;get的最大长度限制是因为浏览器和web服务器限制了URL的长度
- 请求可以缓存,后退不影响页面
- GET产生一个TCP数据包
POST
- 参数URL不可见
- body体传递参数
- 请求不可用缓存,回退重新请求数据
- POST产生两个TCP数据包:浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
Cookie:cookie和session都是用来跟踪浏览器用户身份的会话方式
- cookie保存在浏览器端.如果不在浏览器中设置过期时间,cookie被保存在内存中,生命周期随浏览器的关闭而结束.如果在浏览器中设置了cookie的过期时间,cookie被保存在硬盘中,关闭浏览器后,cookie数据仍然存在,直到过期时间结束才消失。
- Cookie是服务器发给客户端的特殊信息,cookie只能以文本的方式保存在客户端,每次请求时都带上它
- cookie:单个cookie保存的数据不能超过4k
Session:cookie和session都是用来跟踪浏览器用户身份的会话方式
- session保存在服务器端
- session通过类似与Hashtable的数据结构来保存,能支持任何类型的对象(session中可含有多个对象)
- session大小没有限制
Localstorage(本地存储)
- localStorage的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失。localStorage除非主动删除数据,否则数据永远不会消失
- localStorage和sessionStorage的存储数据大小一般都是:5MB
- localStorage和sessionStorage都保存在客户端,不与服务器进行交互通信。
- localStorage和sessionStorage只能存储字符串类型,对于复杂的对象可以使用ECMAScript提供的JSON对象的stringify和parse来处理
SessionStorage(会话存储)
- sessionStorage的生命周期是在仅在当前会话下有效。sessionStorage引入了一个“浏览器窗口”的概念,sessionStorage是在同源的窗口中始终存在的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源另一个页面,数据依然存在。但是sessionStorage在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口同一个页面,sessionStorage也是不一样的。
- localStorage和sessionStorage的存储数据大小一般都是:5MB。
- localStorage和sessionStorage都保存在客户端,不与服务器进行交互通信。
- localStorage和sessionStorage只能存储字符串类型,对于复杂的对象可以使用ECMAScript提供的JSON对象的stringify和parse来处理
非简单请求:预检:OPTIONS
- Origin
- Access-Control-Request-Method:该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT。
- Access-Control-Request-Headers:该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header。
- 一旦服务器通过了”预检”请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin头信息字段。
HTTP2 相比 HTTP1.1 有如下几个优点
- 解析速度快
- 多路复用
- 首部压缩
- 服务端推送
- 参考文档
- 通用首部字段
- Connection:连接的状态
http请求报文
-
- 报文首部:在客户端和服务器处理是至关重要的信息在此处
- 请求行:方法、URI、http版本
- 请求首部字段:http首部字段
- Accept(Charset/Encoding/Languange/Authorization)
- 2.报文主体:用户信息以及资源信息
http响应报文
-
- 报文首部
- 状态行:http版本、状态码
- 响应首部字段:http首部字段
-
- 报文主体
浏览器处理返回结果
- 重排、重绘
- HTML的解析和渲染
- 浏览器获取到HTML后解析为DomTree
- 解析到css后根据规则生成css规则树 style rules
- 根据Dom Tree 和 css规则树 =》生成渲染树 render tree
- 渲染树构建完成后,浏览器开始计算元素大小和位置 layout
- 根据计算绘制页面 painting
链接断开
安全问题:主动攻击/被动攻击
- CSRF:跨站请求攻击
- XSS:跨站脚本攻击
- HTTP首部注入攻击
- SQL注入攻击