1. keep-alive的理解
Keep-Alive 是一种HTTP协议的机制,用于在单个TCP连接上保持持续的连接状态,而不是为每个HTTP请求和响应都建立和关闭一个新的TCP连接。这个机制的目的是减少网络通信的延迟,提高性能,并降低服务器的负担。
-
减少连接建立和关闭的开销:在传统的HTTP/1.0中,每次发送HTTP请求时都需要建立一个新的TCP连接,并在请求完成后立即关闭它。这样的连接开销包括三次握手和四次挥手等步骤,这些操作都需要时间和资源。Keep-Alive 允许多个HTTP请求和响应共享同一个TCP连接,从而避免了频繁的连接建立和关闭。
-
降低延迟:在使用 Keep-Alive 的情况下,如果客户端需要获取多个资源,它可以在同一个TCP连接上发送多个请求,而不必等待每个请求的连接建立。这减少了请求和响应之间的网络通信延迟,从而提高了网页加载速度。
-
服务器资源的重用:服务器可以重用已经建立的TCP连接,以便更高效地处理多个请求。这减轻了服务器的负担,因为服务器不必频繁地创建和销毁连接。
-
配置和控制:Keep-Alive 是一个可以配置的选项,服务器和客户端可以在HTTP头部中指定 Keep-Alive 的参数,如超时时间(连接保持的时间),最大请求数(一个连接可以处理的最大请求数)等。
-
HTTP/1.1 默认支持:HTTP/1.1协议默认支持 Keep-Alive,所以在现代浏览器和服务器之间,通常会自动启用 Keep-Alive 功能。
需要注意的是,Keep-Alive 并不是无限期的。它会在指定的超时时间内保持连接,一旦超时或达到最大请求数限制,连接将被关闭。这有助于释放不再需要的资源,避免资源浪费。
总之,Keep-Alive 是一种有助于减少HTTP请求延迟、提高性能、减轻服务器负担的机制,它通过保持单个TCP连接的持续状态,允许多个请求和响应在同一个连接上传输,从而提供更好的用户体验和更高效的网络通信。
2. HTTP2的头部压缩算法是怎样的
HTTP/2使用了一种名为HPACK的头部压缩算法来减小HTTP头部的大小,从而提高性能和降低延迟。HPACK是一种有损的压缩算法,它在客户端和服务器之间有效地压缩和解压头部信息,同时保持头部字段的语义。
以下是HPACK头部压缩算法的主要工作原理:
-
静态表(Static Table):HPACK定义了一个包含常见HTTP头部字段的静态表,这些字段具有固定的编码,不需要重复传输。客户端和服务器都可以引用静态表中的字段,而不必传输其名称和值。这减少了重复头部的传输。
-
动态表(Dynamic Table):HPACK还维护了一个动态表,用于存储请求和响应中动态生成的头部字段。客户端和服务器都可以将新字段添加到动态表中,并在后续的请求和响应中引用它们。这使得常用的头部字段可以在不断的请求和响应中被重复使用,而不必每次都传输完整的字段。
-
索引引用(Indexing References):HPACK允许客户端和服务器使用索引引用来引用静态表和动态表中的头部字段。例如,使用索引0表示引用静态表中的第一个字段,而使用索引1表示引用动态表中的第一个字段。这减少了传输头部字段的字节数。
-
编码和解码:在发送HTTP请求和响应时,客户端和服务器会对头部字段进行编码,将其映射到索引值。在接收时,它们可以根据索引值进行解码,以还原头部字段的原始名称和值。HPACK使用 Huffman 编码来进一步减小字段的大小,特别是对于长字符串和常见字符。
-
动态表管理:HPACK对动态表的大小进行了限制,如果表达到了最大大小,那么必须移除一些字段以腾出空间。这些字段可以根据优先级、最少使用等标准来选择。
3. HTTP请求报文的是什么样的
-
请求行(Request Line):请求行包括HTTP方法、请求的URI(Uniform Resource Identifier,统一资源标识符)和协议版本。通常的请求方法包括GET、POST、PUT、DELETE等。例如:
GET /index.html HTTP/1.1
-
请求头部(Request Headers):请求头部包含关于请求的元信息,如用户代理信息、接受的媒体类型、请求的主机名等。每个头部字段以键值对的形式表示,以冒号分隔,多个头部字段之间以换行符分隔。例如:
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-
空行(Blank Line):空行用于分隔请求头部和请求主体(如果有)。它实际上是一个只包含一个换行符的行,表示请求头部的结束。 -
请求主体(Request Body,可选):请求主体包含请求的实际数据,通常用于POST请求,例如表单数据或JSON数据。对于GET请求,请求主体通常为空。
以下是一个完整的HTTP请求报文示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
4. HTTP响应报文的是什么样的
-
状态行(Status Line):状态行包括HTTP协议版本、状态码和状态消息。状态码指示了请求的处理结果,例如200表示成功,404表示资源未找到,500表示服务器内部错误等。状态消息是对状态码的可选描述。例如:
HTTP/1.1 200 OK
-
响应头部(Response Headers):响应头部包含关于响应的元信息,如服务器信息、响应的内容类型、响应的日期等。每个头部字段以键值对的形式表示,以冒号分隔,多个头部字段之间以换行符分隔。例如:
Server: Apache/2.4.39 (Unix)
Content-Type: text/html; charset=UTF-8
Date: Tue, 07 Sep 2023 12:00:00 GMT
-
空行(Blank Line):空行用于分隔响应头部和响应主体(如果有)。它实际上是一个只包含一个换行符的行,表示响应头部的结束。 -
响应主体(Response Body,可选):响应主体包含了响应的实际内容,通常是HTML、文本、JSON、图像或其他数据。响应主体的内容取决于服务器的响应和客户端的请求。
以下是一个完整的HTTP响应报文示例:
HTTP/1.1 200 OK
Server: Apache/2.4.39 (Unix)
Content-Type: text/html; charset=UTF-8
Date: Tue, 07 Sep 2023 12:00:00 GMT
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
5. HTTP协议的优点和缺点
「HTTP的优点」:
-
简单和易于实现:HTTP的设计简单,易于理解和实现,这使得开发Web应用程序变得相对容易。HTTP的简洁性有助于快速开发和调试。
-
跨平台性:HTTP是与平台无关的协议,可以在不同的操作系统和设备上运行。这使得Web应用程序具有广泛的可用性。
-
广泛支持:几乎所有现代浏览器和服务器都支持HTTP协议,这使得它成为了构建互联网和Web应用程序的标准之一。
-
无状态性:HTTP是一种无状态协议,每个请求都是独立的,不依赖于之前的请求。这简化了服务器的设计和管理,使它们更容易扩展和负载均衡。
-
文本协议:HTTP协议使用文本进行通信,这使得它易于调试和分析。人们可以使用工具如浏览器的开发者工具或抓包工具来查看和修改HTTP请求和响应。
「HTTP的缺点」:
-
安全性问题:HTTP是明文传输协议,数据在传输过程中不加密,容易受到窃听和中间人攻击的威胁。为了提高安全性,通常需要使用HTTPS协议来加密数据传输。
-
性能问题:HTTP/1.1中存在队头堵塞问题,即一个请求的延迟可能会影响其他请求的响应速度。虽然HTTP/2解决了这个问题,但仍然可能存在性能方面的挑战,特别是在高负载和高并发情况下。
-
头部开销:HTTP头部中包含了大量的元数据,这会增加数据传输的大小,特别是对于小型请求和响应。HTTP/2引入了头部压缩来减小开销,但仍然存在一些开销。
-
状态管理问题:HTTP是一种无状态协议,因此需要使用Cookie或会话(Session)来管理用户状态。这会引入一些复杂性和潜在的安全问题。
-
单向通信:HTTP是一种单向通信协议,客户端向服务器发送请求,服务器返回响应。这对于实时或双向通信的应用程序来说可能不是最佳选择,需要使用其他协议如WebSocket
6. 说一下HTTP 3.0
HTTP/3(又称为HTTP 3.0)是HTTP协议的最新版本,旨在提高性能、安全性和可用性。它是以前版本HTTP/1.1和HTTP/2的演进,并引入了一些重要的变化。以下是HTTP/3的一些关键特点和变化:
-
基于QUIC协议:HTTP/3基于QUIC(Quick UDP Internet Connections)协议,而不是TCP。QUIC是一个多功能的传输协议,旨在提供更快的连接建立和更可靠的数据传输,它包含了UDP协议的一些特性,如0-RTT(零轮延迟)连接建立和自身的流量控制机制。
-
多路复用:HTTP/3仍然支持多路复用,允许多个请求和响应在一个连接上并行传输,以减小网络延迟,提高性能。
-
头部压缩:HTTP/3继续使用HPACK头部压缩算法,以减小请求和响应的头部大小,降低带宽占用。
-
连接迁移:HTTP/3支持连接迁移,这意味着当客户端从一个网络接口切换到另一个网络接口时,它可以保持连接的状态而无需重新建立连接。
-
实时性:HTTP/3支持实时性,特别适用于实时通信应用程序,如在线游戏、视频聊天和WebRTC。
-
更好的容错性:由于QUIC协议的特性,HTTP/3在面临网络切换和丢包等情况时表现更好,具有更好的容错性。
-
加密性:HTTP/3推动加密成为标准,几乎所有HTTP/3连接都使用TLS/SSL加密,提高了通信的安全性。
-
逐渐推广:HTTP/3的采用是逐渐的,它需要服务器和客户端都支持才能使用。但随着时间的推移,越来越多的网站和服务正在迁移到HTTP/3以提供更好的性能和用户体验。
7. HTTP协议连接模式
-
非持久连接(Non-Persistent Connection):在非持久连接模式下,每个HTTP请求都会建立一个新的TCP连接,然后发送请求并等待响应。一旦响应完成,连接会立即关闭。这意味着每个HTTP请求都需要进行三次握手和四次挥手的连接建立和关闭过程。
非持久连接的特点包括:
- 每个请求都有独立的连接,连接是临时的。
- 每次连接都需要建立和关闭,增加了网络开销和延迟。
- 适用于较小的网页,不需要多次请求多个资源的情况。
非持久连接的HTTP/1.0版本默认采用这种连接模式。
-
持久连接(Persistent Connection):在持久连接模式下,客户端和服务器之间的TCP连接可以被重复使用,多个HTTP请求和响应可以在同一个连接上进行。连接在请求和响应之间保持打开状态,直到满足某个条件才会关闭,如超过了最大请求数或达到了连接超时时间。
持久连接的特点包括:
- 多个HTTP请求可以共享同一个连接,减小了连接建立和关闭的开销。
- 减小了网络延迟,因为不必等待连接建立。
- 适用于需要请求多个资源或在一个网页上有多个嵌套请求的情况。
HTTP/1.1引入了持久连接作为默认连接模式,从而提高了性能和效率。此外,HTTP/2和HTTP/3进一步改进了持久连接模式,使用了多路复用和二进制分帧等技术,进一步提高了性能和资源利用率。
持久连接模式在现代Web应用程序中广泛使用,以减小网络延迟,提高性能,并降低服务器的负担。它有助于提高用户体验,特别是在大型和复杂的网页中,需要加载多个资源的情况下。
8. HTTP缓存模式
-
强缓存(Strong Caching):强缓存是指浏览器或客户端在发起HTTP请求之前检查本地缓存,如果缓存中有有效的响应,就不会发起请求,而是直接使用缓存的响应。这样可以减少网络流量和加快页面加载速度。
-
Expires 头部:服务器可以在响应中包含一个Expires头部字段,指定响应的过期时间。浏览器在本地缓存中存储响应,并在过期时间之前重用它。
-
Cache-Control 头部:HTTP/1.1引入了更灵活的Cache-Control头部字段,它可以包含多个指令,如max-age(指定响应在多少秒内过期)、no-cache(强制要求重新验证缓存)等。
-
协商缓存(Conditional Caching):协商缓存是指浏览器或客户端发起HTTP请求,但在请求中包含条件,如果服务器判断资源未发生变化,可以返回一个304未修改的响应,告知客户端继续使用缓存的响应。
-
If-Modified-Since 和 Last-Modified 头部:客户端可以使用If-Modified-Since头部字段将上次获得的Last-Modified响应头的值发送给服务器,服务器会检查资源的修改日期,如果没有变化,就返回304响应。
-
If-None-Match 和 ETag 头部:类似地,客户端可以使用If-None-Match头部字段将上次获得的ETag响应头的值发送给服务器,服务器会比较资源的ETag标识,如果匹配,就返回304响应。
-
离线缓存(Offline Caching):离线缓存是指浏览器或客户端在在线状态下获取资源后,将其存储在本地以便在离线状态下使用。HTML5引入了离线缓存技术,通过使用AppCache或Service Workers可以实现离线缓存。
-
AppCache:通过配置一个应用程序缓存清单文件,可以指定哪些资源在离线时可用。
-
Service Workers:Service Workers是一种脚本,它可以拦截和处理网络请求,从而实现高度定制化的离线缓存策略。
HTTP缓存模式有助于减少网络流量、提高页面加载速度和降低服务器负担。通过合理配置缓存策略,可以实现更好的性能和用户体验。但需要注意的是,缓存策略的配置需要权衡资源的更新频率和实时性,以确保用户获取到最新的内容。
10. http工作原理
-
建立连接:
-
客户端(通常是浏览器)向服务器发出HTTP请求。 -
服务器接受并处理请求。 -
如果请求的资源位于服务器上,服务器准备响应。 -
发送请求:
-
客户端构建HTTP请求报文,其中包括请求方法(如GET、POST、PUT等)、请求的资源路径(URL)、HTTP协议版本、请求头部(包含关于请求的元信息,如User-Agent、Accept等)、可选的请求主体(例如,POST请求中的表单数据)。 -
客户端将请求发送到服务器,通常通过TCP/IP连接。 -
服务器响应:
-
服务器接收到请求后,根据请求的内容和服务器上的资源,生成HTTP响应报文。 -
响应报文包括HTTP协议版本、状态码(指示请求是否成功)、响应头部(包含响应的元信息,如Content-Type、Content-Length等)和响应主体(包含实际的响应数据,如HTML页面、图像、文本等)。 -
服务器将响应报文发送回客户端,也通过TCP/IP连接传输。 -
接收响应:
-
客户端接收服务器的响应报文。 -
客户端解析响应报文,根据状态码确定请求是否成功。常见状态码包括200(成功)、404(未找到)、500(服务器内部错误)等。 -
客户端从响应中提取响应主体中的数据。 -
渲染页面:
-
如果响应是一个HTML页面,客户端会解析HTML并加载其中的资源(如CSS、JavaScript、图像等)。 -
浏览器将解析的内容呈现给用户,显示网页或执行相应的操作(例如,填写表单、点击链接等)。 -
关闭连接:
-
一旦请求和响应完成,客户端和服务器之间的TCP/IP连接可能会关闭,或者在HTTP/1.1中,可以选择保持连接以进行后续请求。
原文始发于微信公众号(前端大大大):前端面试之HTTP协议(二)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/174162.html