目录

---------

HTTP,HTML,浏览器

介绍一下 HTTP 和 HTTPS

HTTPS 的 SSL 加密实在传输层实现的

HTTP 和 HTTPS 的基本概念2

HTTP:超文本传输协议,是互联网上应用最广泛的一种网络协议,是客户端和服务端请求和相应的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的传输协议,HTTP 协议可以使浏览器更加高效,网络传输减少

HTTPS:以安全为目标的 HTTP 通道,简单讲就是 HTTP 的安全版,即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL

HTTPS 协议的主要作用:建立一个信息安全通道,来确保数据的传输,确保完善的的真实性

HTTP 和 HTTPS的区别

HTTP 传输的都是明文数据,也就是说没有加密的数据,网景公司设置了 SSL 协议来对 HTTP 协议传输的数据进行加密处理,简单来说 HTTPS 协议是由 HTTP 和 ssl 协议构建的可进行加密传输和身份认证的网络协议,比 HTTP 协议的安全性更高

HTTP 和 HTTPS 的主要区别:

HTTPS 协议的工作原理

img

对应的请求步骤:

  1. Client 发起一个 HTTPS请求(例如HTTPS://blog.plumbiu.club),根据 RFC2818 的规定,Client 知道需要连接 Server 的 443(默认)端口

  2. Server 把事先配置好的公钥证书(public key certificate)返回给客户端

  3. Client 验证公钥证书:比如是否在有效期内,证书的用途是不是匹配 Client 请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的 Root 证书或者Client 内置的 Root 证书)。如果验证通过则继续,不通过则显示警告信息

  4. Client 使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给 Server

  5. Server 使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client 和 Server 双方都持有了相同的对称密钥

  6. Server 使用对称密钥加密“明文内容A”,发送给 Client

  7. Client 使用对称密钥解密响应的密文,得到“明文内容A”

  8. Client 再次发起 HTTPS 的请求,使用对称密钥加密请求的“明文内容B”,然后 Server 使用对称密钥解密密文,得到“明文内容 B”

HTTPS 协议的优缺点

优点:

  1. HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户端和服务器
  2. HTTPS 协议是由 SSL+HTTP 协议构建的可加密传输、身份认证的网络协议,要比 HTTP 协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性
  3. 谷歌在 2014 年 8 月调整搜索引擎算法,采用 HTTPS 加密的网站在搜索结果中的排名将会更高

缺点:

  1. HTTPS 握手阶段比较费时,页面加载时间延长 50%
  2. HTTPS 缓存不如 HTTP 高效,会增加数据开销
  3. HTTP 需要 SSL 证书,功能越多的证书费用要高
  4. SSL 证书需要绑定 IP,不能在同一个 ip 绑定多个域名,ipv4 资源支持不了这种消耗

TCP

三次握手

一句话概括:

客户端和服务端都需要直到各自可收发,因此需要三次握手

简化逻辑图:

img

客户端将 TCP 报文标志位 SYN 置为 1,随机产生一个序号值 seq = J,保存在 TCP 首部的序列号(Sequence Number) 字段里,指名客户端打算连接的服务器端口,并将该数据包发送给服务器端,发送完毕后,客户端进入 SYN_SENT 状态,等待服务端确认

服务端收到的数据包后由标志位 SYN = 1 知道客户端请求建立连接,服务器端将 TCP 报文标志位 SYN 和 ACK 都置为 1, ack = J + 1,随机产生一个序列值 seq = K,并将该数据包发送给客户端已确认连接请求,服务端进入 SYN_RCVD 状态

客户端收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为1,ack= K + 1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K + 1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入 ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

小写的 ack 和大写的 ACK 是不同的概念

  • ack:Acknowledge number,表示头部确认号,是对上一个包的序号进行确认,即 ack = seq + 1
  • ACK:TCP 首部的标志位,用于标志的 TCP 包是否对上一个包进行了确认操作,如果确认了,则把 ACK 标志位设置成 1

四次挥手

逻辑图:

在断开连接之前客户端和服务器都处于ESTABLISHED状态,双方都可以主动断开连接,以客户端主动断开连接为优。

总结:

  1. 客户端打算关闭连接,向服务器发送报文,等待服务器确认
  2. 服务器接受到来自客户端的报文段,向客户端发送应答报文,等待服务器的数据发送完毕
  3. 服务器数据发送完毕,也准备断开,向客户端发送关闭连接的字段
  4. 客户端接受到来自服务器连接释放的报文,向服务器发送一个应答报文段,服务器收到后连接完成关闭,客户端等待 2MSL 后关闭

