http 面试大全

以下题目是根据网上多份面经收集而来的,题目相同意味着被问的频率比较高,有问题欢迎留言讨论,喜欢可以点赞关注。

1、常见Http请求头

Accept:指定客户端能够接收的内容类型。

Accept-Charset:浏览器可以接受的字符编码集。

Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型。

Accept-Language:浏览器可接受的语言。

Accept-Ranges:可以请求网页实体的一个或者多个子范围字段。

AuthorizationHTTP:授权的授权证书。

Cache-Control:指定请求和响应遵循的缓存机制。

Connection:表示是否需要持久连接。(HTTP 1.1默认进行持久连接)

CookieHTTP:请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。

Content-Length:请求的内容长度。

Content-Type:请求的与实体对应的MIME信息。
Date:请求发送的日期和时间。

Expect:请求的特定的服务器行为。

From:发出请求的用户的Email。

Host:指定请求的服务器的域名和端口号。

If-Match:只有请求内容与实体相匹配才有效。

If-Modified-Since:如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码。

If-None-Match:如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变。

If-Range:如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。

If-Unmodified-Since:只在实体在指定时间之后未被修改才请求成功。

Max-Forwards:限制信息通过代理和网关传送的时间。

Pragma:用来包含实现特定的指令。

Proxy-Authorization:连接到代理的授权证书。

Range:只请求实体的一部分,指定范围。

Referer:先前网页的地址,当前请求网页紧随其后,即来路。

TE:客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息。

