1.HTTP 是什么
HTTP(超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是Web的基础通信协议,定义了客户端(用户的Web浏览器)和服务器之间的通信规则。HTTP是一个无状态协议,意味着服务器不保持任何两个请求之间的数据状态。
- HTTP协议是用于从服务器传输超文本到本地浏览器的传送协议。
- HTTP基于TCP/IP通信协议进行传送输数据(HTML文件、图片文件、查询结果等)。
- HTTP是一个属于应用层的面向对象的协议。
- HTTP协议工作于客户端-服务器架构之上。浏览器作为HTTP客户端通过URL向HTTP服务器端即WEB服务器发送请求。WEB服务器根据接收到的请求,向客户端发送响应消息
HTTP的主要特点包括:
-
客户端-服务器模型:HTTP采用请求-响应模式,在客户端和服务器之间传输HTML页面、图片、视频和其他数据。
-
无状态:HTTP自身不保存之前的交互状态,每次请求都是独立的。然而,现代的Web应用通常使用cookies来维护状态。
-
可扩展性:HTTP允许传输任何类型的数据,只要发送方和接收方知道如何处理这些数据。
-
简单性:HTTP协议简单易用。
-
灵活性:HTTP允许传输任何类型的数据对象,只需在头部信息中包含正确的MIME类型。
HTTP工作过程中的关键概念:
- URL(统一资源定位符):用于定位互联网上的资源。
- 方法:如GET(获取资源)、POST(提交数据)、PUT(上传文件)等。
- 状态码:响应中的数字代码,如200(成功)、404(未找到)、500(服务器错误)等,用于表示请求的结果。
- 请求和响应消息:包含开始行、头部字段和可选的消息体。
随着时间的推移,HTTP被不断更新和改进。例如,HTTP/2引入了新的性能优化机制,如服务器推送、头部压缩和请求/响应多路复用。而HTTP/3则是基于QUIC协议,进一步改善了性能,特别是在移动网络和高延迟环境下。
2.HTTP 常⻅的状态码有哪些?
-
1xx (信息性状态码):表示接收的请求正在处理。
- 例:
100 Continue
,客户端应继续其请求。
- 例:
-
2xx (成功状态码):表示请求正常处理完毕。
200 OK
:请求成功,服务器返回所请求的资源。204 No Content
:请求成功但没有内容需返回。206 Partial Content
:服务器已经成功处理了部分GET请求。
-
3xx (重定向状态码):要完成请求,需要进一步操作。
301 Moved Permanently
:请求的资源已永久移动到新位置。302 Found
:请求的资源现在临时从不同的URI响应请求。304 Not Modified
:自从上次请求后,请求的资源未修改过。
-
4xx (客户端错误状态码):表示客户端看起来可能发生了错误,妨碍了服务器的处理。
400 Bad Request
:服务器不理解请求的语法。403 Forbidden
:服务器拒绝请求。404 Not Found
:服务器找不到请求的资源。
-
5xx (服务器错误状态码):表示服务器在尝试处理请求时发生了错误。
500 Internal Server Error
:服务器遇到了不知道如何处理的情况。501 Not Implemented
:服务器不支持请求的功能,无法完成请求。502 Bad Gateway
:作为网关或代理的服务器从上游服务器收到无效响应。503 Service Unavailable
:服务器目前无法使用(由于超载或停机维护)。
3.GET 和 POST 有什么区别?
-
用途:
GET
方法通常用于请求服务器发送资源。它的目的是获取信息。例如,当你在浏览器中点击一个链接或输入网址时,浏览器通常会执行一个GET
请求来获取页面内容。POST
方法通常用于向服务器提交要被处理的数据。比如,当你填写表单提交时,通常会使用POST
请求将表单数据发送到服务器。
-
数据传输:
- 在
GET
请求中,数据会附加在URL中,通常是以查询字符串的形式出现(?key=value
)。这意味着任何发送的数据都会显示在URL中。 POST
请求则将数据包含在请求体中,不会显示在URL上。这对于需要传输敏感信息(如密码)的情况更为安全。
- 在
-
数据大小:
- 因为
GET
请求的数据附加在URL中,所以它的数据大小受到URL长度限制(不同的浏览器和服务器对此有不同的限制)。 POST
请求传输的数据则在请求体中,理论上没有大小限制,因此可以传输更大量的数据。
- 因为
-
数据类型:
GET
请求通常只发送ASCII字符,限制了它的使用场景。POST
请求没有限制,它可以发送二进制数据,因此可以用来上传文件到服务器。
-
缓存和历史:
GET
请求可以被缓存,可以保留在浏览器历史中,也可以被书签。POST
请求不会被缓存,不会保留在浏览器历史中,通常无法被书签。
-
幂等性:
GET
请求应该是幂等的,这意味着多次执行相同的GET
请求应该获得相同的结果,而不会改变资源的状态。POST
请求不是幂等的,因为每次请求都可能改变服务器上的状态,例如每次请求都会在数据库中创建一条新记录。
-
安全性:
并不是get请求在url中显示就证明post安全性比get高因为,抓包轻而易举抓到post请求内容。
4.GET 和 POST ⽅法都是安全和幂等的吗?
在HTTP协议中,“安全” 和 “幂等” 的概念是根据请求方法的预期效果来定义的。
-
安全方法:
- 安全的HTTP方法不应该在服务器上引起任何状态变化。这就意味着这些操作是只读的,不会修改资源。
GET
方法是一个典型的安全方法,因为它被设计用来获取资源,而不是修改、添加或删除资源。
- 安全的HTTP方法不应该在服务器上引起任何状态变化。这就意味着这些操作是只读的,不会修改资源。
-
幂等方法:
- 幂等的HTTP方法意味着多次执行同一操作的效果与执行一次的效果相同,不会因为多次执行而产生不同的副作用。
GET
方法是幂等的,因为多次获取资源不会改变资源本身。其他的幂等方法包括PUT
和DELETE
(在理想的情况下,因为多次删除同一个资源的效果是相同的,即资源保持被删除状态)。
- 幂等的HTTP方法意味着多次执行同一操作的效果与执行一次的效果相同,不会因为多次执行而产生不同的副作用。
POST
方法通常不是幂等的,因为它用来提交数据,每提交一次都可能在服务器上创建新的资源或触发新的动作。因此,重复的POST
请求可能会有不同的副作用,例如在数据库中创建多个相同的条目。
总结一下:
GET
是安全且幂等的。POST
既不是安全的,也不是幂等的。
在设计RESTful API时,理解和遵守这些原则非常重要,以确保应用程序行为符合开发者和用户的预期。此外,正确使用HTTP方法对于API的可用性、可靠性和可维护性都至关重要。
5.HTTP 缓存有哪些实现⽅式?
HTTP缓存是提高网络应用性能的关键技术之一。它能够减少服务器的负载,降低延迟,提升用户体验。HTTP缓存可以通过以下两种主要方式实现:
-
强制缓存 (也称为 “强缓存” 或 “本地缓存”):
- 当客户端发起请求时,会首先检查本地缓存中是否存在请求结果,并检查其有效性。如果缓存的副本仍然有效(未过期),客户端会直接使用这个副本,而不是向服务器发送请求。
- 控制强制缓存的HTTP头包括
Cache-Control
的max-age
指令,它定义了资源被认为是新鲜的最长时间。 - 另一个相关的HTTP头是
Expires
,它提供了资源过期的具体日期和时间。但是,由于Cache-Control
的出现,Expires
已经不再是控制缓存新鲜度的主要方式。
-
协商缓存 (也称为 “对比缓存”):
- 如果强制缓存失效,客户端将向服务器发送一个条件请求,询问自缓存副本以来服务器上的资源是否被更新。
- 控制协商缓存的HTTP头包括
Last-Modified
和ETag
。Last-Modified
响应头表示资源最后修改的时间,客户端会在后续的请求中通过If-Modified-Since
请求头发送这个值,服务器会比较这个日期和资源的当前修改日期,如果资源没有更新,就返回304 Not Modified状态码,客户端随后使用缓存的资源。 ETag
响应头提供了资源的一个唯一标识(通常是一个散列值),客户端使用If-None-Match
请求头发送ETag
值,服务器会检查这个标识符是否变化,来决定资源是否更新。
为了最有效地使用HTTP缓存,服务器需要正确设置这些HTTP头,以告知客户端何时可以存储响应以及可以存储多久。客户端(如浏览器)也需要实现相应的缓存策略以遵守服务器提供的这些指示。
通过精心设计的缓存策略,我们可以确保用户在大多数情况下快速加载页面,同时仍然能够获取最新的数据当它们在服务器上更新时。这不仅提升了用户体验,还减少了不必要的数据传输,从而节省了带宽和服务器资源。
6.HTTP/1.1 的缺点有哪些?
-
头部冗余:
- HTTP/1.1每个请求都需要发送完整的头部信息,即使多个请求之间的头部信息大部分是相同的。这增加了不必要的网络负担。
-
TCP连接限制:
- 在HTTP/1.1中,虽然支持持久连接,但浏览器对同一域名的并发连接数仍有限制。这意味着在加载大量资源的页面时可能会出现阻塞。
-
队头阻塞 (Head-of-Line Blocking, HOL blocking):
- 即使HTTP/1.1支持管道化,但在实际应用中受到限制,因为响应必须按请求发送的顺序返回。如果一个请求需要较长时间,则后续请求即使已经准备好也必须等待,这就是队头阻塞。
-
非优化的连接利用:
- HTTP/1.1的持久连接虽然减少了建立连接的开销,但是每个连接同时只能处理一个请求。这意味着并行请求需要多个连接,而创建和维护多个连接又会增加资源消耗和延迟。
-
不支持请求优先级:
- HTTP/1.1不支持原生的请求优先级设定。在加载一个资源密集型的页面时,开发者不能指定某些资源(如CSS/JS文件)比其他资源(如图片)有更高的优先级。
-
不支持服务器推送:
- HTTP/1.1不支持服务器向客户端主动发送额外资源的能力,这可能会导致额外的往返延迟,因为客户端需要明确请求每一个资源。
7.HTTP和HTTPS的区别
HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是在互联网上进行数据传输的两种协议。虽然它们的基本功能相同,即传输超文本数据,但它们在安全性方面存在显著差异。以下是HTTP和HTTPS之间的一些主要区别:
-
加密:
- HTTP:不提供数据加密。传输的数据可以被任何能够监听网络传输路径上的节点所读取。
- HTTPS:通过使用SSL/TLS协议为传输的数据提供加密,这能够保护数据在互联网上传输过程中的隐私和完整性,使其对中间人攻击变得更加安全。
-
端口:
- HTTP:通常运行在80端口。
- HTTPS:通常运行在443端口。
-
性能:
- HTTP:因为不需要进行加密,所以在处理速度上会稍快一些。
- HTTPS:加密和解密数据需要消耗更多的服务器资源,可能会稍微降低性能。然而,随着计算能力的提升和优化,这个性能差异已经变得越来越小。
-
安全性:
- HTTP:由于不提供加密服务,所以安全性较低。用户数据可能会被窃取,容易受到中间人攻击。
- HTTPS:提供了很强的安全保障,可以有效避免中间人攻击,保护数据不被窃取或篡改。
-
URL格式:
- HTTP:URL以
http://
开头。 - HTTPS:URL以
https://
开头。
- HTTP:URL以
-
SSL/TLS证书:
- HTTP:不需要使用SSL/TLS证书。
- HTTPS:需要购买、安装和定期更新SSL/TLS证书,以确保连接的安全性。
-
搜索引擎优化(SEO):
- HTTP:对于搜索引擎优化没有直接的好处。
- HTTPS:被认为是一个积极的排名信号,在搜索结果中可能得到更好的排名。
-
信任度:
- HTTP:由于没有加密,用户可能不信任向HTTP网站提交敏感信息。
- HTTPS:显示锁标志或绿色地址栏,提高用户对网站的信任度。
8 .HTTP/1.1、HTTP/2、HTTP/3 演变
HTTP(超文本传输协议)是一个用于传输超文本文档(例如HTML)的应用层协议。自从1991年HTTP/0.9首次提出以来,HTTP已经经历了几个重要的版本更新,以适应互联网技术的发展和性能需求的提高。
HTTP/1.1
HTTP/1.1 是在1997年推出的标准,它引入了许多改进,以优化HTTP的性能,并解决HTTP/1.0中存在的问题:
- 持久连接(Persistent Connections):减少了建立连接的频繁性,允许多个请求/响应在单个连接中完成。
- 管道化(Pipelining):允许在前一个请求完成之前发送下一个请求,以减少延迟。
- 分块传输编码(Chunked Transfer Encoding):允许发送不事先知道内容长度的动态生成的数据。
- 缓存控制(Cache Control):更精细的缓存机制,包括验证和重新验证缓存数据。
- 更多的请求方法和头部字段,提供更灵活的交互方式。
虽然HTTP/1.1取得了显著的进步,但它仍然存在一些性能问题,如队头阻塞(Head-of-Line Blocking,HOL blocking)。
HTTP/2
HTTP/2 在2015年被标准化,旨在解决HTTP/1.1的性能限制,并提供更快的页面加载时间:
- 多路复用(Multiplexing):在单个连接中并发交换多个请求和响应,减少了延迟。
- 二进制帧层(Binary Framing Layer):HTTP/2引入了一个新的编码机制,该机制将所有传输的信息分割成更小的消息和帧,并对它们进行二进制编码。
- 服务器推送(Server Push):允许服务器主动发送额外的资源,不需要客户端明确请求。
- 首部压缩(Header Compression):使用HPACK算法减少头部大小,降低开销。
- 请求优先级(Request Prioritization):指导服务器处理请求的顺序,以更有效地利用资源。
HTTP/2的这些改进显著提高了网页的加载速度和效率。
HTTP/3
HTTP/3 是最新的HTTP版本,它不是基于TCP,而是基于QUIC协议,一个新的基于UDP的传输层协议:
- QUIC协议:QUIC整合了TLS加密和连接迁移的能力,减少了连接和传输延迟。
- 改善的队头阻塞避免:由于QUIC是基于UDP的,每个流都是独立的,即使某个数据包丢失,也不会影响其他数据流。
- 快速握手:QUIC减少了握手的次数,使得加密连接的建立更快。
- 内置加密:QUIC自身提供了加密手段,不依赖于TLS/SSL层。
HTTP/3旨在解决HTTP/2在某些网络条件下(如移动网络和高延迟网络)仍然存在的问题,比如对头阻塞。