HTTP详解
# HTTP详解
# 一、简介
HTTP是超文本传输协议,是用于在计算机之间传输数据的应用层协议。
# 二、发展
HTTP协议从诞生至今已经经历了多个版本的演变,以下是各个版本的主要区别:
# 2.1、HTTP/0.9
这个版本的协议非常简单,请求和响应只包含数据本身,没有头信息和其他元数据。
# 2.2、HTTP/1.0
引入了请求头和响应头,允许传输多种数据格式。HTTP/1.0每次请求和响应都需要单独建立TCP连接,效率较低。
请求和响应都是由三部分组成:起始行、首部和实体。
# 2.3、HTTP/1.1
为了解决HTTP/1.0的效率问题,引入了持久连接,即同一个TCP连接可以用于多次请求和响应。同时还引入了管道机制,允许多个请求并发发送和响应。这个版本的协议还引入了新的请求方法和状态码,支持压缩和分块传输编码,可以提高传输效率。
# 2.4、HTTP/2
二进制传输
http2.0将请求和响应数据分割为更小的帧,并且它们采用二进制编码(http1.0基于文本格式)。多个帧之间可以乱序发送,根据帧首部的流表示可以重新组装。
Header压缩
Http2.0开发了专门的“HPACK”算法,大大压缩了Header信息
多路复用
http2.0中引入了多路复用技术,很好的解决了浏览器限制同一个域名下的请求数量的问题。
多路复用技术可以只通过一个TCP链接就可以传输所有的请求数据
服务端推送
HTTP2.0在一定程度上改不了传统的“请求-应答”工作模式,服务器不再完全被动地响应请求,也可以新建“流”主动向客户端发送消息。(例如,浏览器在刚请求html的时候就提前把可能会用到的JS,CSS文件发送给客户端,减少等待延迟,这被称为“服务端推送Server Push”)
服务器也不能随便将第三方资源推送给服务器,必须经过双方确认。
此外,HTTP/2还可以使用TLS加密协议,提高安全性。
# 2.5、HTTP/3
HTTP/3基于QUIC协议开发,使用UDP协议进行传输,可以避免TCP的慢启动和拥塞控制等问题。
# 三、HTTP状态码分类
HTTP 状态码用于描述 HTTP 请求的结果,例如 200
表示请求被成功处理。
!
# 1xx Informational(信息性状态码)
表示接收的请求正在处理,基本不会遇到。
# 2xx Success(成功状态码)
表示请求被成功处理
200 OK :请求被成功处理。
比如我们发送一个查询用户数据的HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
201 Created :请求被成功处理并且在服务端创建了一个新的资源。
比如我们通过 POST 请求创建一个新的用户。
202 Accepted :服务端已经接收到了请求,但是还未处理。
204 No Content : 服务端已经成功处理了请求,但是没有返回任何内容。
简单来说,204状态码描述的是我们向服务端发送 HTTP 请求之后,只关注处理结果是否成功的场景。也就是说我们需要的就是一个结果:true/false。
# 3xx Redirection(重定向状态码)
301 Moved Permanently : 资源被永久重定向了
比如你的网站的网址更换了。
302 Found :资源被临时重定向了。
比如你的网站的某些资源被暂时转移到另外一个网址。
**304 Not Modified ** :资源未更改
# 4xx Client Error(客户端错误状态码)
400 Bad Request : 客户端请求的语法错误,服务器无法理解。
比如请求参数不合法、请求方法错误。
401 Unauthorized : 要求用户认证。
403 Forbidden :服务器直接拒绝客户端的请求。一般用来针对非法请求。
404 Not Found : 资源未找到。
409 Conflict : 服务器处理请求时发生了冲突。
# 5xx Server Error(服务端错误状态码)
500 Internal Server Error : 服务器内部错误,无法完成请求
比如你服务端处理请求的时候突然抛出异常,但是异常并未在服务端被正确处理。
502 Bad Gateway :我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应
503 Service Unavailable:由于超载或系统维护,服务器暂时的无法处理客户端的请求
# 四、HTTP通讯的基本流程
DNS解析:在客户端发送请求前,需要先将请求的域名解析成对应的IP地址。客户端会先检查本地的DNS缓存中是否有对应的IP地址,如果没有则向DNS服务器发送DNS查询请求,获取对应的IP地址。
建立TCP连接:HTTP协议是基于TCP协议实现的,所以在发送HTTP请求前需要先建立TCP连接。建立TCP连接的过程中,会进行三次握手,确保双方都已准备好进行数据传输。
客户端发送HTTP请求:TCP连接建立成功后,客户端向服务器发送HTTP请求。
HTTP请求由请求方法、URL、协议版本、请求头部和请求体等信息组成。常见的请求方法有GET、POST、PUT、DELETE等,每种请求方法对应不同的操作。
服务器处理请求:服务器接收到HTTP请求后,会进行相应的处理,包括解析请求报文、根据请求的URL找到对应的资源、进行相应的业务处理等。
服务器返回HTTP响应:服务器处理请求后,将处理结果封装成HTTP响应报文,并返回给客户端。
HTTP响应由状态行、响应头部和响应体等信息组成。状态行包括状态码和状态消息,状态码表示服务器对请求的处理结果,常见的状态码有200、404、500等。
客户端接收HTTP响应:客户端接收到HTTP响应后,会进行相应的处理,包括解析响应报文、判断请求是否成功、获取响应体等。
关闭TCP连接:数据传输完成后,客户端和服务器需要关闭TCP连接,释放资源。关闭TCP连接的过程中,会进行四次挥手,确保双方都已关闭连接。
以上是HTTP请求的基本流程,不同的应用场景和实现方式可能会有一些差异,例如HTTP长连接和HTTPS协议等,但基本的流程和步骤大致相同。
# 五、HTTPS通讯的基本流程
HTTPS请求过程和HTTP请求过程基本相同,但在建立TCP连接和发送HTTP请求时,会增加一些额外的步骤和处理,以确保通信的安全性
建立SSL/TLS连接
客户端向服务器发送一个请求,请求建立SSL/TLS连接。客户端会发送一个"Client Hello"消息,包含客户端支持的SSL/TLS协议版本、加密算法、随机数等信息。服务器收到消息后,会发送一个"Server Hello"消息,包含服务器选择的SSL/TLS协议版本、加密算法、随机数等信息。
服务器验证客户端身份
服务器向客户端发送一个数字证书,证书包含了服务器的公钥和相关信息。客户端会验证证书的有效性和合法性,如果验证通过,客户端会生成一个随机数,并使用服务器的公钥对随机数进行加密,发送给服务器。
客户端验证服务器身份
服务器收到加密的随机数后,使用自己的私钥对随机数进行解密,得到原始的随机数。服务器也会生成一个随机数,并使用客户端发送的公钥对随机数进行加密,发送给客户端。客户端收到加密的随机数后,使用自己的私钥对随机数进行解密,得到原始的随机数。客户端和服务器现在都拥有了相同的三个随机数:客户端生成的随机数、服务器生成的随机数、客户端和服务器共享的密钥。
安全数据交换
客户端和服务器现在使用共享密钥进行加密和解密通信数据。客户端向服务器发送HTTP请求,请求报文会被加密。服务器收到请求后,会解密请求报文并进行处理,然后将响应报文加密后返回给客户端。客户端收到响应报文后,会使用共享密钥进行解密,得到原始的响应报文。
断开SSL/TLS连接
HTTPS连接使用完毕后,客户端和服务器会断开SSL/TLS连接。在断开连接前,客户端和服务器会进行一些清理工作,包括删除临时数据、释放资源等