Upgrade:向服务器指定某种传输协议以便服务器进行转换(如果支持。

User-AgentUser-Agent:的内容包含发出请求的用户信息。

Via:通知中间网关或代理服务器地址,通信协议。

Warning:关于消息实体的警告信息

2、介绍http2.0

https://segmentfault.com/a/1190000016656529

什么是HTTP2.0

1、是HTTP协议的第二个主要版本,主要基于SPDY协议。大幅度提高了web性能。

SPDY是Speedy的昵音,意为“更快”。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能,通过压缩、多路复用和优先级等技术,缩短网页的加载时间并提高安全性。SPDY协议的核心思想是尽量减少TCP连接数。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强

HTTP1.x的缺点

HTTP1.x有以下几个主要缺点:

  1. HTTP/1.0一次只允许在一个TCP连接上发起一个请求,HTTP/1.1使用的流水线技术也只能部分处理请求并发,仍然会存在队列头阻塞问题,因此客户端在需要发起多次请求时,通常会采用建立多连接来减少延迟。
  2. 单向请求,只能由客户端发起。
  3. 请求报文与响应报文首部信息冗余量大。
  4. 数据未压缩,导致数据的传输量大。
HTTP2.0特点

通过以上内容,你应该已经对HTTP2.0有了初步认识,并且了解了HTTP1.x的缺点。那么下面我们就来了解一下HTTP2.0的特点。

1、二进制传输

文本的表现形式有多样性,健壮性考虑
HTTP2.0中所有加强性能的核心是二进制传输,在HTTP1.x中,我们是通过文本的方式传输数据。基于文本的方式传输数据存在很多缺陷,文本的表现形式有多样性,因此要做到健壮性考虑的场景必然有很多,但是二进制则不同,只有0和1的组合,因此选择了二进制传输,实现方便且健壮。 在HTTP2.0中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。 为了保证HTTP不受影响,那就需要在应用层(HTTP2.0)和传输层(TCP or UDP)之间增加一个二进制分帧层。在二进制分帧层上,HTTP2.0会将所有传输的信息分为更小的消息和帧,并采用二进制格式编码,其中HTTP1.x的首部信息会被封装到Headers帧,而Request Body则封装到Data帧。

2、多路复用

即在一个TCP连接,即可以同时发送多个请求
在HTTP1.0中,我们经常会使用到雪碧图、使用多个域名等方式来进行优化,都是因为浏览器限制了同一个域名下的请求数量,当页面需要请求很多资源的时候,队头阻塞(Head of line blocking)会导致在达到最大请求时,资源需要等待其他资源请求完成后才能继续发送。 HTTP2.0中,有两个概念非常重要:帧(frame)和流(stream)。 帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流是多个帧组成的数据流。 所谓多路复用,即在一个TCP连接中存在多个流,即可以同时发送多个请求,对端可以通过帧中的表示知道该帧属于哪个请求。在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装。通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能。

3、Header压缩

使用文本的形式传输header,在header中携带cookie的话,开销大
在HTTP1.0中,我们使用文本的形式传输header,在header中携带cookie的话,每次都需要重复传输几百到几千的字节,这着实是一笔不小的开销。 在HTTP2.0中,我们使用了HPACK(HTTP2头部压缩算法)压缩格式对传输的header进行编码,减少了header的大小。并在两端维护了索引表,用于记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。

4、服务器Push

在HTTP2.0中,服务端可以在客户端某个请求后,主动推送其他资源。
可以想象一下,某些资源客户端是一定会请求的,这时就可以采取服务端push的技术,提前给客户端推送必要的资源,就可以相对减少一点延迟时间。在浏览器兼容的情况下也可以使用prefetch。

5、更安全

HTTP2.0使用了tls的拓展ALPN做为协议升级,除此之外,HTTP2.0对tls的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法。

3、通过什么做到并发请求

使用异步Prmosie或者web worker

4、http1.1时如何复用tcp连接

其实这里就是要利用现有的服务端+keep-alive+浏览器实现:
0.合并请求
1.多文件合成流
2.多个流同时发送/接受
3.校验完整性、合并、执行

https://segmentfault.com/q/1010000021181827/

5、Http报文的请求会有几个部分
http协议报文
    1.请求报文(请求行/请求头/请求数据/空行)
        请求行
            求方法字段、URL字段和HTTP协议版本
            例如:GET /index.html HTTP/1.1
                get方法将数据拼接在url后面,传递参数受限
            请求方法:
                GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT
        请求头(key value形式)
            User-Agent:产生请求的浏览器类型。
            Accept:客户端可识别的内容类型列表。
            Host:主机地址
        请求数据
            post方法中,会把数据以key value形式发送请求
        空行
            发送回车符和换行符,通知服务器以下不再有请求头
    2.响应报文(状态行、消息报头、响应正文)
        状态行
        消息报头
        响应正文

6、cookie放哪里,cookie能做的事情和存在的价值

cookie是存在浏览器上的一小段数据,来解决 HTTP无状态机制问题,比如记录某系页面关闭或者刷新后仍需要记录的信息。

属性
cookie可以使用js在浏览器直接设置,也可以在服务器端使用HTTP协议规定的set-cookie来设置。
一般cookie的容量为4k左右。
document.cookie查看当前浏览网站的cookie

运用
1、会话状态管理(如用户登录状态、购物车、游戏分数、其它需要记录的信息)
2、个性化设置(如用户自定义设置、主题等)
3、精准广告。(平常浏览网页时有时会推出商品刚好是你最近浏览过,买过的类似东西,这些是通过cookie记录的。)

7、cookie和token都存放在header里面,为什么只劫持前者

https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/31

1、首先token不是防止XSS的,而是为了防止CSRF的;
2、CSRF攻击的原因是浏览器会自动带上cookie,而浏览器不会自动带上token

cookie
举例:服务员看你的身份证,给你一个编号,以后,进行任何操作,都出示编号后服务员去看查你是谁。
token
举例:直接给服务员看自己身份证

因为传统的cookie保存的session id,服务器会根据这个session id,确保服务器与客户端对话;这是的cookie是有状态的,意味着验证记录或者会话需要一直在服务端和客户端保持。而token是无状态的,服务器不记录哪些用户登录了或者哪些 JWT 被发布了,只判断token是否有效,通常我们都会给token设置有效时间,来确保不被劫持。所以劫持cookie比劫持token,更有效,毕竟cookie在某种情况下可以一直使用下去,而token不行。

cookie:登陆后后端生成一个sessionid放在cookie中返回给客户端,并且服务端一直记录着这个sessionid,客户端以后每次请求都会带上这个sessionid,服务端通过这个sessionid来验证身份之类的操作。所以别人拿到了cookie拿到了sessionid后,就可以完全替代你。
token:登陆后后端不返回一个token给客户端,客户端将这个token存储起来,然后每次客户端请求都需要开发者手动将token放在header中带过去,服务端每次只需要对这个token进行验证就能使用token中的信息来进行下一步操作了。

8、cookie和session有哪些方面的区别

1、存储位置不同: cookie数据存放在客户的浏览器上,session数据放在服务器上

2、隐私策略不同:cookie不是很安全, 别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session

3、session会在一定时间内保存在服务器上。当访问增多,就会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie

4、存储大小不同: 单个cookie保存的数据不能超过4k, 很多浏览器都限制一个站点最多保存20个cookie

一般建议: 将登陆信息等重要信息存放为session, 其他信息如果需要保留,可以放在cookie中

9、从输入URL到页面加载全过程

1.DNS解析,找到IP地址
2.根据IP地址,找到对应的服务器
3.建立TCP连接(里面有个 三次握手)
4.连接建立后,发出HTTP请求
5.服务器根据请求作出HTTP响应
6.浏览器得到响应内容,进行解析与渲染,并显示
7.断开连接(四次挥手)

image

从输入一个网址到浏览器显示页面的全过程详细分析

10、tcp属于哪一层

(1 物理层 -> 2 数据链路层 -> 3 网络层(ip)-> 4 传输层(tcp) -> 5 应用层(http))

11、如何设计一个localStorage,保证数据的实效性

localStorage 是持久化的存储,不是缓存级别的,用于存储一些临时的离线数据,所以也就不存在什么超时时间的概念。只能手动清除,可以自己写一些业务逻辑去判断在什么时机清除

if (+new Date() > +new Date(2014, 11, 30)) {
    localStorage.removeItem("c");    //清除c的值
    // or localStorage.clear();
}

不过有一点,请不要用localStorage保存机密数据,即便你已加密,也不安全哟~

12、介绍xss,csrf

xss:用户通过各种方式将恶意代码注入到其他用户的页面中。就可以通过脚本获取信息,发起请求,之类的操作。

csrf:跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。csrf并不能够拿到用户的任何信息,它只是欺骗用户浏览器,让其以用户的名义进行操作。

13、http缓存控制

浏览器缓存控制分为强缓存和协商缓存,协商缓存必须配合强缓存使用。
判断是否使用缓存主要是判断缓存是否在有效期内。

当浏览器对某个资源的请求命中了强缓存时,利用Expires或者Cache-Control这两个http response header实现。
Expires描述的是一个绝对时间,依据的是客户端的时间,用GMT格式的字符串表示,如Expires:Thu,31 Dec 2037 23:55:55 GMT,下次浏览器再次请求同一资源时,会先从客户端缓存中查找,找到这个资源后拿出它的Expires与当前时间做比较,如果请求时间在Expires规定的有效期内就能命中缓存,这样就不用再次到服务器上去缓存一遍,节省了资源。但正因为是绝对时间,如果客户端的时间被随意篡改,这个机制就实效了,所以我们需要Cache-Control
Cache-Control描述的是一个相对时间,在进行缓存命中时都是利用浏览器时间判断。ExpiresCache-Control这两个header可以只启用一个,也可以同时启用,同时启用时Cache-Control优先级高于Expires

当浏览器对某个资源的请求没有命中强缓存(即缓存过期后),就会发起一个请求到服务器,验证协商缓存是否命中(即验证缓存是否有更新,虽然有效期过了,但我还能继续使用它吗?),如果命中则还是从客户端中加载。协商缓存利用的是Last-Modified,If-Modified-SinceETag,If-None-Match这两对header来管理的Last-Modified,If-Modified-Since:原理和上面的Expires相同,服务器会响应一个Last-Modified字段,表示最近一次修改缓存的时间,当缓存过期后, 浏览器就会把这个时间放在If-Modified-Since去请求服务器,判断缓存是否有更新。区别是它是根据服务器时间返回的header来判断缓存是否存在,但有时候也会出现服务器上资源有变化但修改时间没有变化的情况,这种情况我们就需要ETag,If-None-Match
ETag,If-None-Match:原理与上面相同,区别是浏览器向服务器请求一个资源,服务器在返回这个资源的同时,在response的header中加上一个Etag字段,这个字段是服务器根据当前请求的资源生成的唯一标识字符串,只有资源有变化这个串就会发生改动。当缓存过期后,浏览器会把这个字符串放在If-None-Match去请求服务器,比较字符串的值判断是否有更新,Etag的优先级比Last-Modified的更高, Etag的出现是为了解决一个缓存文件在短时间内被多次修改的问题,因为Last-Modified只能精确到秒。ETag,If-None-Match这么厉害我们为什么还需要Last-Modified,If-Modified-Since呢?有一个例子就是,分布式系统尽量关掉ETag,因为每台机器生成的ETag不一样,Last-Modified,If-Modified-SinceETag,If-None-Match一般都是同时启用。
https://www.jianshu.com/p/975eb0c1f9df

14、HTTP优化策略(博客)

压缩和缓存
HTTP前端性能优化(压缩与缓存)

15、HTTP中的头(重点)
image
16、介绍下HTTP状态码,403、301、302是什么
1xx

101(双向通信)

2xx

200(成功)
204(没有响应体)
206(断点续传)

3xx

301(永久重定向)
302(临时重定向)
304(缓存,请求的网页未修改过)

4xx

401(没有权限,即请求未授权)
403(登陆了没有权限,禁止访问)
404(找不到对应的资源)
405(请求方法不存在,不支持)

5xx

502(负载均衡)

image
17、缓存相关的HTTP请求头

强缓存相关的HTTP header 的字段

Cache-Control:在响应头中设置,用于通知浏览器该资源需要被缓存
Expires:其作用也是设置缓存时间(什么时候过期),但是在设置了cache-control的情况下会被覆盖

协商缓存相关的HTTP header 的字段
Last-Modified 和 If-Modified-Since(让服务器去判断是否在此时间之后资源内容发生了变化)
Etag和 If-None-Match(判断资源是否改变)

18、介绍HTTPS

HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

在HTTP协议中有可能存在信息窃取或身份伪装等安全问题
所以:HTTPS主要作用是:
(1)对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;
(2)对网站服务器进行真实身份认证。

19、HTTPS怎么建立安全通道
20、前后端通信使用什么方案

前后端实现通信的方式,即实现数据交互,靠的是HTTP(或者其他衍生类型,例如SSE、WS)

1、ajax(Asynchronous JavaScript + XML)技术:ajax的核心是XMLHttpRequest,通过对该对象的操作来进行异步的数据请求。有同源限制。

接触的最多的就是jQuery的封装,比如$.ajax   $.post   $.get
angular的话可以使用$htttp服务。

2、EventSource:就是SSE(服务端推送)技术,从HTTP演变而来

3、Web Socket HTML5 WebSocket 设计出来的目的就是要取代轮询和Comet技术,使客户端浏览器具备像C/S架构下桌面系统的实时通讯能力。浏览器通过javascript向服务器发出建立WebSocket连接的请求,连接建立后,客户端和服务端就可以通过TCP连接直接交换数据。也就是我们可以使用web技术构建实时性的程序,比如聊天、游戏等应用。需要考虑兼容性。

4、navigator.sendBeacon:全新的异步数据上报api,专门用来做数据采集,浏览器会在合适的时候才执行数据上报。典型场景就是无阻塞的方式对出站行为进行采集上报。

5、服务端渲染 谈起服务端渲染,对于动态服务而言,这个世界 上跑的大多数页面都经过服务端的数据渲染,接口->前端赋值->模板渲染,这些都是在服务器完成的,在查看源码的时候,可以看到完整的html代码,包括每个数据值。

21、localStorage和cookie有什么区别
image
22、CORS如何设置

1.web缓存就是存在于客户端与服务器之间的一个副本、当你第一个发出请求后,缓存根据请求保存输出内容的副本
2.缓存的好处
(1)减少不必要的请求
(2)降低服务器的压力,减少服务器的消耗
(3)降低网络延迟,加快页面打开速度(直接读取浏览器的数据)

23、304是什么
image
24、网络的五层模型
image
25、HTTP和HTTPS的区别

1、HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
2、HTTP 是不安全的,而 HTTPS 是安全的
3、HTTP 标准端口是80 ,而 HTTPS 的标准端口是443
4、在OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层
5、HTTP 无法加密,而HTTPS 对传输的数据进行加密
6、HTTP无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书

image
image
26、介绍SSL和TLS

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport LayerSecurity,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,两者差别极小。

27、介绍DNS解析

DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。

image

①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了
浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如http://www.baidu.com/, 并将这个主机名传送给DNS应用的客户端
DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)
④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址
⑤一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接