三次握手和四次挥手更加通俗的理解:

img

TCP 和 UDP 的区别

  1. TCP 是面向连接的,传送的数据确保正确性;UDP 是无连接的,即发送数据前不需要先建立链接,会出现丢包现象
  2. TCP 保证数据顺序;UDP 不保证
  3. TCP 对资源的要求较多;UDP 较少
  4. TCP 确保数据的正确性,因此适合大数据量的交换
  5. TCP 连接只能是 1 对 1 的;UDP 支持 1 对 1,也支持 1 对多
  6. TCP 首部为 20 字节;UDP 首部为 8 字节

HTTP 发展史

HTTP1.0

HTTP1.0 使用的是非持久连接,缺点是客户端必须为一个待请求的对象建立并维护一个新的连接,即每请求一个文档就要有两倍的 RTT 开销。并且由于同一个页面可能存在多个对象,所以非持久连接可能使一个页面的下载变得十分缓慢,这种短连接增加了网络传输的负担

RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值;

HTTP1.1

HTTP1.1 传输的内容是明文,不够安全

HTTP2.0

BOM 对象

BOM 是浏览器对象,有着很多关于浏览器的属性

location 对象作用
loction.href返回或设置当前文档 URL
location.search返回 URL 中查询字符串的部分(即 ? 之后的字符串)
location.hash返回 URL 中的哈希地址(即 # 后面的字符串)
location.host返回 URL 中的域名部分,例如 plumbiu.club
location.hostname返回 URL 域名后面的部分,例如 https://blog.plumbiu.club/links 返回 /links
location.port返回 URL 中的端口部分,例如 https://www.plumbiu.club:8001 返回 8001
location.protocol返回 URL 中的协议部分,即 // 之前的部分,例如 https://www.plumbiu.club 返回 https:
location.assign(url: string)设置当前文档的 URL
location.replace(url: string)也是设置当前文档的 URL,但是会在 history 对象的地址列表中移除这个 URL,即不能回退
location.reload()重载当前页面
history 对象作用
history.go(n: number)前进 n 个页数,n 可以是负数,也可以是正数
history.back()后退一页
history.forward()前进一页
Navigator 对象作用
navigator.userAgent返回用户代理头的字符串表示
navigator.cookieEnabled返回浏览器是否支持(启用) cookie

iframe

iframe 元素会创建包含另一个文档的内联框架

缺点:

  1. 会阻塞主页面的 onload 事件
  2. 搜索引擎无法解读这种页面,不利于 SEO
  3. iframe 和主页面共享连接池,而浏览器对相同区域有限制所以会影响性能

Doctype

Doctype 声明于文档最前面,告诉浏览器以哪种规范来渲染页面,例如 html 或者 xhtml 规范

DOCTYPE(document type) 必须放在 html 文件最前面,它不是 HTML 标签,也没有结束标签

html
PlainText
<!DOCTYPE html>

Cookie、sessionStorage、localStorage 联系和区别

Cookie:由于 HTTP 是一个无状态协议,Cookie 出现的最大作用就是存储 sessionId 用来标识唯一用户

相同点:

不同点:

XSS(跨站脚本攻击),是指攻击者在返回的 HTML 中嵌入 JavaScript 脚本

在 HTTP 头部上配置 set-cookie 响应头,其中两个属性可以防止 XSS 攻击:

浏览器事件

  1. click 点击事件在 ios 有 300ms 延迟,原因及如何解决

苹果的 safari 浏览器,为了把 PC 端大屏幕的页面更好的显示在小屏幕手机端,采用了双击缩放(doubel tap to zoom)方案,为了检测用户是单击操作还是双击操作而设置了 300ms 延迟

解决方案

既然缩放是导致延迟的原因,那么我们可以禁止缩放

html
PlainText
<meta name="viewport" content="width=device-width,user-scale=no"

FastClick 的原理是:检测到 touchend 时间后,like发出模拟 click 事件,并且把 浏览器 300ms 之后真正触发的事件阻断掉

Bash
npm i fastclick
Javascript
document.addEventListener('DOMContentLoaded', () => {
  FastClick.attach(document.body)
}, false)

http 状态码

HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599):

分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

HTTP状态码列表:

