【面经】HTTP篇
计算机网络是面试必考的内容之一,本篇为大家整理关于HTTP的几道面试题。
⭐码字不易,求个关注⭐
⭐点个收藏不迷路哦~⭐
你的支持是我持续学习的动力~
文章目录
- HTTP基本概念
- HTTP是什么?
- HTTP常见字段?
- HTTP常见状态码?
- GET与POST
- GET与POST有什么区别?
- GET与POST都是安全或幂等的吗?
- HTTP缓存技术
- HTTP缓存有哪些实现方式?
- HTTP特性
- HTTP(1.1)的优点有哪些?
- HTTP(1.1)的缺点有哪些?
- HTTP(1.1)的性能如何?
- HTTP与HTTPS
- HTTP与HTTPS有哪些区别?
- HTTPS解决了HTTP的哪些问题?
HTTP基本概念
HTTP是什么?
HTTP是超文本传输协议,也就是HyperText Transfer Protocol。
具体来说,HTTP协议是在计算机网络中的两点之间传输超文本的一种约定和规范。
HTTP常见字段?
-
通用首部字段
- Cache-control字段:该字段可以控制缓存的行为。
- Connection字段:最常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用。HTTP/1.1 版本的默认连接都是持久连接,但为了兼容老版本的 HTTP,需要指定
Connection
首部字段的值为Keep-Alive
。
-
请求首部字段
- Host字段:发送请求时,指定服务器的域名。Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。
- Accept字段:Accept 首部字段可通知服务器,客户端能够处理的媒体类型及媒体类型的相对优先级。
-
响应首部字段
- ETag字段:首部字段 ETag 能告知客户端、资源的标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag值。
- Location字段:该字段会配合 3xx 的响应码,提供客户端重定向的URL。
-
实体首部字段
- Allow字段:用于通知客户端能够支持的所有 HTTP 方法。
- Content—Length字段:表明本次回应的数据长度。
- Content-Type 字段:用于服务器回应时,告诉客户端,本次数据是什么格式。
- Content-Encoding 字段:说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式。
HTTP常见状态码?
2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
-
「 200 OK」是最常见的成功状态码,表示一切正常。
-
「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但没有返回实体内容。
-
「206 Partial Content」该状态码表示客户端进行了范围请求,而服务器成功执行了部分的GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。
3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。
-
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
-
「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
301 和 302 都会在响应头里使用字段
Location
,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。 -
「304 Not Modified」协商缓存时,该状态码表示资源未被修改,客户端可以继续使用缓存资源,用于缓存控制。
4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
-
「400 Bad Request」表示客户端请求报文中有语法错误。
-
「401 Unauthorized」该状态码表示客户端发送的请求需要有通过 HTTP 认证的认证信息(可能服务器会发送一个基于表单的认证信息,来确认用户身份)。另外若之前已进行过 1 次请求,则表示用户认证失败。
-
「403 Forbidden」表示服务器禁止访问资源,比如未获得文件系统的访问授权,访问权限出了问题。
-
「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
-
「405」自己手写Servlet时遇到,请求方法不匹配。访问浏览器默认是get方法。如果Servlet写的是doPost方法,就会报错。
5xx
类状态码表示服务器处理时内部发生了错误,属于服务器端的错误码。
-
「500 Internal Server Error」该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障。
-
「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
-
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
-
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。
GET与POST
GET与POST有什么区别?
GET 的语义是请求获取指定的资源。GET 请求的参数位置一般是写在 URL 中。
POST 的语义是向指定的资源提交处理的数据,比如表单的add操作,需要在表单中指明使用post方法。Post通过表单提交,不会显示在URL上。
GET与POST都是安全或幂等的吗?
- 「安全」是指请求方法不会修改服务器上的资源。
- 「幂等」是指多次执行相同的操作,结果都是「相同」的。
- GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。
另外,我们也可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签。 - POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签。
HTTP缓存技术
HTTP缓存有哪些实现方式?
使用缓存,可以避免重复发送HTTP请求。主要有两种实现方式,分别是强制缓存和协商缓存。
-
强制缓存
定义:只要浏览器的缓存资源没有过期,就直接使用浏览器的本地缓存。不会访问服务器。是否使用缓存由浏览器这边控制。
要实现强制缓存的话,是利用两个字段实现的:
Cache-control
和Expires
如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control的优先级高于 Expires 。建议使用Cache-Control 来实现强缓存。浏览器如何判断是否使用缓存?
- 浏览器第一次请求服务器资源时,服务器会在返回资源的同时,在响应头加上Cache-control设置过期时间大小。
- 浏览器再次请求服务器中的该资源时,会先比较请求资源的时间和Cache-Control 中的过期时间的大小,计算是否过期,如果没有,则使用该缓存,否则进行协商缓存。
- 服务器收到请求后,会再次更新响应头的Cache-Control。
HTTP状态码:
- 200 (form memory cache) : 不访问服务器,一般已经加载过该资源且缓存在了内存当中,直接从内存中读取缓存。浏览器关闭后,数据将不存在(资源被释放掉了),再次打开相同的页面时,不会出现from memory cache。
- 200( from disk cache): 不访问服务器,已经在之前的某个时间加载过该资源,直接从硬盘中读取缓存,关闭浏览器后,数据依然存在,此资源不会随着该页面的关闭而释放掉下次打开仍然会是from disk cache。
-
协商缓存
当浏览器本地的缓存过期,浏览器就会向服务器发送请求,之后由服务器告知客户端是否可以使用缓存【304(继续使用本地缓存)/200(更新缓存)】,这种方式就是协商缓存。通过协商结果来判断是否使用本地缓存。
-
协商缓存的两种头部实现方式
- 请求头部的
If-Modified-Since
和响应头部的Last-Modified
- 请求头部的
If-None-Match
和响应头部中的Etag
字段。
- 请求头部的
第一种头部实现的具体方式 ?
当本地资源过期了,发现响应中出现
Last-Modified
,那么第二次请求就会带上这个时间,服务器把last-Modified
和If-Modified-Since
两个时间进行对比,如果最后修改的时间(last-Modified
)比较新,就返回最新的资源。否则就返回状态码304,继续使用本地缓存。
第二种头部实现的具体方式?
当本地资源过期时,发现响应中出现
Etag
,那么第二次向服务器发送请求时,会将请求头If-None-Match
设置为Etag
的值。服务器收到请求后进行对比,资源没有变化则返回304,如果变化,则返回新的资源和状态码200。
同时有
Etag
和Last-Modified
?Etag的优先级更高,因为Etag能解决Last-Modified难以解决的问题。
- 文件没变,但是有可能最后修改时间改变了·。
If-Modified-Since
检查的粒度是秒级的,如果文件在1秒以内进行修改,无法使用。- 服务器可能并不能准确获取文件的最后修改时间。
最后注意:协商缓存都必须配合强制缓存中的Cache-control来使用,只有不能使用强制缓存时,才可以用协商缓存。
HTTP特性
HTTP(1.1)的优点有哪些?
HTTP最突出的优点是:简单、灵活和易于拓展、应用广泛和跨平台。
-
简单
报文格式就是请求行、请求头、请求体。头部信息也是
key-value
的文本形式,易于理解。 -
灵活和易于扩展
灵活:各种请求方法、URL、头部字段都没有固定,开发人员可以自定义。
易于扩展:HTTP工作在应用层,它的下层可以随意变化,比如HTTPS就是在HTTP与TCP层之间增加SSL/TLS安全传输层。(注:TLS(传输层安全)是更为安全的升级版 SSL。由于 SSL 这一术语更为常用,因此我们仍然将我们的安全证书称作 SSL。)
-
应用广泛
应用领域:从简单的Web网页,各种浏览器或者APP等,处处都在用HTTP。
开发领域:不限定编程语言或者操作系统,具有跨语言,跨平台的优越性。
HTTP(1.1)的缺点有哪些?
-
缺点/优点:无状态
无状态的坏处:完成有关联性的操作时会很麻烦,比如用户从登录到下单支付的一系列操作,如果是无状态请求,用户的每一次操作都需要验证身份。
无状态的好处:不需要额外的资源记录状态信息,减轻服务器端压力。
-
缺点:不安全
- 通信使用明文,虽然方便阅读,但是内容可能被窃听。
- 不验证通信方的身份,有可能遭遇伪装。
- 无法验证报文完整性。
Cookie技术:
现在可以使用Cookie技术来解决HTTP无状态的问题。
第一次客户端发送没有Cookie的信息,服务器就生产一个Cookie,在响应中返回。第二次客户端发送的请求就会带上Cookie。服务器进行检查Cookie,确认身份,之后进行响应。
HTTP(1.1)的性能如何?
-
长连接
HTTP/1.1实现了长链接,不需要每次请求都重新建立和断开TCP连接。减轻了服务器端的压力。性能得到一个提升。
-
管线化网络传输
也就是同一个TCP连接中,发出一个HTTP请求,可以不用等待服务器做出响应,直接发送另一个请求。也是可以提高性能。
但是服务器必须按照接收请求的顺序发送对这些管道化请求的响应。
队头阻塞
如果某一个请求处理的耗时较长,就会出现队头阻塞。后面的所有请求都不能进行响应。HTTP/1.1只解决了请求的队头阻塞,没有解决响应的队头阻塞。
需要注意的是,HTTP/1.1的性能一般,HTTP/2 和 HTTP/3 就是在优化 HTTP 的性能。
HTTP与HTTPS
HTTP与HTTPS有哪些区别?
- 建立连接方面:
HTTP建立连接比较简单,只需要TCP三次握手后便可以进行进行HTTP报文传输;
HTTPS在经过TCP三次握手后,还需要进行SSL握手过程,才可以进行报文加密传输。 - 传输数据方面:
HTTP的传输是明文传输,存在安全问题。
HTTPS在TCP层和HTTP层之间加入了SSL安全协议,可以使报文加密传输。 - HTTPS协议需要申请CA证书,确保服务器的身份。
- 两者端口号也不同,HTTP是80,HTTPS是443。
HTTPS解决了HTTP的哪些问题?
-
保证了信息的机密性
HTTPS采用混合加密的方式实现信息的机密性。
使用非对称加密的方式来交换[会话密钥]。在通信过程中使用对称加密的形式来加密明文数据。这样做的原因?
-
对称加密共同使用一个密钥。运算速度快。但是必须确保密钥的保密性。
-
非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发,私钥保密,解决了密钥交换问题。但是速度比较慢。
-
-
保证传输内容不被修改
使用摘要算法计算出内容的哈希值,再使用数字签名算法(非对称加密),对哈希值进行加密。 -
身份验证
首先,服务器把自己的公钥登录到数字证书认证机构,由数字证书认证机构用自己的私钥,去签发公钥证书(CA证书)来确保公开密钥的真实性。
其次,客户端收到数字证书后,用CA的公钥来确认证书的真实性。最后客户端使用服务器的公钥进行进一步会话。