28、cookie的引用为了解决什么问题

http无状态问题

29、常见的web安全及防护原理?

sql注入原理:是将sql代码伪装到输入参数中,传递到服务器解析并执行的一种攻击手法。
XSS(跨站脚本攻击):往web页面插入恶意的html标签或者js代码。
CSRF(跨站请求伪装):通过伪装来自受信任用户的请求

30、formData和原生的ajax有什么区别

与普通的Ajax相比,使用FormData 的最大优点就是可以异步上传二进制文件。

31、介绍下表单提交,和formData有什么关系

这是HTML5 中新增的API
优点:FormData不仅能读取表单数据,也能自行追加数据

32、介绍localstorage的API

localStorage, 是一个用来做本地持久化存储的Web Api。 localStorage以键值对的形式存储数据。用法很简单

// 设置
localStorage.setItem('myCat', 'Tom');
// 获取
let cat = localStorage.getItem('myCat');
// 移除
localStorage.removeItem('myCat');
// 移除所有
localStorage.clear();

有几个点需要注意:

1、localStorage是以『源(origin)』为维度进行存储的。也就是说,跨域访问其他站点的localStorage是行不通的。
2、localStorage是以字符串的形式保存数据的。
3、对于每一个域,localStorage最多允许存储几M数量级的数据(具体数字因浏览器而异)。

