Http
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式、超媒体信息系统的应用层协议。它基于TCP/IP通信协议来传递数据,如HTML文件、图片文件等。以下是HTTP的详细解析:
一、HTTP的基本概述
- 定义:HTTP是一种用于从网络传输超文本到本地浏览器的传输协议,它定义了客户端与服务器之间请求和响应的格式。
- 版本:HTTP有多个版本,包括HTTP/1.0、HTTP/1.1、HTTP/2和HTTP/3。每个版本都在前一版本的基础上进行了改进和增强。
- 特点:HTTP是无连接的,即每次连接只处理一个请求,服务器处理完客户请求并收到客户的应答后,就断开连接;HTTP是无状态的,即HTTP协议对事务处理没有记忆能力;HTTP是媒体独立的,只要客户端和服务器知道如何处理数据内容,任何的数据内容都可以通过HTTP传送。
二、HTTP的工作流程
HTTP的工作流程通常包括以下几个步骤:
- 建立连接:客户端与服务器之间建立连接,这通常基于TCP/IP协议。在HTTP/2和HTTP/3中,则使用了更先进的传输层协议。
- 发送请求:客户端向服务器发送请求,请求中包含要访问的资源的URL、请求方法(如GET、POST、PUT、DELETE等)、请求头以及可选的请求体。
- 处理请求:服务器接收到请求后,根据请求中的信息找到相应的资源,执行相应的处理操作。
- 发送响应:服务器将处理后的结果封装在响应中,并将其发送回客户端。响应包含状态码、响应头以及可选的响应体。
- 关闭连接:在完成请求-响应周期后,客户端和服务器之间的连接可以被关闭,除非使用了持久连接(如HTTP/1.1中的keep-alive)。
三、HTTP的请求与响应
1. HTTP请求
HTTP请求由以下几个部分组成:
- 请求行:包含请求方法、请求的URL和HTTP协议版本。
- 请求头:包含请求的附加信息,如Accept、User-Agent、Connection等。
- 空行:用于分隔请求头和请求体。
- 请求体:可选的,对于POST或PUT请求,请求体中包含要发送给服务器的数据。
2. HTTP响应
HTTP响应也由以下几个部分组成:
- 状态行:包含HTTP协议版本、状态码和状态消息。状态码用于指示请求的成功或失败。
- 响应头:包含响应的附加信息,如Content-Type、Content-Length、Date等。
- 空行:用于分隔响应头和响应体。
- 响应体:可选的,包含服务器返回给客户端的数据,如HTML页面、图像数据等。
四、HTTP的请求方法
HTTP定义了一组请求方法,以表明要对给定资源执行的操作。常见的请求方法包括:
- GET:请求一个指定资源的表示形式。
- POST:将实体提交到指定的资源,通常会导致服务器上的状态变化或副作用。
- PUT:向服务器上传资源,通常用于更新已存在的资源或创建新的资源。
- DELETE:删除指定的资源。
- HEAD:请求一个与GET请求的响应相同的响应头,但没有响应体。
- OPTIONS:请求服务器返回支持的HTTP方法和其他选项。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。
- PATCH:用于对资源应用部分修改。
五、HTTP状态码
HTTP状态码由三个十进制数字组成,用于指示请求的成功或失败。常见的状态码类型包括:
- 1xx(信息性状态码):表示接收的请求正在处理。
- 2xx(成功状态码):表示请求正常处理完毕。
- 3xx(重定向状态码):需要后续操作才能完成这一请求。
- 4xx(客户端错误状态码):表示请求包含语法错误或无法完成。
- 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。
六、HTTPS与HTTP的区别
HTTPS(Hypertext Transfer Protocol Secure)是HTTP的安全版本,它在HTTP下增加了SSL/TLS协议,提供了数据加密、完整性校验和身份验证。HTTPS和HTTP的主要区别包括:
- 端口号:HTTP通常使用端口80,而HTTPS通常使用端口443。
- 安全性:HTTP是明文传输,而HTTPS是加密传输,更加安全。
- 性能:由于加密和解密过程,HTTPS可能会增加CPU的使用率和延迟,
Http1与HTTP2
http1.0与http1.1
- http1.0:每次请求都需要重新建立tcp连接,请求完后立即断开与服务器连接,这很大程度造成了性能上的缺陷,http1.0被抱怨最多的就是连接无法复用。
- http1.1:引入了长连接(keep-alive),相较于1.0减少了连接和关闭的延迟,提高了效率,但是若干个请求还是需要串行排队处理,如果一旦某个请求超时,后面的就会被阻塞,也就是常说的线头阻塞。
1. 传输格式
- HTTP1:使用文本格式(通常是ASCII)来传输数据。这种文本格式虽然方便调试,但解析起来可能不够高效,且可能因为编码问题导致解析错误。
- HTTP2:引入了二进制格式传输数据。二进制格式不仅解析起来更高效,而且更加健壮,减少了因编码问题导致的错误。
2. 连接管理
- HTTP1:在HTTP1.0中,每次请求都需要重新建立TCP连接,并在请求完成后立即断开连接。HTTP1.1虽然引入了长连接(keep-alive),但多个请求仍然需要串行排队处理,存在队头阻塞问题。
- HTTP2:通过引入流(stream)和帧(frame)的概念,实现了多路复用。这意味着一个TCP连接可以同时承载多个请求和响应,大大提高了连接的利用率和效率。此外,HTTP2还解决了HTTP1中的队头阻塞问题,因为多个请求和响应可以并行处理。
3. 首部压缩
- HTTP1:HTTP1.x的头部信息通常很大,且每次请求都会重复发送相同的头部信息,这浪费了带宽并增加了延迟。
- HTTP2:通过HPACK算法对头部进行压缩,通讯双方各自缓存一份header请求头表,避免了重复的header传输,并显著减少了需要传输的头部数据量。这不仅节省了带宽,还提高了传输效率。
4. 服务器推送
- HTTP1:不支持服务器主动推送资源。客户端需要明确请求所需的资源,然后服务器才会响应这些请求。
- HTTP2:支持服务器推送(server push)功能。当客户端请求某个资源时,服务器可以预测并主动推送与该资源相关的其他资源,而无需客户端再次发起请求。这可以减少延迟并提高页面加载速度。
5. 性能提升
- HTTP2:通过上述的改进(如二进制格式、多路复用、首部压缩和服务器推送),HTTP2在性能上有了显著提升。它不仅减少了延迟和带宽消耗,还提高了网页的加载速度和用户体验。
综上所述,HTTP2相比HTTP1在传输格式、连接管理、首部压缩、服务器推送和性能提升等方面都有显著的优势。这些优势使得HTTP2成为现代Web开发中不可或缺的一部分。在前端面试中,了解这些区别有助于更好地理解HTTP协议的发展趋势和前端性能优化的策略。
一次完整的HTTP请求所经历的步骤
1. URL输入与解析
- URL输入:用户在浏览器的地址栏中输入
www.baidu.com
并按下回车键。 - URL解析:浏览器检查输入的URL是否合法且完整。如果不完整,浏览器会尝试补全(虽然对于
www.baidu.com
这样的常见网址,通常不需要补全)。如果URL不合法,浏览器可能会将其作为搜索条件提交给默认搜索引擎。
2. DNS域名解析
- 查询本地缓存:浏览器首先检查其缓存和本地hosts文件中是否有该域名的IP地址记录。
- 查询本地DNS服务器:如果本地缓存中没有找到,浏览器会向配置的本地DNS服务器发起查询请求。
- 递归查询:如果本地DNS服务器也没有该域名的记录,它会向根DNS服务器发起查询,并逐步向下(顶级域DNS服务器、权威DNS服务器)直到找到对应的IP地址。
- 获取IP地址:最终,DNS查询会返回
www.baidu.com
对应的IP地址(例如,220.181.27.48
,但请注意IP地址可能会随时间变化)。
3. 建立TCP连接
- 三次握手:浏览器使用获得的IP地址和服务器默认的HTTP端口(通常是80端口,对于HTTPS则是443端口)进行TCP连接。TCP连接通过三次握手建立,确保双方通信的可靠性。
- 第一次握手:客户端发送SYN报文段到服务器,并进入SYN_SENT状态。
- 第二次握手:服务器收到SYN报文段后,发送SYN+ACK报文段给客户端,并进入SYN_RCVD状态。
- 第三次握手:客户端收到服务器的SYN+ACK报文段后,发送ACK报文段给服务器,然后进入ESTABLISHED状态,服务器收到ACK报文段后也进入ESTABLISHED状态,此时TCP连接建立成功。
4. 发送HTTP请求
- 构建HTTP请求报文:浏览器根据用户输入的URL和可能的查询参数等,构建HTTP请求报文。请求报文包括请求行(如
GET / HTTP/1.1
)、请求头(如Host: www.baidu.com
、User-Agent: ...
等)和请求体(对于GET请求,请求体通常为空)。 - 发送请求:浏览器通过TCP连接将HTTP请求报文发送给服务器。
5. 服务器处理请求并返回响应
- 处理请求:服务器收到HTTP请求后,根据其请求行和请求头等信息,处理请求并生成相应的响应数据。
- 构建HTTP响应报文:服务器构建HTTP响应报文,包括状态行(如
HTTP/1.1 200 OK
)、响应头(如Content-Type: text/html
等)和响应体(如HTML文档)。 - 发送响应:服务器通过TCP连接将HTTP响应报文发送给浏览器。
6. 浏览器解析渲染页面
- 解析HTML:浏览器接收到HTTP响应后,首先解析HTML文档,构建DOM树。
- 解析CSS:浏览器接着解析CSS样式表,构建CSSOM树。
- 构建渲染树:浏览器将DOM树和CSSOM树合并成渲染树。
- 渲染页面:浏览器根据渲染树将页面绘制到屏幕上。
7. 断开TCP连接
- 四次挥手:HTTP/1.1中,默认情况下会保持TCP连接(即使用长连接),以便在同一连接上发送多个请求和响应。然而,当不需要再发送请求时,TCP连接会通过四次挥手来优雅地关闭。
- 第一次挥手:客户端发送FIN报文段给服务器,并进入FIN_WAIT_1状态。
- 第二次挥手:服务器收到FIN报文段后,发送ACK报文段给客户端,并进入CLOSE_WAIT状态。客户端收到ACK报文段后进入FIN_WAIT_2状态。
- 第三次挥手:服务器完成所有数据传输后,发送FIN报文段给客户端,并进入LAST_ACK状态。
- 第四次挥手:客户端收到FIN报文段后,发送ACK报文段给服务器,并进入TIME_WAIT状态。服务器收到ACK报文段后关闭连接,客户端在经过一段时间(通常是2MSL,即最大报文生存时间)后也关闭连接。