浏览器的回车

78 阅读8分钟

可以针对不同模块进行性能优化

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请求报文
    1. 报文首部:在客户端和服务器处理是至关重要的信息在此处
  • 请求行:方法、URI、http版本
  • 请求首部字段:http首部字段
  • Accept(Charset/Encoding/Languange/Authorization)
  • 2.报文主体:用户信息以及资源信息
http响应报文
    1. 报文首部
  • 状态行:http版本、状态码
  • 响应首部字段:http首部字段
    1. 报文主体

浏览器处理返回结果

  • 重排、重绘
  • HTML的解析和渲染
  1. 浏览器获取到HTML后解析为DomTree
  2. 解析到css后根据规则生成css规则树 style rules
  3. 根据Dom Tree 和 css规则树 =》生成渲染树 render tree
  4. 渲染树构建完成后,浏览器开始计算元素大小和位置 layout
  5. 根据计算绘制页面 painting

链接断开

安全问题:主动攻击/被动攻击

  • CSRF:跨站请求攻击
  • XSS:跨站脚本攻击
  • HTTP首部注入攻击
  • SQL注入攻击