localStorage可以用来做什么:

存储登录token,用户信息等数据;本地持久化保存业务数据;保存代码,以提高网站性能。还有本文所要介绍的页面同步。

监听LocalStorage变化

localStorage被改变时(从无到有,从有到无,值改变),会触发一个storage事件。我们可以在window上监听到这个事件。

window.addEventListener('storage', () => {
  ...
});

window.onstorage = () => {
  ...
};

这里需要注意的是,在改变localStorage的当前页面,是无法监听到storage事件的。如果我同时打开了多个同源的页面: A页面、B页面、C页面,当在A页面中修改localstorage时,B页面和C页面中都可以监听到storage事件,而A页面是不会触发storage事件的。

33、get和post有什么区别

(1)get在浏览器回退时是无害的,而post会再次提交请求。(记住)
(2)get产生的url地址可以被收藏,而post不可以。
(3)get请求会被浏览器主动缓存,而post不会,除非手动设置。(记住)
(4)get请求只能进行url编码,而post支持多种编码方式。
(5)get请求参数会被完整保留在浏览器历史记录里,而post中的参数不会被保留。(记住)
(6)get请求在url中传送的参数是有长度限制的,而post没有限制。
(7)对参数的数据类型,get只接受ASCII字符,而post没有限制。
(8)get比post更不安全,因为参数直接暴露在url上,所以不能用来传递敏感信息。
(9)get参数通过url传递,post放在request body 中。(记住)

