HTTP协议
HTTP协议是一个简单的请求——响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP进行通信的HTTP的实现程序。
HTTP是基于TCP协议,且面向连接的。典型的HTTP事务处理有如下的过程:
- 客户端与服务器建立连接;
- 客户端向服务器提出请求;
- 服务器接受请求,并根据请求返回相应的数据作为应答响应;
- 客户端与服务器关闭连接。
HTTP协议报文格式
HTTP报文由从客户机到服务器的请求(Request)和从服务器到客户机的响应(Respone)构成
请求由请求行,请求头,请求体组成
请求行中包含请求方法、路径、版本号,请求头为多个key-value数据,请求正文包含一些请求的数据
响应由响应行,响应头,响应体组成
响应行中包含状态码,状态码描述,版本号,响应头为多个key-value数据,响应正文包含一些响应的数据
常见HTTP响应状态码汇总
200 OK :客户端请求成功
3XX系列
301 Moved Permanently :请求的资源以被永久的移动到新URL中,返回的Response中包含一个Location,浏览器会自动重定向到新URL,以后请求都会被新的URL替代
302 Found :与301类似,但请求的资源只是临时的被移动到新的URL中,下次请求客户端继续使用原URL
307 Temporary Redirect : 临时重定向,类似于302,使用GET请求重定向
4XX系列
400 Bad Request : 客户端请求语法错误,服务器无法理解(在 ajax 请求后台数据时比较常见)
401 Unauthorized :请求要求用户的身份认证
403 Forbidden : 服务器理解客户端请求,但是拒绝执行(一般用于用户级别为达到要求等等不支持访问)
404 Not Found : 服务器无法根据客户端请求找到对应资源
405 Method Not Allowed : 服务器不支持该方法
5XX系列
500 Internal Server Error : 服务器内部错误,无法完成请求
503 Service Unavailable :由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
HTTP协议的特点
支持服务器/客户端模式传输较快速,客户端向服务器发送请求,只需要传输请求方法和路径灵活,HTTP允许传输任意类型的数据对象无连接,每次连接只能处理一个请求,服务器处理完客户端请求,客户端收到响应后就断开连接无状态,协议本身对事务处理没有记忆能力,如果后序连接需要之前发送的信息时就需要重传
HTTP1.0和HTTP1.1和HTTP2.0的区别:
HTTP1.0和HTTP1.1的区别:
- 长连接:HTTP1.0只支持浏览器与服务器的短连接,即每次请求都要重新建立连接,服务器无法记录每个历史请求,HTTP1.1支持长连接即在一次连接下,浏览器可以向服务器发送多次请求
- 增加Host字段:HTTP1.0中认为每个服务器都绑定这唯一一个IP,所有发送的请求头URL中没有host信息,而HTTP1.1在请求和响应中都支持了host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
- 缓存:HTTP1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)。
- 错误提示:HTTP1.0中定义了16个状态码,对错误或警告的提示不够具体。HTTP1.1引入了一个Warning头域,增加对错误或警告信息的描述,并且还新增了24个状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除
HTTP1.X和HTTP2.0的区别
- 增加二进制格式解析:HTTP1.X解析基于文本,而文本格式本身就具有多样性,很多场景下不方便,而引入二进制后,只有0和1组合,使解析更加方便也增强了健壮性
- 多路复用:即每个request都是是用作连接共享机制的,每个request都对应一个id,使一个连接可以有多个请求,再根据id将request归属到不同的服务端请求里
- header压缩:HTTP1.X中,每次传输都要写点header头,占用了大量数据,因此HTTP2.0在客户端和服务端各保存了一份header fields表,每次传输时只需传输header的更新信息,将header fields表更新即可实现header传输
- 服务端推送:HTTP2.0也添加了server push功能