最近读了一本非常好的有关HTTP协议的书,感觉对之前的知识有了更系统的认知,这里做一个梳理和记录。
HTTP协议:HTTP是一个客户端和服务器端请求和应答的标准(TCP)。
HTTP请求:由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)(或者,更准确一些,URLs)来标识。
HTTP状态码
1XX:指示信息—表示请求已接收,继续处理中
2XX:成功(200成功,206,客户端请求了一个Range头的GET请求)
3XX:重定向(301永久重定向,302临时重定向,304请求缓存资源)
4XX:(401客户端请求有语法错误,403访问被禁止,404资源未被找到)
5XX:(500服务器错误)
HTTP2 实现时候 优点
HTTP协议主要特点
简单快速:每个资源的资源符是固定的
无连接:连接一次就会断掉,不会保持连接
无状态:服务端不会确定两次连接的客户端身份(需要使用cookie来确定身份,关于cookie,在我了解多了之后,写了另一篇文章总结,cookie)
HTTP报文组成部分
请求报文:请求行(HTTP方法,页面地址,HTTP协议及版本)、请求头(key和value值)、空行(做请求头和请求体的分隔)、请求体
响应报文:状态行、响应头、空行、响应体
HTTP方法
GET,POST,PUT,DELETE,HEAD
POST和GET区别
GET在浏览器回退时不会再次请求,POST会再次提交请求;
GET请求会被浏览器主动缓存,POST不会,除非手动设置;
GET请求只能进行URL编码,POST支持多种编码方式;
GET请求参数会被完整的保存在浏览器历史记录里,POST不会(防止CRSF攻击,使用POST;而且参数直接暴露在URL上,所以不能用来传递敏感信息);
GET请求在URL中传递的参数有长度限制(2KB左右),POST没有限制;
GET只接受ASCII字符,POST没有限制;
GET参数通过URL访问,POST放在Request body中
持久连接
HTTP协议采用请求应答模式,当使用普通模式,非keep-alive时,每个请求客户端和服务器都要重建连接,完成后要立即断开连接;当使用keep-alive时,客户端到服务器端的连接持续有效,当出现对服务器的后续请求时,避免了重新建立连接。但是需要HTPP1.1传输协议;
在一次HTTP协议中发生了什么
由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。