34、谈谈你对TCP三次握手和四次挥手的理解

详细介绍
https://juejin.im/post/5d287c8651882536124055da

三次握手:

首先解析服务器DNS,找到IP,然后开始建立连接:

1.第一次握手: 建立连接,客户端A发送SYN=1、随机产生Seq=client_isn的数据包到服务器B,等待服务器确认。

2.第二次握手: 服务器B收到请求后确认联机(可以接受数据),发起第二次握手请求,ACK=(A的Seq+1)、SYN=1,随机产生Seq=client_isn的数据包到A。

3.第三次握手: A收到后检查ACK是否正确,若正确,A会在发送确认包ACK=服务器B的Seq+1、ACK=1,服务器B收到后确认Seq值与ACK值,若正确,则建立连接。

image

四次挥手:

1.第一次挥手:TCP发送一个FIN(结束)标识,用来关闭客户到服务端的连接。

2.第二次挥手:服务端收到这个FIN标识,他发回一个ACK(确认)标识,确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。(服务器端继续发送未发送完的数据)

3.第三次挥手:服务端发送一个FIN(结束)标识到客户端,服务端关闭客户端的连接。

4.第四次挥手:客户端发送ACK(确认)标识报文确认,并将确认的序号+1,这样关闭完成。

image
35、简单讲解一下http2的多路复用

即在一个TCP连接,即可以同时发送多个请求
在HTTP1.0中,我们经常会使用到雪碧图、使用多个域名等方式来进行优化,都是因为浏览器限制了同一个域名下的请求数量,当页面需要请求很多资源的时候,队头阻塞(Head of line blocking)会导致在达到最大请求时,资源需要等待其他资源请求完成后才能继续发送。 HTTP2.0中,有两个概念非常重要:帧(frame)和流(stream)。 帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流是多个帧组成的数据流。 所谓多路复用,即在一个TCP连接中存在多个流,即可以同时发送多个请求,对端可以通过帧中的表示知道该帧属于哪个请求。在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装。通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能。

36、http 状态码中 301,302和307有什么区别
image
37、浏览器缓存读取规则

详细如下:
https://www.cnblogs.com/shixiaomiao1122/p/7591556.html

(a)浏览器判定是否有缓存
(b)缓存是否过期
(c)跟服务器协商是否使用缓存
(d)协商缓存

强缓存
用户发送的请求,直接从客户端缓存中获取,不发送请求到服务器,不与服务器发生交互行为。

