# HTTP 与 HTTPS 的区别
http:超文本传输协议,设计目的是为了提供一种发布和接收 HTML 页面的方法。
https:是以 数据保密性、完整性和身份校验安全性为目标的 HTTP 安全版。
- 传输信息安全性不同
http 是超文本传输协议,明文传输
https 是 SSL 加密传输协议,密文传输 - 端口不同
http 默认80 端口,https 默认 443 端口 - 连接方式不同
http 是无状态连接;
https 协议是由SSL+HTTP
协议构建的可进行加密传输、身份认证的网络协议,安全性更高 - 证书申请方式不同
http 协议:免费申请
https 协议需 CA 证书,一般免费证书较少,需要付费
# HTTPS 相对于 HTTP 的改进
- 双向的身份认证
客户端 和服务端在传输数据之前,会通过基于X.509
证书对双方进行身份认证,过程如下:
a) 客户端发起 SSL 握手消息给服务端要求连接。
b) 服务端将证书发送给客户端。
c) 客户端检查服务端证书,确认是否由自己信任的证书签发机构签发(客户端内置了所有受信任 CA 的证书)。 如果不是,将是否继续通讯的决定权交给用户选择。如果检查无误或者用户选择继续,则客户端认可服务端的身份。
d) 服务端要求客户端发送证书,并检查是否通过验证。失败则关闭连接,认证成功则从客户端证书中获得客户端的公钥,一般为 1024 位或者 2048 位。到此,服务器客户端双方的身份认证结束,双方确保身份都是真实可靠的。 - 数据传输的机密性
客户端和服务端在开始传输数据之前,会协商传输过程需要使用的加密算法。 客户端发送协商请求给服务端, 其中包含自己支持的非对成加密的密钥交换算法 ( 一般是RSA),数据签名摘要算法 ( 一般是SHA或MD5) ,加密传输数据的对称加密算法 ( 一般是DES ),以及加密密钥的长度。 服务端接收到消息之后,选中安全性最高的算法,并将选中的算法发送给客户端,完成协商。客户端生成随机的字符串,通过协商好的非对称加密算法,使用服务端的公钥对该字符串进行加密,发送给服务端。 服务端接收到之后,使用自己的私钥解密得到该字符串。在随后的数据传输当中,使用这个字符串作为密钥进行对称加密。 - 防止重放攻击
SSL 使用序列号来保护通讯方免受报文重放攻击。这个序列号被加密后作为数据包的负载。在整个 SSL 握手中,都有一个唯一的随机数来标记 SSL 握手。 这样防止了攻击者嗅探整个登录过程,获取到加密的登录数据之后,不对数据进行解密,而直接重传登录数据包的攻击手法。
HTTPS 的优点
- 可认证用户和服务器,确保数据发送到正确的客户机和服务器;
- 是由
SSL+HTTP
协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全; - 是现行架构下最安全的解决方案( 虽然不是绝对安全 )。
HTTPS 的缺点
- 握手阶段比较费时,使页面加载时间延长;
- HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
- SSL 证书需要钱,功能越强大费用越高。
- SSL 证书通常需要绑定 IP,不能在同一 IP上绑定多个域名。
# 浏览器输入一个地址,到页面展示中间经历了哪些东西
-
对 URL进行DNS域名解析,得到对应的IP地址
DNS域名解析采用的是递归查询的顺序为:
先找DNS缓存=>根域名服务器=>继续找找下一级=>找到之后给浏览器
缓存的查找顺序大概是:
浏览器DNS缓存=>系统DNS缓存=>hosts文件查找=>递归去服务器查找 -
根据IP地址找到对应的服务器并发起TCP三次握手
TCP是一个端到端的可靠的面向连接的协议,HTTP基于传输层TCP协议不用担心数据传输的各种问题(如有错会重传)
建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包
(1). 客户端发送一个TCP
的SYN
标志位置 1 的包到服务器,并进入SYN_SENT
状态,等待服务器确认。
(2). 服务器收到SYN
包,必须确认客户的SYN(ack=x+1)
,同时自己也发送一个SYN
包(syn=y),即SYN+ACK
包,此时服务器进入SYN_RECV
状态
(3). 客户端收到服务器的SYN+ACK
包,向服务器发送确认包ACK(ack=y+1)
,此包发送完毕,客户端和服务器进入ESTABLISHED
(TCP连接成功)状态,完成三次握手。 -
建立TCP 连接后发送HTTP请求
HTTP请求包含请求头,或请求体两部分
请求头
:中包含希望对请求文件的操作的信息
请求体
:中包含传递给后台的参数 -
服务器响应HTTP请求,返回相应数据包
服务器收到处理的请求开始做负载平衡,跨域等,文件处理完毕,生成响应数据包并返回
响应包含:响应头和相应体,响应体就是请求的文件 -
经过网络传输,文件被下载到本地客户端,浏览器收到 HTTP 响应,客户端开始加载
-
浏览器得到 HTML 代码后开始解析,并请求 HTML 代码中的资源
如CSS、JS 和 图片,如果响应可以缓存,则存入缓存 -
浏览器对页面进行渲染并呈现给用户
(1)解析 html 文件是自上而下,先是头部后是 body
(2)当解析到头部 CSS 外部链接时,同步去下载,如果遇到外部 JS 链接也是下载
(3)接着解析 body 部分,将 html 文件解析成 DOM 树
(4)同时等待 css 文件下载并把CSS文件解析成 CSSOM 树
(5)DOM 树 和 CSSOM 树 就组成了 Render Tree 渲染树
(6)CSS 文件加载不会阻塞 html 文件的解析,但会阻塞 DOM 的渲染,也会阻塞后面 JS 语句的执行
(7)在下载 JS 时会阻塞 html 的解析和渲染,又分几种情况:
a)没有 defer 和 async 标签的 script 会立即加载并执行
b)有 async 标签的 js,js 的加载执行和 html 的解析和渲染并行
c)有 defer 标签的 js,js 的加载和 html 的解析和渲染并行
(8)渲染树一旦有结构模型了,接着就会同步去计算渲染树节点的布局位置
(9)计算出来渲染的坐标后,又同步去开始渲染
(10)进行过程中如果遇到图片则跳过去渲染下面内容,等待图片下载成功后会返回来在渲染原来图片的位置
(11)如果渲染过程中出现 JS 代码调整 DOM 树机构的情况,也会再次重新来过,从修改 DOM 那步开始
(12)最终所有节点和资源都会渲染完成,页面全部渲染结束。 -
服务器关闭TCP链接,TCP 四次挥手
为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server
端收到Client
端的SYN
连接请求报文后,可以直接发送SYN+ACK
报文。其中ACK
报文是用来应答的,SYN
报文是用来同步的。但是关闭连接时,当Server
端收到FIN
报文时,很可能并不会立即关闭SOCKET
,所以只能先回复一个ACK
报文,告诉Client
端,"你发的FIN
报文我收到了"。只有等到Server
端所有的报文都发送完了,才能发送FIN
报文,因此不能一起发送。故需要四步握手。
# 一个 TCP 连接能发几个 http 请求?
HTTP 1.0 一般情况下,不支持长连接,因此在每次请求发送完毕之后,TCP 连接即会断开,因此一个 TCP 发送一个 HTTP 请求。
但是通过在请求头带上 Connection: Keep-Alive
将一条 TCP 连接保持在活跃状态。
如果客户端和服务端都支持,那么其实也可以发送多条,不过此方式也有限制。
HTTP 1.1 支持了长连接, HTTP 2.0 版本协议,支持了多用复用。
因此只要不断开 TCP 的连接,HTTP 请求数也是可以没有上限地持续发送;
# 常用的 HTTP 方法有哪些?
GET:
用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
POST:
用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT:
传输文件,报文主体中包含文件内容,保存到对应 URI 位置。
HEAD:
获得报文首部,与 GET 方法类似,只是不返回报文主体,一般用于验证 URI 是否有效。
DELETE:
删除文件,与 PUT 方法相反,删除对应 URI 位置的文件。
OPTIONS
:查询相应URI支持的HTTP方法。
# GET 请求和 POST 请求的区别
- 从安全性讲,两者都不安全
GET 请求参数在 URL 地址上,直接暴露
POST 请求的参数放 BODY 部分,按 F12 也直接暴露了 - GET 请求因为是向 URL 添加数据,不同的浏览器厂商,代理服务器,web服务器都可能会有自己的长度限制,而 POST 请求无长度限制;
- GET请求一般不具有请求体,因此只能进行 URL 编码,而POST请求支持多种编码方式。
- GET请求可以收藏为书签,POST请求不可以收藏为书签;
- GET请求可以被缓存,POST请求不可以被缓存
- GET产生一个TCP数据包;POST产生两个TCP数据包。
GET请求:浏览器会把 http header 和 data 一并发送出去,服务器响应 200;
POST请求:浏览器先发送 header,服务器响应100 continue,浏览器再发送 data,服务器响应 200。
# HTTPS 工作原理
- 首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
- 客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
- 消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
- 发送给服务端,此时只有服务端(RSA私钥)能解密。
- 解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。
# 常见的HTTP相应状态码
200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向
303:与302功能相似,只是它希望客户端在请求一个URI时,能通过GET方法重定向到另一个URL上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙
# HTTP优化方案
TCP复用:
TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端TCP连接上,而HTTP复用则是一个客户端的多个HTTP请求通过一个TCP连接进行处理。前者是负载均衡设备的独特功能;而后者是HTTP 1.1协议所支持的新功能,目前被大多数浏览器所支持。
内容缓存:
将经常用到的内容进行缓存起来,那么客户端就可以直接在内存中获取相应的数据了。
压缩:
将文本数据进行压缩,减少带宽
SSL加速(SSL Acceleration):
使用SSL协议对HTTP协议进行加密,在通道内加密并加速
TCP缓冲:
通过采用TCP缓冲技术,可以提高服务器端响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。
网友评论