【面试题】网络 http、https协议(第一篇)

1.简述HTTP协议

HTTP,全名超文本传输协议,是一个用于客户端与服务器之间进行数据传输的应用层协议,可以传输文本、图片、音视频等超文本内容。

1.HTTP使用TCP作为传输层协议,因此具有可靠性,

2.除此之外,HTTP简单灵活,应用广泛。

3.同时HTTP是一个无状态的协议,也就是说各个请求相互独立,不受干扰;

4.HTTP使用明文传输,不经过加密,因此有一定的安全隐患,可能有不法分子通过窃听盗取我们的私人信息。因此产生了HTTPS,是在HTTP基础上,在HTTP和TCP之间加入了一个SSL/TLS协议,保证了安全性。

5.HTTP还具有无连接性,每次请求和响应都需要建立新的连接,因此HTTP效率不高,但是可以通过长连接的机制来提高效率。

2.HTTP有哪些特点?

HTTP 超文本传输协议,用于实现服务器端和客户端的数据传输。它的特点是简单快速、无连接、无状态、可传递任意数据类型和一对一通讯。

简单快速:客户端向服务器端发送请求时,只需传递请求方法、路径和请求参数,因为协议简单,所以使得 HTTP 服务器的程序规模小,因而通信速度很快。

无连接:所谓的无连接指的是,每次连接只处理一个请求。服务器处理完客户的请求后,会立即断开连接。

无状态:HTTP 不会记录每次请求的身份信息,因此前一次请求和后一次请求相互"不认识"。

可传递任意数据类型:HTTP 允许传输任意数据类型,只需要在请求头中标识数据类型 Content-Type 即可。

一对一通讯:每次 HTTP 请求,都是一个客户端对应一个服务器端。

3.HTTP常见状态码

1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。

2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。

  • 200 OK 」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。

  • 204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。

  • 206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。

3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向

  • 301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。

  • 302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。

  • 304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。

4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。

  • 400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。

  • 403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。

  • 404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。

  • 500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。

  • 501 Not Implemented」表示客户端请求的功能还不支持,类似"即将开业,敬请期待"的意思。

  • 502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。

  • 503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似"网络服务正忙,请稍后重试"的意思。

4.HTTP请求的几种方式

  1. GET:GET方法用于从服务器获取指定资源 。它是一种幂等的、安全的和可缓存的 方法,不会对服务器端数据产生副作用。GET方法将请求参数附加在URL的查询字符串中 ,适用于获取数据的操作。

  2. POST:POST方法用于向服务器提交数据 ,通常用于创建新资源或提交表单数据 。POST方法不是幂等的 ,可能对服务器端数据产生副作用。POST方法将请求参数放在请求体中 ,适用于修改数据或执行特定操作的操作

  3. PUT:PUT方法用于向服务器更新指定资源 。它是幂等的 ,即多次执行相同的PUT操作不会产生副作用。PUT方法要求客户端发送完整的资源表示,用于替换服务器上的指定资源

  4. DELETE:DELETE方法用于删除服务器上的指定资源 。它是幂等的 ,即多次执行相同的DELETE操作不会产生副作用。DELETE方法用于删除资源 ,但是要谨慎使用,因为删除后无法恢复数据

  5. PATCH:PATCH方法用于局部更新服务器上的指定资源 。它类似于PUT方法,但只需要发送需要更新的部分数据 。PATCH方法用于更新资源的一部分,而不是整个资源

  6. HEAD:HEAD方法与GET方法类似,但只返回资源的头部信息,不返回实际的资源内容 。HEAD方法可用于获取资源的元数据或检查资源是否存在

  7. OPTIONS:OPTIONS方法用于获取服务器支持的请求方法和资源的通信选项。客户端可以通过发送OPTIONS请求来了解服务器的能力和约束。

  8. TRACE:TRACE方法用于回显服务器收到的请求,用于测试和调试 。服务器将接收到的请求内容原样返回给客户端,用于验证请求是否在传输中被修改

5.GET和POST区别