协商缓存
用户发送的请求,发送到服务器后,由服务器判定是否从缓存中获取资源。

两者共同点:客户端获得的数据最后都是从客户端缓存中获得。
两者的区别:从名字就可以看出,强缓存不与服务器交互,而协商缓存则需要与服务器交互。

image
38、介绍 HTTPS 握手过程

1、建立服务器443端口连接
2、SSL握手:随机数,证书,密钥,加密算法
3、发送加密请求
4、发送加密响应
5、关闭SSL
6、关闭TCP

39、HTTPS 握手过程中,客户端如何验证证书的合法性

1、客户端取出提前内置在手机内部的认证机构的公钥
2、用认证机构的公钥去解密公钥证书里的数字签名 从而得到数字指纹
3、客户端对公钥证书的服务器公钥进行 数字摘要算法 从而生成数字指纹
4、对比客户端自己生成的数字指纹(第3步)和解密得到的数字指纹(第2步)是否一致 如果一致则公钥证书验证通过 就可以进行接下来的握手步骤了

40、介绍下如何实现 token 加密

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的
https://www.cnblogs.com/cjsblog/p/9277677.html

1、需要一个secret(随机数)
2、后端利用secret和加密算法(如:HMAC-SHA256)对payload(如账号密码)生成一个字符串(token),返回前端
3、前端每次request在header中带上token
4、后端用同样的算法解密

41、介绍下 HTTPS 中间人攻击
image

2.中间人攻击
①SSLStrip (降级攻击)的工作原理及步骤
(1) 先进行中间人攻击来拦截 HTTP 流量。
(2) 将出现的 HTTPS 链接全部替换为 HTTP,同时记下所有改变的链接。
(3) 使用 HTTP 与受害者机器连接。
(4) 同时与合法的服务器建立 HTTPS。
(5) 受害者与合法服务器之间的全部通信经过了代理转发。
(6) 其中,出现的图标被替换成为用户熟悉的“小黄锁”图标,以建立信任。
(7) 这样,中间人攻击就成功骗取了密码、账号等信息,而受害者一无所知。
总而言之,SSLStrip是一种降级攻击。
②sslsplit(解密攻击)工作原理
工具的主要原理是以中间人的身份将证书插入到客户端和服务器中间,从而截断客户端和服务器之间的数据。
之前我们大多数做的都是针对于80端口的欺骗(http),也就是说,只要是超越了80端口我们就会有点棘手:比如常用的443端口(https),比如465(smtps)和587端口,这些都是通过SSL加密进行数据传输的,简单的80端口监听肯定是什么都拿不到的。这个时候,就体现出SSL证书劫持的作用了。
总而言之,SSLSplit是一种伪造证书攻击。

42、既然HTTPS那么安全可靠,为何不所有的网站都使用HTTPS

首先,很多人还是会觉得HTTPS实施有门槛,这个门槛在于需要权威CA颁发的SSL证书。从证书的选择、购买到部署,传统的模式下都会比较耗时耗力。
其次,HTTPS普遍认为性能消耗要大于HTTP,因为与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。但事实并非如此,用户可以通过性能优化、把证书部署在SLB或CDN,来解决此问题。举个实际的例子,“双十一”期间,全站HTTPS的淘宝、天猫依然保证了网站和移动端的访问、浏览、交易等操作的顺畅、平滑。通过测试发现,经过优化后的许多页面性能与HTTP持平甚至还有小幅提升,因此HTTPS经过优化之后其实并不慢。除此之外,想要节约购买证书的开销也是原因之一。要进行HTTPS通信,证书是必不可少的。而使用的证书必须向认证机构(CA)购买。
最后是安全意识。相比国内,国外互联网行业的安全意识和技术应用相对成熟,HTTPS部署趋势是由社会、企业、政府共同去推动的。

43、http 状态码 502 和 504 有什么区别
image
44、http proxy 的原理是什么

https://blog.csdn.net/hhthwx/article/details/80142123

45、随着 http2 的发展,前端性能优化中的哪些传统方案可以被替代

1、雪碧图
2、资源文件合并

46、http2 与 http1.1 有什么不同

http1
a、默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求
b、管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应
c、断点续传

实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输

http2
1、二进制传输
2、多路复用
3、头部压缩
4、server push
5、更安全

47、gzip 的原理是什么

gzip 使用了 LZ77 算法与 Huffman 编码来压缩文件,重复度越高的文件可压缩的空间就越大。

