HTTP 面试题汇总

HTTP 与 HTTPS 的区别

http:超文本传输协议,设计目的是为了提供一种发布和接收 HTML 页面的方法。
https:是以 数据保密性、完整性和身份校验安全性为目标的 HTTP 安全版。

  • 传输信息安全性不同
    http 是超文本传输协议,明文传输
    https 是 SSL 加密传输协议,密文传输
  • 端口不同
    http 默认80 端口,https 默认 443 端口
  • 连接方式不同
    http 是无状态连接;
    https 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,安全性更高
  • 证书申请方式不同
    http 协议:免费申请
    https 协议需 CA 证书,一般免费证书较少,需要付费

HTTPS 相对于 HTTP 的改进

  1. 双向的身份认证
    客户端 和服务端在传输数据之前,会通过基于X.509 证书对双方进行身份认证,过程如下:
     a) 客户端发起 SSL 握手消息给服务端要求连接。
     b) 服务端将证书发送给客户端。
     c) 客户端检查服务端证书,确认是否由自己信任的证书签发机构签发(客户端内置了所有受信任 CA 的证书)。 如果不是,将是否继续通讯的决定权交给用户选择。如果检查无误或者用户选择继续,则客户端认可服务端的身份。
     d) 服务端要求客户端发送证书,并检查是否通过验证。失败则关闭连接,认证成功则从客户端证书中获得客户端的公钥,一般为 1024 位或者 2048 位。到此,服务器客户端双方的身份认证结束,双方确保身份都是真实可靠的。

  2. 数据传输的机密性
    客户端和服务端在开始传输数据之前,会协商传输过程需要使用的加密算法。 客户端发送协商请求给服务端, 其中包含自己支持的非对成加密的密钥交换算法 ( 一般是RSA),数据签名摘要算法 ( 一般是SHA或MD5) ,加密传输数据的对称加密算法 ( 一般是DES ),以及加密密钥的长度。 服务端接收到消息之后,选中安全性最高的算法,并将选中的算法发送给客户端,完成协商。客户端生成随机的字符串,通过协商好的非对称加密算法,使用服务端的公钥对该字符串进行加密,发送给服务端。 服务端接收到之后,使用自己的私钥解密得到该字符串。在随后的数据传输当中,使用这个字符串作为密钥进行对称加密。

  3. 防止重放攻击
    SSL 使用序列号来保护通讯方免受报文重放攻击。这个序列号被加密后作为数据包的负载。在整个 SSL 握手中,都有一个唯一的随机数来标记 SSL 握手。 这样防止了攻击者嗅探整个登录过程,获取到加密的登录数据之后,不对数据进行解密,而直接重传登录数据包的攻击手法。

HTTPS 的优点

  • 可认证用户和服务器,确保数据发送到正确的客户机和服务器;
  • 是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全;
  • 是现行架构下最安全的解决方案( 虽然不是绝对安全 )。

HTTPS 的缺点

  • 握手阶段比较费时,使页面加载时间延长;
  • HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
  • SSL 证书需要钱,功能越强大费用越高。
  • SSL 证书通常需要绑定 IP,不能在同一 IP上绑定多个域名。

浏览器输入一个地址,到页面展示中间经历了哪些东西

  1. 对 URL进行DNS域名解析,得到对应的IP地址
    DNS域名解析采用的是递归查询的顺序为:
    先找DNS缓存=>根域名服务器=>继续找找下一级=>找到之后给浏览器
    缓存的查找顺序大概是:
    浏览器DNS缓存=>系统DNS缓存=>hosts文件查找=>递归去服务器查找

  2. 根据IP地址找到对应的服务器并发起TCP三次握手
    TCP是一个端到端的可靠的面向连接的协议,HTTP基于传输层TCP协议不用担心数据传输的各种问题(如有错会重传)
    建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包
    (1). 客户端发送一个 TCPSYN 标志位置 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连接成功)状态,完成三次握手。

  3. 建立TCP 连接后发送HTTP请求
    HTTP请求包含请求头,或请求体两部分
    请求头:中包含希望对请求文件的操作的信息
    请求体:中包含传递给后台的参数

  4. 服务器响应HTTP请求,返回相应数据包
    服务器收到处理的请求开始做负载平衡,跨域等,文件处理完毕,生成响应数据包并返回
    响应包含:响应头和相应体,响应体就是请求的文件

  5. 经过网络传输,文件被下载到本地客户端,浏览器收到 HTTP 响应,客户端开始加载

  6. 浏览器得到 HTML 代码后开始解析,并请求 HTML 代码中的资源
    如CSS、JS 和 图片,如果响应可以缓存,则存入缓存

  7. 浏览器对页面进行渲染并呈现给用户
    (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)最终所有节点和资源都会渲染完成,页面全部渲染结束。

  8. 服务器关闭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 请求的区别

  1. 从安全性讲,两者都不安全
    GET 请求参数在 URL 地址上,直接暴露
    POST 请求的参数放 BODY 部分,按 F12 也直接暴露了
  2. GET 请求因为是向 URL 添加数据,不同的浏览器厂商,代理服务器,web服务器都可能会有自己的长度限制,而 POST 请求无长度限制;
  3. GET请求一般不具有请求体,因此只能进行 URL 编码,而POST请求支持多种编码方式。
  4. GET请求可以收藏为书签,POST请求不可以收藏为书签;
  5. GET请求可以被缓存,POST请求不可以被缓存
  6. GET产生一个TCP数据包;POST产生两个TCP数据包。
  7. GET请求:浏览器会把 http header 和 data 一并发送出去,服务器响应 200;
  8. POST请求:浏览器先发送 header,服务器响应100 continue,浏览器再发送 data,服务器响应 200。

HTTPS 工作原理

  1. 首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
  2. 客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
  3. 消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
  4. 发送给服务端,此时只有服务端(RSA私钥)能解密。
  5. 解密得到的随机数,再用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缓冲技术,可以提高服务器端响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。

你可能感兴趣的:(HTTP 面试题汇总)