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请求的几种方式
GET:GET方法用于从服务器获取指定资源。它是一种幂等的、安全的和可缓存的方法,不会对服务器端数据产生副作用。GET方法将请求参数附加在URL的查询字符串中,适用于获取数据的操作。
POST:POST方法用于向服务器提交数据,通常用于创建新资源或提交表单数据。POST方法不是幂等的,可能对服务器端数据产生副作用。POST方法将请求参数放在请求体中,适用于修改数据或执行特定操作的操作。
PUT:PUT方法用于向服务器更新指定资源。它是幂等的,即多次执行相同的PUT操作不会产生副作用。PUT方法要求客户端发送完整的资源表示,用于替换服务器上的指定资源。
DELETE:DELETE方法用于删除服务器上的指定资源。它是幂等的,即多次执行相同的DELETE操作不会产生副作用。DELETE方法用于删除资源,但是要谨慎使用,因为删除后无法恢复数据。
PATCH:PATCH方法用于局部更新服务器上的指定资源。它类似于PUT方法,但只需要发送需要更新的部分数据。PATCH方法用于更新资源的一部分,而不是整个资源。
HEAD:HEAD方法与GET方法类似,但只返回资源的头部信息,不返回实际的资源内容。HEAD方法可用于获取资源的元数据或检查资源是否存在。
OPTIONS:OPTIONS方法用于获取服务器支持的请求方法和资源的通信选项。客户端可以通过发送OPTIONS请求来了解服务器的能力和约束。
TRACE:TRACE方法用于回显服务器收到的请求,用于测试和调试。服务器将接收到的请求内容原样返回给客户端,用于验证请求是否在传输中被修改。
5.GET和POST区别
GET
和 POST
是 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为什么不安全
明文传输:HTTP协议是明文传输的,所有的请求和响应内容都是以明文的形式传输的,这使得攻击者可以轻易地截取、窃听和篡改通信内容。
缺乏数据完整性验证:由于HTTP协议缺乏数据完整性验证机制,攻击者可以修改传输的数据包,从而篡改数据内容,比如在响应中插入恶意代码。
缺乏身份验证:HTTP协议没有内置的身份验证机制,因此无法保证通信双方的身份真实性。这意味着攻击者可以冒充其他用户或服务器进行攻击。
缺乏加密保护:HTTP协议没有加密机制,因此无法对通信内容进行加密保护。这使得敏感信息(如用户名、密码等)在传输过程中容易被窃取。
8.HTTPS加密过程(TLS握手)
握手阶段:客户端向服务器发送一个请求连接的请求,并提供自己的加密能力和支持的加密算法列表。服务器选择一个与客户端能力匹配的加密算法,并返回自己的身份认证信息(证书)。
证书验证:客户端验证服务器提供的证书的有效性和合法性。这包括检查证书的颁发机构和过期时间等。如果验证通过,则建立信任关系。
密钥协商:客户端和服务器使用非对称加密算法进行密钥交换,以协商一个对称密钥,该对称密钥将用于后续的数据加密和解密。
数据传输:在握手阶段完成后,客户端和服务器使用协商好的对称密钥进行数据的加密和解密,确保数据的机密性和完整性。
首先它是先建立了一个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:
优点:
简单、兼容性好。
缺点:
不支持持久连接:客户端每次请求都需要和服务器建立新的TCP连接,完成之后断开连接。
队头阻塞:下个请求必须在上个请求响应到达后发送。如果上个请求响应丢失,则后面请求被阻塞。
安全性差,没有加密措施。
HTTP/1.1:
优点:
引入了缓存机制,通过Cache-Control等响应头控制缓存策略(强制缓存和协商缓存)。
支持持久连接(keep-alive),即在一个TCP连接上处理多个请求和响应。
支持管道化请求,可以同时发送多个请求。但是响应的顺序必须和请求的顺序相同。(可以解决请求部分的队头阻塞)
缺点:
仍然无法解决队头阻塞问题
HTTP/2.0:
优点:
采用二进制格式传输,而非HTTP/1.x的文本协议,减少了数据传输的大小和延迟。
多路复用。在同一个TCP连接上可以有多个请求和响应,解决了HTTP的队头阻塞的问题。
支持请求的优先级控制:可以更好地管理多个请求。
头部压缩。HTTP/2使用HPACK算法来压缩头部信息,减少了数据传输的大小。
服务端推送。服务器可以在客户端请求一段资源时,主动推送其他相关资源,提高页面加载速度。
基于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:
基于UDP协议。与HTTP/1.x和HTTP/2使用TCP不同,HTTP/3使用UDP协议,同时在应用层使用了QUIC协议提高了连接的可靠性。QUIC连接上的多个流之间没有依赖,当某个流发生丢包时,只阻塞这个流,其他流不会受到影响,不存在队头阻塞问题。
更快的连接建立。QUIC协议内部包含了TLS1.3,握手只需要1个RTT就能完成建立连接与TLS密钥协商;如果之前有连接过,那么在第二次连接的时候,数据可以和QUIC的握手信息一起发送,达到0-RTT的效果。
连接迁移:通过连接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.键入网址到网页显示,期间发生了什么?
首先是域名解析,由DNS协议完成。
浏览器提取URL中的域名部分
浏览器向本地DNS缓存中进行查询,如果有该域名对应的IP,则直接使用。
如果没有,浏览器会向操作系统发起DNS查询请求,向操作系统中的hosts文件中查找。如果找到,则使用;
如果没有,则向DNS服务器发起查询请求。DNS服务器按照递归查询的过程向根域名服务器、顶级域名服务器和权威域名服务器依次查询,最终返回对应的IP地址。
操作系统将IP地址返回给浏览器,并将其缓存到本地的DNS缓存中,以便下次使用。
然后浏览器建立TCP连接,客户端与服务器通过三次握手建立TCP连接;
浏览器请求某个资源之前,先检查本地是否有缓存,如果缓存命中且可用,则直接从缓存中获取响应,无需向服务器发送请求;如果未命中,则向服务器发送http请求。这个请求可以携带缓存控制字段,比如If-None-Match、If-Modified-Since两个协商缓存的字段。
服务器对客户端发来的http请求进行处理,并返回响应。响应头中可能包括Cache-Control和ETag等缓存控制字段。
浏览器接收到http响应,根据响应头中的字段决定是否缓存,并把响应内容解析,渲染页面,显示在浏览器窗口中。