48、可以对图片开启 gzip 压缩吗,为什么

不需要开启,如果开启的话,有可能使图片变的更大。如果你注意一些网站的 img 资源时,就会发现他们都没有开启 gzip

49、http 响应头中的 ETag 值是如何生成的?

由 etag 计算 Last-Modified 与 Content-Length,使用 js 计算如下,结果相符

50、如果 http 响应头中 ETag 值改变了,是否意味着文件内容一定已经更改?

不一定,由服务器中 ETag 的生成算法决定。详见 #112

比如 nginx 中的 etaglast_modifiedcontent_length 组成,而 last_modified 又由 mtime 组成

当编辑文件却未更改文件内容时,或者 touch filemtime 也会改变,此时 etag 改变,但是文件内容没有更改。

51、既然 http 是无状态协议,那它是如何保持登录状态

通过 cookie 或者 Authorization header 来传递凭证,在服务端进行认证

52、在发送 http 请求报文时,Host 是必要的吗

在 Issue 中交流与讨论: 答案解析

是有必要的,因为我们不知道会途径会不会有代理出现, 如果直接到达服务器的话,服务器是可以通过路径知道资源在哪,但是如果通过代理的话,代理无法得知具体服务器是什么地址

53、http 响应头中如果 content-type 为 application/octet-stream,则代表什么意思

在 Issue 中交流与讨论: 答案解析

代表二进制流,一般用以下载文件

54、http 向 https 做重定向应该使用哪个状态码

在 Issue 中交流与讨论: 答案解析

一般用作 301 的较为多,但是也有使用 302,如果开启了 HSTS 则会使用 307

如知乎使用了 302,淘宝使用了 301

55、http 1.1 中的 keep-alive 有什么作用

在 Issue 中交流与讨论: 答案解析

在 http 1.1 中,在响应头中设置 keep-alive 可以在一个 TCP 连接上发送多个 http 请求

避免了重开 TCP 连接的开销
避免了刷新时重新建立 SSL 连接的开销
避免了QPS过大时,服务器的连接数过大

在服务器端使用响应头开启 keep-alive
Connection: Keep-Alive
Keep-Alive: timeout=5, max=1000

56、什么是Http协议无状态协议?怎么解决Http协议无状态协议?

无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息
也就是说,当客户端一次HTTP请求完成以后,客户端再发送一次HTTP请求,HTTP并不知道当前客户端是一个”老用户“。

可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“。

57、URI和URL的区别

URI,全称是 Uniform Resource Identifiers,即统一资源标识符,用于在互联网上标识一个资源,而 URL 是uniform resource locator,即统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源。URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。

URI = Uniform Resource Identifier 统一资源标志符URL = Uniform Resource Locator 统一资源定位符URN = Uniform Resource Name 统一资源名称大白话,就是URI是抽象的定义,不管用什么方法表示,只要能定位一个资源,就叫URI,本来设想的的使用两种方法定位:1,URL,用地址定位;2,URN 用名称定位。举个例子:去村子找个具体的人(URI),如果用地址:某村多少号房子第几间房的主人 就是URL, 如果用身份证号+名字 去找就是URN了。结果就是 目前WEB上就URL流行开了,平常见得URI 基本都是URL。

58、常用的HTTP方法有哪些?8种

1.GET
get方法请求指定的页面信息,返回实体主体。该请求是向服务器请求信息,请求参数会跟在url后面,因此,对传参长度有限制的,而且不同浏览器的上限是不同的(2k, 7~8k及其他)。由于get请求直接将参数暴露在url中,因此对于一些带有重要信息的请求可能并不完全合适。
2.POST
post请求是向指定资源提交数据进行处理请求,例如提交表单或者上传文件等。数据被包含在请求体中,POST请求可能会导致新的资源的建立和/或已有资源的修改。post方法没有对传递资源的大小进行限制,往往是取决于服务器端的接受能力,而且,该方法传参安全性稍高些
3.PUT
PUT方法是从客户端向服务器传送的数据取代指定的文档的内容。PUT方法的本质是idempotent的方法,通过服务是否是idempotent来判断用PUT 还是 POST更合理,通常情况下这两种方法并没有刻意区分,根据语义使用即可
4.DELETE
请求服务器删除指定的页面,DELETE请求一般会返回3种状态码:200 (OK) - 删除成功,同时返回已经删除的资源202 (Accepted) - 删除请求已经接受,但没有被立即执行(资源也许已经被转移到了待删除区域)204 (No Content) - 删除请求已经被执行,但是没有返回资源(也许是请求删除不存在的资源造成的)
5.OPTIONS
允许客户端查看服务器的性能。(常见的是跨域预检Preflighted Reqeusts方法会采用该方法)。一般来说,开发中用到该方法是用来获取服务器支持的请求类型或者查看服务器类型,来确保接下来发送的请求够安全。该请求方法的响应不能缓存。如果该URI是一个星号(“*”),OPTIONS请求将试图应用于服务器,而不是某个指定资源;如果该URI不是星号,则只能用来获取该资源通信中可用的选项。
6.HEAD
类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头7.CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器8.TRACE回显服务器收到的请求,主要用于测试或诊断。
7.CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
8.TRACE
回显服务器收到的请求,主要用于测试或诊断。

