前端面试题之——http(一)

282 阅读10分钟

大家好,这是一个更文挑战。(写错的各位看官包容) 这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

1. HTTP的定义: http是超文本传输协议,也就是HyperText Transfer Protocol

2. http的默认端口号是80

3. http是无状态协议

4. http是基于TCP/IP通信协议来传递数据

  • tcp/ip协议被分为4层

    • 应用层: 常用应用层的协议有

        1. dns
        2. ftp
        3. http
      
    • 传输层: 常用传输层的协议有

        1. tcp
        2. udp
      
    • 网络层: 常用网络层协议

        1. ip(internet protocol:网际协议)
        2. ip相关的概念
      
        	2.1 IP 地址指明了节点被分配到的地址
        	2.2 MAC 地址是指网卡所属的固定地址
        	2.3 IP 地址可以和 MAC 地址进行配对
        	2.4 IP 地址可变换,但 MAC地址基本上不会更改
        	2.5 ARP地解析协议:使用arp协议凭借mac地址进行通信,根据通信方的 IP 地址就可以反查出对应的 MAC 地址
      
    • 数据链路层

5. http请求的简化过程,大概可以分为以下7步:

  1. 建立tcp请求
  2. web浏览器给web service发送请求命令
  3. web浏览器发送请求头信息
  4. web服务器应答
  5. web服务器发送应答头信息
  6. web 服务器像浏览器发送数据
  7. web服务器关闭一个tcp链接

6. http请求和响应格式

  • 请求格式: screely-1628998220456.png

  • 响应格式

screely-1628998191151.png

7. http状态码

  • 101:主要用于websocket,也可以用于http2的升级

  • 200:成功

  • 301:永久重定向

  • 302:临时跳转,但是存在二义性,会有302劫持,302针对原请求是post的不可以自动重定向,但是服务器和浏览器的实现是运行重定向。

    • 为消除二义性出现了下面2个状态码

      • 303:无论原请求是get还是post,都可以自动进行重定向

      • 307:只有原请求是get或者head方法才进行重定向

  • 304:浏览器的缓存相关的状态码,下面就顺便说下浏览器的缓存

    • 浏览器的缓存大致分为2种,强制缓存和协商缓存

      • 强制缓存(浏览器优先读取):常用的相关的请求头有2个:expires一个特定的时间,比较旧, cache-control具体的时间,比较新,优先级高

      • 协商缓存

        1. 前端带上 etag或者last-modofied

          • etag:是为了应对资源修改时间可能很频繁的情况出现的,是基于资源的内容计算出来的值,因此优先级也较高。
          • last-modified:设置标准是资源的上次修改时间
        2. 后端带上if-not-matched或者if-modified-since,

          • 若没有更新就返回304,否则返回200
      • 协商缓存和强制缓存的区别:协商缓存与强制缓存的区别在于强制缓存不需要访问服务器,返回结果是200,协商缓存需要访问服务器,如果命中缓存的话,返回结果是304。

  • 400:错误请求,服务器不理解请求的语法

  • 401: 未授权,请求要求身份验证。对于登录后请求的网页,服务器可能返回此响应

  • 403:服务器拒绝请求

  • 404:未找到

  • 405:请求方式不对

  • 500:服务器遇到错误,无法完成请求

  • 502:错误网关,服务器作为网关或代理,从上游服务器收到无效响应

  • 503:服务不可用

8. http头部字段

  • http通用头部字段
  • cache-control

    • no-store:不缓存
    • no-cache:不缓存过期资源
    • max-age:在这个范围内,直接从缓存取(有该属性,http1.1会忽略掉expires)
    • min-fresh: 要求缓存服务器返回至少还未过指定时间的缓存资源
    • only-if-cached: 该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码 504 Gateway Timeout
    • no-transform: 无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型
    • must-revalidate: (会忽略请求的 max-stale)代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效,若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条 504(Gateway Timeout)状态码
  • connection

    • 控制不再转发给代理的首部字段
    • 管理持久连接
  • date

    • 创建 HTTP 报文的日期和时间。
  • Pragma

    • HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0的向后兼容而定义。只用在客户端发送的请求中,有该字段一般会加Cache-Control: no-cache
  • trailer

    • 事先说明在报文主体后记录了哪些首部字段,该首部字段可应用在http/1.1版本分块传输编码时
  • Transfer-Encoding

    • 传输报文主体时采用的编码方式,HTTP/1.1 的传输编码方式仅对分块传输编码有效
  • Upgrade

    • 检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议,Upgrade 首部字段产生作用。 Upgrade 对象仅限于客户端和邻接服务器之间。因此,使用首部字段 Upgrade 时,还需要额外指定Connection:Upgrade
  • Via

    • 追踪客户端与服务器之间的请求和响应报文的传输路径,经常会和 TRACE 方法一起使用
  • Warning

    • 会告知用户一些与缓存相关的问题的警告,格式:Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])
