HTTP与HTTPS面试题

  1. HTTP
    概念:HTTP是从服务器端向客户端传输超文本的传输协议,它使浏览器更加高效。HTTP是一个无状态协议,同一个客户端发送的这一次的请求和上一次的请求毫无关联,HTTP服务器不会保存客户的任何信息。
    请求报文的格式:请求行,首部行,空行,实体体
    响应报文的格式:状态行,首部行,空行,实体体
    常见的请求头:
     Accept:浏览器可接受的响应内容类型。
     Accept - Charset:浏览器可接受的字符集。
     Accept - Encoding:浏览器可接受的响应内容的编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
     Accept - Language:浏览器可接受的相应内容的语言列表。
     Authorization:用于表示HTTP协议中需要认证资源的认证信息。
     Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep - Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content - Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
     Content - Length:表示请求体的长度。
     Cookie:由SetCookie设置的一个HTTP协议。
     From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
     Host:初始URL中的主机和端口。
     If - Modified - Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
     Pragma:指定“no - cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
     Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
     User - Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
     UA - Pixels,UA - Color,UA - OS,UA - CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。
    请求方法:
     Get:用来请求访问被URI(统一资源标识符)标识的资源,被服务器解析后返回相应内容
     Post:向服务器传输信息, 向指定资源提交数据并进行处理
     Put:传输文件,并将其保存到URI指定的位置,要求在请求报文中包含文件内容
     Head:获取报文首部,用于验证URI的有效性,获取资源的更新信息
     Delete:按照指定的URI删除文件
     Options:查询针对URI指定的资源所支持的方法
    Get方法和post方法的区别:
     Get请求会被浏览器主动缓存,post不会
     Get请求对URL参数长度有限制,post没有
     Get请求的参数会暴露在URL中,不安全。Post不会
     Get请求将数据放在URL中,post放在消息体中
     Get请求的参数必须是ASCII字符,post没有限制
     Get请求的只能进行URL编码,post有多种编码格式
     Get请求每次只会发送一个TCP包,浏览器会同时发送HTTP请求头和数据。Post每次发送两个TCP包,浏览器先发送请求头,当返回状态码为100时,浏览器才会发送数据
    HTTP的工作过程:
     地址解析:通过DNS解析域名,得到ip地址
     封装HTTP请求数据包:将解析出来的信息整合,封装数据包
     封装为TCP包,并建立TCP连接
     客户端发送请求
     服务器响应
     服务器关闭TCP连接
    状态码:
     1xx:提示信息----请求已接收,继续操作
     2xx:成功----请求已成功被接收
     3xx:重定向----要求完成请求必须更进一步操作
     4xx:客户端错误----请求存在语法错误/请求无法实现
     5xx:服务器错误----服务器未能实现合法的请求
    常见的状态码:
     200:请求成功,信息在返回的响应报文中
     400:客户端存在语法错误,不能被服务器理解
     401:请求未经授权,要求用户身份验证
     403:服务器理解该请求,但拒绝执行
     404:请求的资源不存在,URL错误
     500:服务器内部错误,无法完成请求
     503:由于超载或系统维护,服务器暂时无法完成请求
  2. HTTPS
    概念:HTTPS是通过计算机网络进行安全通信的传输协议,其经由HTTP进行通信,利用SSL/TLS建立安全通道,加密数据包。HTTPS的使用目的是提供对网站服务器的身份验证,同时保护交换数据的隐私和完整性
    工作原理:
     客户端使用HTTPS的URL访问服务器,请求与服务器建立SSL安全连接
     服务器收到请求后,返回网站的证书信息(包括公钥)
     客户端、服务器端共同协商SSL/TLS连接的安全等级(加密等级)
     客户端根据加密等级建立会话秘钥,并利用网站公钥加密,再传送给网站
     服务器利用自己的私钥解密会话秘钥
     服务器再通过会话秘钥加密与客户端之间的通信
    HTTP与HTTPS的区别:
     HTTP是明文传输,HTTPS是加密传输,HTTPS更加安全
     HTTPS基于传输层,HTTP基于应用层
     HTTPS需要ca证书,费用比较高
     HTTP的标准端口号是80,HTTPS的为443
    HTTPS协议的优点:
     使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器
     HTTPS比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性
     HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
    HTTPS协议的缺点:
     HTTPS握手阶段比较费时,会使页面加载时间延长50%,增加10%~20%的耗电。
     HTTPS缓存不如http高效,会增加数据开销。
     SSL证书需要钱,功能越强大的证书费用越高。
     SSL证书需要绑定IP,不能再同一个ip上绑定多个域名,ipv4资源支持不了这种消耗。
  3. HTTP/2
    概念:HTTP/2是基于SPDY协议的,相对于HTTP 1.X更加高效,简单,减少网络延迟,实现低延迟高吞吐。HTTP/2并没有更改HTTP的语法,而是改变了客户端与服务端传输数据的方式,通过新的二进制帧层控制整个过程。
    SPDY协议:
    SPDY意为“speedy”更快,是Google开发的基于TCP的应用层协议,其目的在于通过压缩、优先级、多路复用方式提高网页加载时间和网页的安全性,该协议的核心思想在于减少TCP连接数,是对HTTP协议的增强
    特性:
     二进制分帧层:HTTP/2 性能提升的核心就在于二进制分帧层,HTTP/2 将所有信息分割为更小的消息和帧,并使用二进制编码。这样一来,客户端和服务器采用统一规则,数据的传输效率也就高了,性能也会变好
     首部压缩:使用HPACK算法压缩首部及响应数据
     允许多路复用:基于二进制分帧层,HTTP/2实现了同时发送多向请求和响应,HTTP消息被分解为互不依赖的帧,乱序发送出去,并在另一端根据流ID和首部将他们重新组合在一起,解决HTTP1.0的队首阻塞问题,减少了tcp连接数,提高了浏览器性能
     请求优先级:客户端明确优先级,服务器根据优先级依次交互数据(不能过分迷信请求优先级,首先要考虑服务器是否支持请求优先级,其次要考虑高优先级的慢响应请求会阻塞其他资源的交互)
     服务端推送:服务器端可以向一个客户端请求发送多个响应,而不用每一个需要客户端明确要求
    输入URL到页面加载显示:
     输入URL
     缓存解析:首先查看缓存中是否有记录,缓存的查找记录为:浏览器缓存 ->系统缓存 -> 路由器缓存,缓存中没有则查找系统的hosts文件中是否有记录
     DNS解析:如果没有则通过DNS解析域名,得到ip地址
     封装HTTP请求数据包:浏览器根据这个ip以及相应的端口号,构造一个http请求,这个请求报文会包括这次请求的信息(请求方法,请求说明和请求附带的数据)
     封装TCP包:将这个http请求封装在一个tcp包中
     建立TCP连接
     客户端发送请求
     服务器返回响应
     页面渲染:浏览器根据服务器返回的响应来构建DOM树,根据外部样式,内部样式,内联样式构建一个CSS对象模型树,构建完成后和DOM树合并为渲染树(这里主要做的是排除非视觉节点,比如script,meta标签和排除display为none的节点),之后进行布局,布局主要是确定各个元素的位置和尺寸,绘制页面像素信息
     浏览器将各层的信息发送给GUI,GUI会将各层合成(composite),显示在屏幕上。
     断开TCP连接
  4. HTTP的缓存控制
    强缓存:
    基本原理是:所请求的数据在缓存数据库中尚未过期时,不与服务器进行交互,直接使用缓存数据库中的数据。当缓存未命中时,则重新向服务器请求数据
    两个规则字段:
     Expire:其指定了一个日期/时间, 在这个日期/时间之后,HTTP响应被认为是过时的。但是它本身是一个HTTP1.0标准下的字段,所以如果请求中还有一个置了 “max-age” 或者 “s-max-age” 指令的Cache-Control响应头,那么 Expires 头就会被忽略。
     Cache-Control通用消息头用于在http 请求和响应中通过指定指令来实现缓存机制。其常用的几个取值有:
     private:客户端可以缓存
     public:客户端和代理服务器都可以缓存
     max-age=xxx:缓存的内容将在xxx 秒后失效
     s-max-age=xxx:同s-max-age,但仅适用于共享缓存(比如各个代理),并且私有缓存中忽略。
     no-cache:需要使用协商缓存来验证缓存数据
     no-store:所有内容都不会缓存,强缓存和协商缓存都不会触发
     must-revalidate:缓存必须在使用之前验证旧资源的状态,并且不可使用过期资源。
    协商缓存:
    当强缓存过期未命中或者响应报文Cache-Control中有must-revalidate标识必须每次请求验证资源的状态时,便使用协商缓存的方式去处理缓存文件。
    基本原理:从缓存数据库中取出缓存的标识,然后向浏览器发送请求验证请求的数据是否已经更新,如果已更新则返回新的数据,若未更新则使用缓存数据库中的缓存数据
    两个规则字段:
     etag是所请求的数据在服务器中的唯一标识
     last-modifind标识所请求资源最后一次修改的时间。
    再次请求后:
    在我们的请求中有这样两个字段if-modifind-since和if-none-match,两个字段分别对应着响应中的last-Modified和etag,用来对协商缓存进行判断:
     首先,如果在第一次请求中有etag和last-modified时,缓存数据库会保存这两个字段,并且在再次发起同样的请求时以if-none-match和if-modified-since发送保存的last-modified和etag数据。
     服务器收到请求后会以优先级if-none-match > if-modifind-since的顺序进行判断,如果资源的etag和if-none-match相等,即所请求的资源没有变化,此时浏览器即可以使用缓存数据库中的数据,此时http的请求状态码为304,请求的资源未变化。
     如果请求字段中没有if-none-match,就使用if-modified-since来判断。如果if-modified-since的值和所请求的资源时间一致,即所请求的资源相同,浏览器即可以使用缓存数据库中的数据。http状态码304。
    HTTP与HTTPS面试题