HTTP协议解析小白文

1. 什么是HTTP协议?

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。php

RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天广泛使用的一个版本——HTTP 1.1。html

 

简单地说,咱们上网就是用户(客户端)遵循该协议向服务器发送请求获取资源,服务器解析该协议知道用户请求什么,而后把结果返回。java

2. HTTP协议的内容?

HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向链接的协议。因此HTTP在开始传输以前,首先须要创建TCP链接,而TCP链接的过程须要所谓的“三次握手”。下图所示TCP链接的三次握手。
TCP三次握手以后,创建了TCP链接,此时HTTP就能够进行传输了。一个重要的概念是面向链接,既HTTP在传输完成之间并不断开TCP链接。在HTTP1.1中(经过Connection头设置 keep alive)这是默认行为。浏览器

 

简单地说,三次握手就是去小餐厅点菜,会先问我能点菜吗?能够,你肯定要点餐吗?我肯定要点餐。我要点吧啦吧啦……开始写菜单缓存

2.1 客户端使用HTTP协议给服务器发送了什么?

HTTP请求由状态行、请求头、请求三部分组成:服务器

请求行cookie

①是请求方法,GET和POST是最多见的HTTP方法,除此之外还包括DELETE、HEAD、OPTIONS、PUT、TRACECONNECT,一共八种。session

②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。并发

③是协议名称及版本号。less

请求头:

④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。

与缓存相关的规则信息,均包含在header中

请求体:

⑤是报文体,它将一个页面表单中的组件值经过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体能够传递请求参数,请求URL也能够经过相似于“/chapter15/user.html? param1=value1¶m2=value2”的方式传递请求参数。 

 

 

简单来讲,就是下菜单,点菜,写备注写要求。

2.2 服务器使用HTTP协议给客户端返回了什么?

HTTP的响应报文也由三部分组成,分别是响应行、响应头、响应体。

响应行:

①报文协议及版本; 
②状态码及状态描述;

响应头:

③响应报文头,也是由多个属性组成;

响应体:

④响应报文体,即咱们真正要的“干货”。

 

 

 

 

响应状态码

和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。 
HTTP的响应状态码由5段组成:

1)1xx 消息,通常是告诉客户端,请求已经收到了,正在处理,别急...

2)2xx 处理成功,通常表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息。

3)3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。

4)4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被受权,禁止访问等。

5)5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。

常见的状态码:

200 OK 请求成功;

302 临时重定向

304 Not Modified  请求内容没有修改,使用本地缓存啦...

404 Not Found 请求的资源不存在

500 Internal Server Error 服务器错误

3. HTTP的无状态特色

根据早期的HTTP协议,每次请求响应时,都要从新创建TCP链接。TCP链接每次都从新创建,因此服务器没法知道上次请求和本次请求是否来自于同一个客户端。所以,HTTP通讯是无状态(stateless)的。服务器认为每次请求都是一个全新的请求,不管该请求是否来自同一地址。

 

问题:为何登陆后就不用登陆了?这不是记录的状态了吗?

答:HTTP并无记录状态,而是程序,如PHP程序把状态保存在了cookie,session,不是HTTP记录了。

1. HTTP版本更替

HTTP/0.9

HTTP协议的最第一版本,功能简陋,仅支持请求方式GET,而且仅能请求访问HTML格式的资源。

HTTP/1.0

0.9版本上作了进步,增长了请求方式POST和HEAD;再也不局限于0.9版本的HTML格式,根据Content-Type能够支持多种数据格式,即MIME多用途互联网邮件扩展,例如text/html、image/jpeg等;同时也开始支持cache,就是当客户端在规定时间内访问统一网站,直接访问cache便可。

可是1.0版本的工做方式是每次TCP链接只能发送一个请求,当服务器响应后就会关闭此次链接,下一个请求须要再次创建TCP链接,就是不支持keepalive。

HTTP/1.1

解决了1.0版本的keepalive问题,1.1版本加入了持久链接,一个TCP链接能够容许多个HTTP请求; 加入了管道机制,一个TCP链接同时容许多个请求同时发送,增长了并发性;新增了请求方式PUT、PATCH、DELETE等。

可是还存在一些问题,服务端是按队列顺序处理请求的,假如一个请求处理时间很长,则会致使后边的请求没法处理,这样就形成了队头阻塞的问题;同时HTTP是无状态的链接,所以每次请求都须要添加剧复的字段,下降了带宽的利用率。

HTTP/2.0

为了解决1.1版本利用率不高的问题,提出了HTTP/2.0版本。增长双工模式,即不只客户端可以同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题;HTTP请求和响应中,状态行和请求/响应头都是些信息字段,并无真正的数据,所以在2.0版本中将全部的信息字段创建一张表,为表中的每一个字段创建索引,客户端和服务端共同使用这个表,他们之间就以索引号来表示信息字段,这样就避免了1.0旧版本的重复繁琐的字段,并以压缩的方式传输,提升利用率。

另外也增长服务器推送的功能,即不经请求服务端主动向客户端发送数据,例如服务端能够主动把 JS 和 CSS 文件推送给客户端,而不须要客户端解析 HTML 再发送这些请求,当客户端须要的时候,它已经在客户端了。

 

当前主流的协议版本仍是HTTP/1.1版本,既然HTTP/2.0这么好,为何主流仍是HTTP/1.1呢?

缘由有不少:

(1)设备问题,之前的旧手机系统不少不支持。

(2)成本问题,HTTP/2.0开启https,就须要证书,购买证书须要花费。

(3)技术、运维成本,HTTPS部署相对HTTP来讲麻烦好多。并且,若是正在使用HTTP,再转HTTP2,就可能须要替换时间成本。

(4)开发语言不支持,目前主流的开发语言,如C/C++,java,php等等都支持,可是有个别小众的语言应该还不支持。

(5)目前网站速度能够,不想更换。

(6)……

相关文章
相关标签/搜索