GETPOST 是 HTTP 协议中的两种主要方法(或称为"请求方法"),用于发送数据到服务器或从服务器获取数据。这两种方法在 Web 开发中特别常见,并且在使用 HTML 表单、API 调用等场景中被广泛使用。以下是它们之间的主要区别:

GET

  • 目的:从指定的资源请求数据。
  • 安全性:由于数据在 URL 中以查询字符串的形式传递,所以 GET 请求不适合传输敏感数据,因为它可能会被保存在浏览器历史、服务器日志等地方。
  • 幂等性:GET 请求是幂等的,即多次执行相同的 GET 请求不会导致服务器上的数据发生变化。
  • 缓存:GET 请求可以被缓存,这有助于减少网络流量并提高性能。
  • 数据长度:由于 URL 的长度限制,GET 请求可以携带的数据量有限(尽管现代浏览器和服务器对 URL 长度有更大的限制)。
  • 使用场景:常用于从服务器检索信息,如查询数据库记录、读取静态资源等。

POST

  • 目的:向指定的资源提交数据,请求服务器进行处理(例如,提交表单或上传文件)。
  • 安全性:POST 请求将数据放在请求体中,而不是 URL 中,因此比 GET 请求更适合传输敏感数据。但是,为了确保安全性,仍需要使用 HTTPS 协议来加密传输的数据。
  • 幂等性:POST 请求通常不是幂等的,因为每次提交数据都可能导致服务器上的数据发生变化。但是,某些实现可能会使 POST 请求具有幂等性,这取决于服务器的处理方式。
  • 缓存:POST 请求通常不会被缓存,因为它们包含的数据可能随时发生变化。
  • 数据长度:POST 请求可以携带的数据量比 GET 请求大得多,因为请求体的大小通常没有限制(尽管实际上可能会受到服务器配置的限制)。
  • 使用场景:常用于向服务器提交数据,如提交表单、上传文件、创建新资源等。

总结

  • 当需要从服务器检索信息时,使用 GET 请求。
  • 当需要向服务器提交数据或执行其他非幂等操作时,使用 POST 请求。
  • 在传输敏感数据时,务必使用 HTTPS 协议来加密数据。
  • 根据需要传输的数据量选择适当的请求方法。如果数据量较大,则使用 POST 请求;如果数据量较小且主要是检索信息,则使用 GET 请求。

6.HTTP的缓存技术

对于一些重复性的请求,可以把请求到的数据缓存到本地,这样下次请求时直接读取本地数据,不用再去访问网络服务器了,这样会让性能得到提升。缓存技术两种实现方式:强制缓存,协商缓存

  • 强制缓存

只要浏览器的缓存没有过期,就直接使用浏览器的本地缓存。

强制缓存通过Cache-control和Expires两个响应头字段控制的(cache-control优先级高)。过程如下:

当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 响应 头部加上 Cache-Control,Cache-Control 中设置了过期时间大小;

浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;

服务器再次收到请求后,会再次更新 响应 头部的 Cache-Control。

  • 协商缓存

通过和服务器协商之后,判断是否使用本地缓存。

两种实现方式:

1.基于时间:请求头的If-Modified-Since字段与响应头的 Last-Modified 字段 Last-Modified:资源最后修改时间。

当资源过期了,发现响应头中具有 Last-Modified 声明,则再次发起请求的时候带上 Last-Modified 的时间,服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比(Last-Modified),如果二者不同,说明资源又被改过,则返回最新资源,HTTP 200 OK;如果相同,说明资源无新修改,响应 HTTP 304 走缓存。

2.基于唯一标识:请求头的 If-None-Match 字段与响应头的 ETag 字段

当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器发起请求时,会将请求头 If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。

两种方式第二种更为可靠,时间可能会被篡改。因此,响应头中如果同时出现Last-modified和etag,优先使用etag。

协商缓存必须是在未命中强制缓存的情况下才会发生的,因为协商缓存需要基于强制缓存的cache-control字段判断资源是否过期。