状态码状态码英文名称中文描述
100Continue继续。客户端应继续其请求
101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200OK请求成功。一般用于GET与POST请求
201Created已创建。成功请求并创建了新的资源
202Accepted已接受。已经接受请求,但未处理完成
203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206Partial Content部分内容。服务器成功处理了部分GET请求
300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303See Other查看其它地址。与301类似。使用GET和POST请求查看
304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305Use Proxy使用代理。所请求的资源必须通过代理访问
306Unused已经被废弃的HTTP状态码
307Temporary Redirect临时重定向。与302类似。使用GET请求重定向
400Bad Request客户端请求的语法错误,服务器无法理解
401Unauthorized请求要求用户的身份认证
402Payment Required保留,将来使用
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405Method Not Allowed客户端请求中的方法被禁止
406Not Acceptable服务器无法根据客户端请求的内容特性完成请求
407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408Request Time-out服务器等待客户端发送的请求时间过长,超时
409Conflict服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410Gone客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息
412Precondition Failed客户端请求信息的先决条件错误
413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理
415Unsupported Media Type服务器无法处理请求附带的媒体格式
416Requested range not satisfiable客户端请求的范围无效
417Expectation Failed服务器无法满足Expect的请求头信息
500Internal Server Error服务器内部错误,无法完成请求
501Not Implemented服务器不支持请求的功能,无法完成请求
502Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理

http 响应头

应答头说明
Allow服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
Content-Length表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
Content-Type表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
Date当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
Expires应该在什么时候认为文档已经过期,从而不再缓存它?
Last-Modified文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
Location表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
Refresh表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。 注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。 注意Refresh的意义是"N秒之后刷新本页面或访问指定页面",而不是"每隔N秒刷新本页面或访问指定页面"。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。 注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。
Server服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
Set-Cookie设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。
WWW-Authenticate客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess)。

get 和 post 请求的区别

  1. get 请求一般是获取数据;post 则是提交数据
    1. get 请求的请求参数放在 url 中,隐私性、安全性差,而且请求的长度有限制;post 请求是没有长度,数据放在 body(消息主题 entity-body 里) 中
  2. get 请求可以被缓存;post 请求不可以缓存
  3. get 请求会被保存在浏览器历史记录当中,post 不会
  4. get 请求可以被收藏为标签,因为其请求参数就在 url 中;post 不能,因为它的参数不在 url 中
  5. get 的请求是 url 编码(application-x-www-form-urlencoded);post 请求支持多种编码方式(例如 multipart/form-data 等)
  6. get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求

浏览器缓存

浏览器缓存分为强缓存协商缓存,根据响应头内容(Cache-Control)来决定.

Cache-Control 取值

属性值作用
public客户端和服务器都可以缓存资源
privite只有客户端可以缓存资源
no-cache客户端缓存资源,但是是否缓存需要经过协商缓存来验证
no-store不使用缓存
max-age缓存有效期

协商缓存

协商缓存的触发条件:

协商缓存的标识

Last-Modified:文件在服务器最后被修改的事件,从服务器的 Response Headers 上获取

更多请了解:一文彻底弄懂浏览器缓存,只需动手操作一次 - 掘金 (juejin.cn)

稍微总结一下:

  1. 跟强缓存有关的字段有 expirescache-control。如果 cache-controlexpires 同时存在,cache-control 的优先级比 expires
  2. 跟协商缓存的字段有 Last-Modified/If-Modified-SinceEtag/If-None-Match

从用户输入 url 到页面展示发生了什么

长话短说:

注:无缓存版本

  1. DNS 解析
  2. TCP 连接
  3. 发送 HTTP 请求
  4. 服务器处理请求并返回 HTTP 报文和加载资源
  5. 浏览器解析渲染页面

更详细:

  1. 首先,在浏览器地址栏输入 url,回车
  2. 根据 url,浏览器先查看浏览器缓存 -> 系统缓存 -> 路由缓存,如果缓存中有,会从缓存中读取并显示,若没有,则跳到第三步
  3. 在发送 http 请求前,先进行DNS域名解析,获取访问的IP地址
  4. 浏览器向服务器发起 tcp 连接,与浏览器建立 tcp 三次握手
  5. 握手成功后,浏览器和服务器已经建立了通信,浏览器向服务器发送 http 请求,请求数据包。
  6. 服务器接收到请求,处理请求并返回 url 指定数据给浏览器
  7. 浏览器接收到服务器 HTTP 响应内容
  8. 浏览器进行渲染,解析HTML生成DOM树,解析 CSS 生成规则树,js 引擎解析 js,将解析后 DOM 树和 CSS 规则树关联起来构建 Renden 渲染树树,然后计算布局,绘制页面
  9. 渲染完毕,四次挥手,关闭 tcp 连接

图片解释: