HTTP的前世和今生

目录

一HTTP介绍

二HTTP常见状态

三HTTP请求报文格式

四HTTP/1.0

五HTTP/1.1

六HTTP/2

七HTTP1.0和HTTP1.1区别总结


一HTTP介绍

超文本传输协议(HTTP,HyperText Transfer Protocol) 是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。HTTP 使用客户端-服务器模型,客户端向服务器发送 HTTP Request(请求),服务器响应请求并返回 HTTP Response(响应), HTTP请求由请求头部和请求正文组成。请求头部包含了请求的方法,URL,协议版本和其他相关信息。请求正文包含请求的数据,HTTP响应由响应头和响应正文组成。响应头包含了响应的状态码,协议版本和其他相关信息,响应正文包含了响应的数据,整个过程如下图所示。

HTTP 协议基于 TCP 协议,发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,这样的话建立的连接就可以在多次请求中被复用了。另外, HTTP 协议是”无状态”的协议,它无法记录客户端用户的状态,一般我们都是通过 Session 来记录客户端用户的状态
 

二HTTP常见状态

1xx Informational(信息性状态码)
相比于其他类别状态码来说,1xx 你平时你大概率不会碰到,所以这里直接跳过。
2xx Success(成功状态码)
200 OK:请求被成功处理。比如我们发送一个查询用户数据的 HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
201 Created:请求被成功处理并且在服务端创建了一个新的资源。比如我们通过 POST 请求创建一个新的用户。
202 Accepted:服务端已经接收到了请求,但是还未处理。
204 No Content:服务端已经成功处理了请求,但是没有返回任何内容。
3xx Redirection(重定向状态码)
301 Moved Permanently:资源被永久重定向了。比如你的网站的网址更换了。
302 Found:资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址。
4xx Client Error(客户端错误状态码)
400 Bad Request:发送的 HTTP 请求存在问题。比如请求参数不合法、请求方法错误。
401 Unauthorized:未认证却请求需要认证之后才能访问的资源。
403 Forbidden:直接拒绝 HTTP 请求,不处理。一般用来针对非法请求。
404 Not Found:你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户。
409 Conflict:表示请求的资源与服务端当前的状态存在冲突,请求无法被处理。
5xx Server Error(服务端错误状态码)
500 Internal Server Error:服务端出问题了(通常是服务端出 Bug 了)。比如你服务端处理请求的时候突然抛出异常,但是异常并未在服务端被正确处理。
502 Bad Gateway:我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应
 

三HTTP请求报文格式

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,每个字段的长度是不确定的。HTTP报文传过来的都是一堆的0x ASCII码,例如" 41 63 63 65 70 74"这段十六进制ASCII码串对应的是“accept” 单词,HTTP请求报文格式由请求行(request line)、请求头部(header)和请求正文(body)三部分组成。下面是HTTP请求报文格式的详细说明:

请求行(request line): 请求行由三部分组成,分别是请求方法、请求URI和HTTP协议版本,中间用空格分隔,例如: GET /index.html HTTP/1.1 其中,请求方法表示客户端的请求方式,例如GET、POST、PUT、DELETE等。请求URI表示客户端请求的资源路径,例如/index.html。HTTP协议版本表示客户端使用的HTTP协议版本号,例如HTTP/1.1。

请求头部(header): 请求头部用来描述请求消息的一些基本信息,包括请求的主机名、请求的内容类型、使用的语言等。请求头部由多个键值对组成,每个键值对占一行,键和值之间用“:”号分隔,例如: Host: www.example.com ,Content-Type: application/json, Accept-Language: en-US

请求正文(body): 请求正文是可选的,如果客户端需要向服务器传递数据的话,可以使用请求正文。例如,当使用POST请求方式提交表单数据时,数据就需要放在请求正文中。请求正文的格式和内容根据请求头部中的Content-Type字段来确定。

以上就是HTTP请求报文的格式和内容,它定义了客户端向服务器发送请求的方式和内容。

四HTTP/1.0

  • HTTP/1.0 默认使用短连接,也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 TCP 连接,这样就会导致有大量的“握手报文”和“挥手报文”占用了带宽。
  • 域名系统(DNS)允许多个主机名绑定到同一个 IP 地址上,但是 HTTP/1.0 并没有考虑这个问题,假设我们有一个资源 URL 是http://example1.org/home.html,HTTP/1.0的请求报文中,将会请求的是GET /home.html HTTP/1.0.也就是不会加入主机名。这样的报文送到服务器端,服务器是理解不了客户端想请求的真正网址。因此,HTTP/1.1 在请求头中加入了Host字段。加入Host字段的报文头部将会是:
GET /home.html HTTP/1.1
Host: example1.org

这样,服务器端就可以确定客户端想要请求的真正的网址了
 

五HTTP/1.1

HTTP/1.1 主要解决了HTTP 1.0的网络性能的问题,以及增加了一些新的东西:

  • 可以设置 keepalive 来让HTTP重用TCP链接,重用TCP链接可以省了每次请求都要在广域网上进行的TCP的三次握手的巨大开销。这是所谓的“HTTP 长链接” 或是 “请求响应式的HTTP 持久链接”。英文叫 HTTP Persistent connection.
  • 然后支持pipeline网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。(注:非幂等的POST 方法或是有依赖的请求是不能被pipeline化的)
  • 支持 Chunked Responses ,也就是说,在Response的时候,不必说明 Content-Length 这样,客户端就不能断连接,直到收到服务端的EOF标识。这种技术又叫 “服务端Push模型”,或是 “服务端Push式的HTTP 持久链接”
  • 还增加了 cache control 机制。
  • 协议头注增加了 Language, Encoding, Type 等等头,让客户端可以跟服务器端进行更多的协商。
  • 还正式加入了一个很重要的头—— HOST这样的话,服务器就知道你要请求哪个网站了。因为可以有多个域名解析到同一个IP上,要区分用户是请求的哪个域名,就需要在HTTP的协议中加入域名的信息,而不是被DNS转换过的IP信息。
  • 正式加入了 OPTIONS 方法,其主要用于 CORS – Cross Origin Resource Sharing 应用。

六HTTP/2

虽然 HTTP/1.1 已经开始变成应用层通讯协议的一等公民了,但是还是有性能问题,虽然HTTP/1.1 可以重用TCP链接,但是请求还是一个一个串行发的,需要保证其顺序。然而,大量的网页请求中都是些资源类的东西,这些东西占了整个HTTP请求中最多的传输数据量。所以,理论上来说,如果能够并行这些请求,那就会增加更大的网络吞吐和性能。

另外,HTTP/1.1传输数据时,是以文本的方式,借助耗CPU的zip压缩的方式减少网络带宽,但是耗了前端和后端的CPU。这也是为什么很多RPC协议诟病HTTP的一个原因,就是数据传输的成本比较大。
HTTP/2基本上解决了之前的这些性能问题,其和HTTP/1.1最主要的不同是:

  • HTTP/2是一个二进制协议,增加了数据传输的效率。
  • HTTP/2是可以在一个TCP链接中并发请求多个HTTP请求,移除了HTTP/1.1中的串行请求。
  • HTTP/2会压缩头,如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分。这就是所谓的HPACK算法(参看RFC 7541 附录A)
  • HTTP/2允许服务端在客户端放cache,又叫服务端push,也就是说,你没有请求的东西,我服务端可以先送给你放在你的本地缓存中。比如,你请求X,我服务端知道X依赖于Y,虽然你没有的请求Y,但我把把Y跟着X的请求一起返回客户端。

七HTTP1.0和HTTP1.1区别总结

  • 连接方式 : HTTP 1.0 为短连接,HTTP 1.1 支持长连接。
  • 状态响应码 : HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,100 (Continue)——在请求大资源前的预热请求,206 (Partial Content)——范围请求的标识码,409 (Conflict)——请求与当前资源的规定冲突,410 (Gone)——资源已被永久转移,而且没有任何已知的转发地址。
  • 缓存处理 : 在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
  • 带宽优化及网络连接的使用 :HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
  • Host 头处理 : HTTP/1.1 在请求头中加入了Host字段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值