7.HTTP为什么不安全

  1. 明文传输:HTTP协议是明文传输的,所有的请求和响应内容都是以明文的形式传输的,这使得攻击者可以轻易地截取、窃听和篡改通信内容。

  2. 缺乏数据完整性验证:由于HTTP协议缺乏数据完整性验证机制,攻击者可以修改传输的数据包,从而篡改数据内容,比如在响应中插入恶意代码。

  3. 缺乏身份验证:HTTP协议没有内置的身份验证机制,因此无法保证通信双方的身份真实性。这意味着攻击者可以冒充其他用户或服务器进行攻击。

  4. 缺乏加密保护:HTTP协议没有加密机制,因此无法对通信内容进行加密保护。这使得敏感信息(如用户名、密码等)在传输过程中容易被窃取。

8.HTTPS加密过程(TLS握手)

  1. 握手阶段:客户端向服务器发送一个请求连接的请求,并提供自己的加密能力和支持的加密算法列表。服务器选择一个与客户端能力匹配的加密算法,并返回自己的身份认证信息(证书)。

  2. 证书验证:客户端验证服务器提供的证书的有效性和合法性。这包括检查证书的颁发机构和过期时间等。如果验证通过,则建立信任关系。

  3. 密钥协商:客户端和服务器使用非对称加密算法进行密钥交换,以协商一个对称密钥,该对称密钥将用于后续的数据加密和解密。

  4. 数据传输:在握手阶段完成后,客户端和服务器使用协商好的对称密钥进行数据的加密和解密,确保数据的机密性和完整性。

首先它是先建立了一个TCP连接,也就是说经过一个三次握手,三次握手完了之后还要经历一次TLS/SSL握手。

1.Client Hello(发送客户端生成的随机数,当前的TLS版本和支持的加密套件)

比如说我们现在有一个客户端和一个服务端,然后我们这个客户端要先发起一个ClientHello,这个的话意思就是说我要发起一个HTTPS连接了,然后的话它会携带几个信息,首先第一个是一个客户端携带一个随机数,还有我要使用的密码套件,比如说他要使用的是 RSA 这样的技术,还是说DES这样的技术,还有一个是我当前要执行的一个TLS/SSL协议的一个版本号,比如说1.2这样的版本,然后他就把这个打包成一个包,然后发给这个服务端。

2.Server Hello(返回服务端生成的随机数,确认支持TLS版本号和加密套件)

服务端收到之后就会回复一个server hello,server hello主要是对于这个我们的客户端做一个就是做一个回应,就是说比如说我确认你的协议了,你的TLS/SSL协议是1.2,然后我服务端这边支持就把然后我就可以确认版本号,然后的话密码套件我这也有,所以话我们可以达成这个协议,否则的话就会终止本次的连接,之后还会加上一个这个服务端产生的随机数,然后接着的话就会把这个包返还给客户端。

接下来,在继续之后的握手步骤之前,客户端需要先验证一下证书,拿到证书中的公钥,也即服务端使用的公钥

Certificate(客户端验证证书)

服务端将证书发给客户端,客户端对证书进行验证,验证成功后客户端后续就可以使用服务端(证书中)提供的RSA公钥了

Server Key Exchange

服务端把公钥发送给客户端

Server Hello Done

表示服务器已经接受了客户端的hello消息,并且已经从中选择了一个密码套件(Cipher Suite),同时也向客户端发送了自己的hello消息,以及服务器使用的密码套件和其他的相关信息。这意味着服务器和客户端已经就双方协商使用的加密算法、密钥长度、认证方式等相关信息达成了一致,并且接下来的通信将在双方协商确定的密码套件的保护下进行。

3.Client Key Exchange

客户端会生成第三个随机数,也叫预主密钥,用收到的公钥进行加密,发送给服务器。服务端收到后,会用自己的私钥进行解密,得到预主密钥。只有客户端和服务端知道这个。客户端用预主密钥和第一第二随机数计算出会话密钥,服务器也是同样。二者得到的会话密钥是相同的。

4.Change Cipher Spec

告诉对方使用新的加密规范

5.Encrypted Handshake Message

双方同步之前协商的信息。

至此,TLS握手结束,握手阶段采用的是非对称加密,之后的数通信采用对称加密。