59、HTTPS工作原理

一、首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
二、客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
三、消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
四、发送给服务端,此时只有服务端(RSA私钥)能解密。
五、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。
[图片上传失败...(image-c71bd6-1581607141614)]

60、HTTP优化方案

1、TCP复用:TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端TCP连接上,而HTTP复用则是一个客户端的多个HTTP请求通过一个TCP连接进行处理。前者是负载均衡设备的独特功能;而后者是HTTP 1.1协议所支持的新功能,目前被大多数浏览器所支持。
2、内容缓存:将经常用到的内容进行缓存起来,那么客户端就可以直接在内存中获取相应的数据了。
3、压缩:将文本数据进行压缩,减少带宽
4、SSL加速(SSL Acceleration):使用SSL协议对HTTP协议进行加密,在通道内加密并加速
5、TCP缓冲:通过采用TCP缓冲技术,可以提高服务器端响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。

61、tcp 如何做拥塞控制
62、CDN的作用和原理
63、理解WebSocket协议的底层原理、与HTTP的区别
64、Accept 头部的作用什么,如果服务器不支持怎么办
65、502 和 504的区别
66、状态码和方法,101
67、

TCP 为什么是可靠的
因为它有 ACK
那 tpc 和 udp 相比的话,udp 有什么好处,虽然不可靠,但是为什么还有很多基于 udp 的协议
因为 upd 报文小,udp 头部8个字节,tcp 头部20个字节,而且有些协议也不需要太可靠。面试官看我把报文 header 大小答出来了,然后看了下简历发现我是学网络工程的。其实我网络工程学的也忘的差不多了 (刚开始都能记住TCP的六个标志位)

68、DNS劫持
69、什么是TCP粘包
70、http缓存怎么优化
71、介绍下数字签名的原理
72、RESTful常用的Method
73、介绍下前端加密的常见场景和方法
74、TCP 与 UDP 的区别是什么,既然 TCP 是可靠的,那它有啥缺点
75、如何在 linux 中拿到 TCP 的状态
76、http 与 tcp 的区别
77、浏览器的缓存问题
78、502 和 504的区别
79、状态码和方法,101
80、Accept 头部的作用什么,如果服务器不支持怎么办
81、tcp 如何做拥塞控制
82、301 与 302 的区别以307 的区别
83、CDN 的工作原理,以及刷新缓存的原理
84、DNS 解析过程
85、TCP 有哪些手段保证可靠交付
86、DNS 解析会出错吗,为什么
87、301 302 307 308 401 403
88、JWT 细节,适用场景
89、如何应对流量劫持
90、JWT优缺点
91、301 302 307 308 401 403
92、cookie的存放位置,删除机制。

缓存的更新机制
文件操作的API
web数据存放的API( cookie,localstorage,sessionstroage,indexDB...)
3.即时通信(除了Ajax和websocket)
Comet技术:基于HTTP长连接的Web端实时通信技术
SSE:服务器发送事件,使用长链接进行通讯

4.服务器代理转发如何处理cookie(nginx) proxy_cookie_domain localhost example.org;
proxy_cookie_domain ~.([a-z]+.[a-z]+)[图片上传失败...(image-50c30e-1583940897317)]

1;
proxy_cookie_path /one/ /;
proxy_cookie_path / /two/;

image
image
image
image
image
image
image

HTTPS是如何实现加密
https加密过程,证书用途
服务端配置证书 -> 传送证书 -> 客户端解析证书 -> 传送加密信息 -> 服务端解密信息 -> 传输加密后信息 -> 客户端解密信息

你可能感兴趣的:(http 面试大全)