http 面试题小记

104 阅读13分钟

常见http码及出现场景

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

http 0.9, 1, 1.1, 2更新了什么

  • http0.9 - 服务器只能回应HTML格式的字符串,不能回应别的格式。

  • http1.0 - 引入了POST请求和HEAD请求。 - 新增头信息(HTTP header)。 新增状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)

    缺点:http 1.0的时候,每个TCP连接只能发送一个请求。

    发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。 TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段。 【Connection: keep-alive】 这个字段要求服务器不要关闭TCP连接,以便其他请求复用。服务器同样回应这个字段。 【Connection: keep-alive】 一个可以复用的TCP连接就建立了,直到客户端或服务器主动关闭连接。但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。

  • http1.1

    • http1.1是文本字符串传输,文本协议
    • 引入了持久链接,即TCP默认不关闭,可以被多个请求复用
      http1.1中客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送【Connection: close】,明确要求服务器关闭TCP连接。
    • 引入了管道机制,一个TCP链接可以同时发送多个请求
    • 关于缓存的补充
    • put delete option patch
    • 支持断点续传,通过请求头的Range字段实现(客户端发请求时对应的是 Range ,服务器端响应时对应的是 Content-Range。)

    缺点:

    虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。 为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等

  • http 2.0

    • 二进制协议(二进制传送的单位是帧和流),
    • 多路复用(因为有流ID,所以通过同一个http请求实现多个http请求传输变成了可能,可以通过流ID来标示究竟是哪个流从而定位到是哪个http请求)
    • 压缩了headers(因为headers在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。)
    • HTTP2支持在客户端未经请求许可的情况下,主动向客户端推送内容

301与302的区别

官方的比较简洁的说明:
301 redirect: 301 代表永久性转移(Permanently Moved)
302 redirect: 302 代表暂时性转移(Temporarily Moved )
  • 共同点,301和302状态码都表示重定向,就是浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址。这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)
  • 不同点
    1. 301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了);302表示旧地址A的资源还在(仍然可以访问)
    2. 301时,搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

http缓存

HTTP/1.0

  1. 【Expires】它表示缓存的存在时间,告诉客户端浏览器在这个时间之前不对服务器发送请求,而直接使用浏览器的缓存。
  2. 在HTTP/1.0中,可以使用Pragma: no-cache头来告诉浏览器不要缓存内容,它相当于HTTP/1.1中的Cache-Control:no-cache。
  3. 缺点:
    HTTP/1.0协议的这种实现方式的缺点是,服务器和客户端的时间有可能是不同步的,这样会造成缓存的实现达不到预期效果。

HTTP/1.1协议用Cache-Control头解决了这个问题。Cache-Control响应头的语法为:

  • 【public】 指示响应数据可以被任何客户端缓存
  • 【private】 指示响应数据可以被非共享缓存所缓存。这表明响应的数据可以被发送请求的浏览器缓存,而不能被中介所缓存
  • 【no-cache】 指示响应数据不能被任何接受响应的客户端所缓存
  • 【no-store】 指示所传送的响应数据除了不能被缓存,也不能存入磁盘。一般用于敏感数据,以免数据被复制。
  • 【must-revalidate】 指示所有的缓存都必须重新验证,在这个过程中,浏览器会发送一个If-Modified-Since头。如果服务器程序验证得出当前的响应数据为最新的数 据,那么服务器应当返回一个304 Not Modified响应给客户端,否则响应数据将再次被发送到客户端。
  • 【proxy-revalidate】 与must-revalidate相似,不同的是用来指示共享缓存。
  • 【max-age】 数据经过max-age设置的秒数后就会失效,相当于HTTP/1.0中的Expires头。如果在一次响应中同时设置了max-age和Expires,那么max-age将具有较高的优先级。
  • 【s-maxage】 与max-age相似,不同的是用来指示共享缓存。

http1 的都是强缓存:Cache-Control和Expires相比, Cache-Control优先级更高,直接读取本地

http2 :协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,主要有以下两种情况:

● Last-Modified和If-Modified-Since

浏览器在第一次访问资源时,服务器返回资源的同时,在response header中添加 Last-Modified的header,值是这个资源在服务器上的最后修改时间, 浏览器接收后缓存文件和header;浏览器下一次请求这个资源,浏览器检测到有 Last-Modified这个请求头, 于是添加If-Modified-Since这个请求头,值就是Last-Modified中的值;服务器再次收到这个资源请求, 会根据 If-Modified-Since 中的值与服务器中这个资源的最后修改时间对比, 如果没有变化,返回304和空的响应体,直接从缓存读取,如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间, 说明文件有更新,于是返回新的资源文件和200。

● ETag和If-None-Match

tag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),只要资源有变化,Etag就会重新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器只需要比较客户端传来的If-None-Match跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。如果服务器发现ETag匹配不上,那么直接以返回新的资源(当然也包括了新的ETag)发给客户端;如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。

为什么Last-Modified已经让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag呢?
HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

  1. Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间
  2. 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
  3. 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
  4. Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。