9.HTTP各个版本的特点

HTTP/1.0:

优点:

简单、兼容性好。

缺点:

  1. 不支持持久连接:客户端每次请求都需要和服务器建立新的TCP连接,完成之后断开连接。

  2. 队头阻塞:下个请求必须在上个请求响应到达后发送。如果上个请求响应丢失,则后面请求被阻塞

  3. 安全性差,没有加密措施。

HTTP/1.1:

优点:

  1. 引入了缓存机制,通过Cache-Control等响应头控制缓存策略(强制缓存和协商缓存)。

  2. 支持持久连接(keep-alive),即在一个TCP连接上处理多个请求和响应。

  3. 支持管道化请求,可以同时发送多个请求。但是响应的顺序必须和请求的顺序相同。(可以解决请求部分的队头阻塞)

缺点:

仍然无法解决队头阻塞问题

HTTP/2.0:

优点:

  1. 采用二进制格式传输,而非HTTP/1.x的文本协议,减少了数据传输的大小和延迟。

  2. 多路复用。在同一个TCP连接上可以有多个请求和响应,解决了HTTP的队头阻塞的问题。

  3. 支持请求的优先级控制:可以更好地管理多个请求。

  4. 头部压缩。HTTP/2使用HPACK算法来压缩头部信息,减少了数据传输的大小。

  5. 服务端推送。服务器可以在客户端请求一段资源时,主动推送其他相关资源,提高页面加载速度。

  6. 基于TLS(Transport Layer Security)加密传输,提高了数据传输的安全性。

缺点:

1.在TCP层面存在队头阻塞问题:TCP保证数据的完整性,当前面的某个数据没到达时,后续收到的所有数据只能存放在内核的缓冲区中,只有当数据全部到达才会发送给HTTP。当 TCP 丢包时,整个 TCP 都要等待重传,那么就会阻塞该 TCP 连接中的所有请求。

2.TCP握手和TLS握手

TLS和TCP是分层的,需要分批次进行握手,先TCP握手再TLS握手。时间较长。

3.网络迁移会导致重新连接

如果IP或者端口号发生了变化,会导致TCP与TLS重新握手,如果网络变化比较频繁,会导致效率很低。

HTTP/3.0:

  1. 基于UDP协议。与HTTP/1.x和HTTP/2使用TCP不同,HTTP/3使用UDP协议,同时在应用层使用了QUIC协议提高了连接的可靠性。QUIC连接上的多个流之间没有依赖,当某个流发生丢包时,只阻塞这个流,其他流不会受到影响,不存在队头阻塞问题。

  2. 更快的连接建立。QUIC协议内部包含了TLS1.3,握手只需要1个RTT就能完成建立连接与TLS密钥协商;如果之前有连接过,那么在第二次连接的时候,数据可以和QUIC的握手信息一起发送,达到0-RTT的效果。

  3. 连接迁移:通过连接ID来标识通信的双方,即使网络IP发生变化,可以根据连接ID和TLS密钥等来找到原来的连接,避免重连。

10.HTTP首部常见字段

1.请求头:

  • Host:指定目标服务器的主机名或IP地址。

  • User-Agent:标识发起请求的用户代理(通常是浏览器)的信息。

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

  • Content-Type:指定请求中的实体正文的媒体类型。

  • Content-Length:指定请求中的实体正文的长度。

  • Cookie:包含由服务器发送的Cookie信息,用于跟踪用户状态。

  • Authorization:用于进行身份验证的凭证,常用于发送用户凭证给服务器。

  • Referer:指定当前请求的来源页面 URL

2.响应头:

  • Content-Type:指定响应中的实体正文的媒体类型。

  • Content-Length:指定响应中的实体正文的长度。

  • Set-Cookie:在响应中设置新的 Cookie。

  • Location:用于重定向,指定新的请求目标位置。

  • Cache-Control:控制缓存行为,指定是否可以缓存响应以及缓存有效期等。

  • Server:指示服务器的软件信息。

11.cookie和session作用

Cookie和Session是用于在Web应用中跟踪用户状态和存储用户信息的机制。