请求头
  • Accept

    • 通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级,例如:Accept: text/html,application/xhtml+xml,application/xml;q=0.
  • Accept-Charset

    • 可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段 Accept 相同的是可用权重 q 值来表示相对优先级。例: Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
  • Accept-Encoding

    • 用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码 例:Accept-Encoding: gzip, defla
  • Accept-Langua

    • 告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集
  • Authorization

    • 用来告知服务器,用户代理的认证信息(证书值)
  • Expect

    • 来告知服务器,期望出现的某种特定行为,因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码 417 Expectation Failed
  • From

    • 用来告知服务器使用用户代理的用户的电子邮件地址
  • Host

    • 告知服务器,请求的资源所处的互联网主机名和端口号(必须被包含在请求内的首部字段)
  • If-Match

    • 条件请求,为真时候才会执行请求),若和Etag的值一样则返回200,不一样返回412,若if-Match的值为*号,服务器会忽略
  • If-None-Match

    • 只有在 If-None-Match 的字段值与 ETag 值不一致时,可处理该请求。与 If-Match 首部字段的作用相反,在 GET 或 HEAD 方法中使用首部字段 If-None-Match 可获取最新的资源。因此,这与使用首部字段 If-Modified-Since 时有些类似
  • If-Modified-Since

    • 告知服务器若 If-Modified-Since 字段值早于资源的更新时间,则希望能处理该请求,If-Modified-Since,属附带条件之一,它会告知服务器若 IfModified-Since 字段值早于资源的更新时间,则希望能处理该请求。而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码 304 Not Modified 的响应
  • If-Unmodified-Since

    • 和 If-Modified-Since 的作用相反,是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定日期时间后发生了更新,则以状态码 412 Precondition Failed 作为响返回
  • Range

    • 获取部分资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围,带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源
  • If-Range

    • 该字段的值若是和etag值或更新的日期时间匹配一致,那么就作为范围请求处理,若不一致,则忽略范围请求,返回全部资源。如果服务器的资源有更新的情况下,若不使用该首部字段,则需要处理2次
  • Max-Forwards

    • 通过 TRACE 方法或 OPTIONS 方法,发送包含首部字段 MaxForwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目
  • Proxy-Authorization

    • 接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization 的请求,以告知服务器认证所需要的信息
  • Referer

    • 告知服务器请求的原始资源的 URI
  • TE

    • 告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding 的功能很相像,但是用于传输编码
  • User-Agent

    • 会将创建请求的浏览器和用户代理名称等信息传达给服务器
响应头
  • Accept-Ranges

    • 用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源( bytes和none)
  • Age

    • 能告知客户端,源服务器在多久前创建了响应,单位秒
  • ETag

    • 首部字段 ETag 能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag值,强Etag和弱Etag,强Etag不论实体发生多么细微的变化都会改变其值,弱Etag只用于提示资源是否相同,只有资源发生了根本改变,产生差异时才会改变Etag的值,这时,会在字段值最开始处附加W/
  • Location

    • 将响应接收方引导至某个与请求 URI 位置不同的资源, 基本上,该字段会配合 3xx :Redirection 的响应,提供重定向的URI
  • Proxy-Authenticate

    • 代理服务器所要求的认证信息发送给客户端
  • Server

    • 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息
  • Retry-After

    • 告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使用
  • Vary

    • 当代理服务器接收到带有 Vary 首部字段指定获取资源的请求时,如果使用的 Accept-Language 字段的值相同,那么就直接从缓存返回响应。反之,则需要先从源服务器端获取资源后才能作为响应返回
  • WWW-Authenticate

    • 告知客户端适用于访问请求 URI 所指定资源的认证方案(Basic 或是 Digest)和带参数提示的质询(challenge)。状态码 401 Unauthorized 响应中,肯定带有首部字段 WWW-Authenticate