1.cookie是服务器通过HTTP在客户端存储的小型文本文件,由服务器发送给浏览器,然后浏览器保存在本地,每次浏览器向服务器发送请求时,都会自动将响应的cookie添加到请求头中发送给服务器。

特点:

  • 存储在客户端,能长期保存在浏览器本地硬盘中,也可以设置过期时间,使其在一定时间后失效。

  • 可以存储少量数据,通常用来标识用户、记录用户偏好设置等。

  • 可以跨页面和域名

  • 可以被客户端篡改或禁用

2.session是服务器端用于存储用户信息的一种机制,当用户第一次访问服务器时,服务器会为改用户创建一个唯一的会话ID,并将该ID返回给客户端进行保存。之后,客户端每次请求都会带上这个会话ID,服务器根据会话ID来识别并获取用户的相关信息。

特点:

  • session信息存储在服务端

  • 可以存储大量数据,灵活性高

  • 存储时间依赖于会话超时设置或手动删除

  • 需要服务器对session进行管理

12.cookie和session区别

  • 存储位置:Cookie存储在客户端,而Session存储在服务器端。

  • 存储内容和大小:Cookie通常用于存储少量数据,而Session可以存储大量数据。

  • 安全性:由于Cookie存储在客户端,因此存在被篡改的风险;而Session存储在服务器端,相对更安全。

  • 跨页面/跨域:Cookie可以跨页面和跨域使用,而Session在同一域名下可以跨页面使用,但无法跨域。

  • 可见性:Cookie可以设置为可见或不可见,可以通过浏览器开发者工具查看;而Session对客户端是不可见的。

通常,Cookie用于存储轻量级的用户状态和偏好设置,而Session用于存储较重量级的用户信息和会话状态。它们经常一起使用,通过会话ID和Cookie进行数据传递和用户身份验证。

13.键入网址到网页显示,期间发生了什么?

  1. 首先是域名解析,由DNS协议完成。
  • 浏览器提取URL中的域名部分

  • 浏览器向本地DNS缓存中进行查询,如果有该域名对应的IP,则直接使用。

  • 如果没有,浏览器会向操作系统发起DNS查询请求,向操作系统中的hosts文件中查找。如果找到,则使用;

  • 如果没有,则向DNS服务器发起查询请求。DNS服务器按照递归查询的过程向根域名服务器、顶级域名服务器和权威域名服务器依次查询,最终返回对应的IP地址。

  • 操作系统将IP地址返回给浏览器,并将其缓存到本地的DNS缓存中,以便下次使用。

  1. 然后浏览器建立TCP连接,客户端与服务器通过三次握手建立TCP连接;

  2. 浏览器请求某个资源之前,先检查本地是否有缓存,如果缓存命中且可用,则直接从缓存中获取响应,无需向服务器发送请求;如果未命中,则向服务器发送http请求。这个请求可以携带缓存控制字段,比如If-None-Match、If-Modified-Since两个协商缓存的字段。

  3. 服务器对客户端发来的http请求进行处理,并返回响应。响应头中可能包括Cache-Control和ETag等缓存控制字段。

  4. 浏览器接收到http响应,根据响应头中的字段决定是否缓存,并把响应内容解析,渲染页面,显示在浏览器窗口中。

相关推荐
方方怪14 分钟前
与IP网络规划相关的知识点
服务器·网络·tcp/ip
weixin_442643421 小时前
推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
服务器·网络·安全·filelink数据摆渡系统
阑梦清川1 小时前
JavaEE初阶---网络原理(五)---HTTP协议
网络·http·java-ee
阿尔帕兹2 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
FeelTouch Labs2 小时前
Netty实现WebSocket Server是否开启压缩深度分析
网络·websocket·网络协议
千天夜4 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
长弓三石4 小时前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙
xianwu5434 小时前
反向代理模块
linux·开发语言·网络·git
follycat5 小时前
[极客大挑战 2019]HTTP 1
网络·网络协议·http·网络安全
earthzhang20215 小时前
《深入浅出HTTPS》读书笔记(5):随机数
网络协议·http·https