Http协议简介
上一节讲解的Socket套接字,它是基于网络层的TCP、UDP协议的Socket编程接口,它是作用于网络层,基于端到端的包发送。(它是对TCP/IP的封装,供程序员做网络开发所用的接口)
Http协议则是建立于网络层之上的应用层,它采用Socket编程接口并使用面向连接的TCP协议。
Http是轿车,提供了封装或者显示数据的具体形式;Socket则是发动机,提供网络通信的能力
HTTP包格式
http包格式,主要分为三个部分。请求行,首部,实体,如下图
请求行
主要有方法、url、版本。
url:就是浏览器的请求地址,例如百度的urlhttp://www.baidu.com
方法:有GET、POST、PUT、DELETE四种
GET:顾名思义,get翻译为获取.就是向服务端获取资源
POST:向服务端提交数据
PUT:向服务端传送文本信息等
DELETE:删除资源
版本:现在的Http协议基本都是1.1 它是串行式的,在响应效率方面相对较低。
新的版本2.0,它是采用并行式。例如一个html页面,它可以并行的加载html、js、css。效率显著提升
首部
首部的信息主要以键值对key-value的方式存在,例如:
content-type:text/html; 或application/javascript; 或application/json;他们分别表示返回的文本类型
Connetcion:keep-alive 保持连接
Accept-CharSet:utf-8 客户端接收的文本编码为utf-8
Cache-Controller:控制缓存。当值为max-age=0时,表示不使用缓存直接请求服务端资源。而当max-age不为0时则资源的缓存时间数值与该值比较,小于就直接使用缓存。 另外If-Modifed-Since也是一个关于缓存的,如果说服务端的资源更新了那客户端就得重新获取资源,而没有变更的话则会返回状态码304 Not Modified,客户端直接加载缓存这样节省了一定的带宽
.....
这样加上实体信息,应用层该干的事情基本完成,接下来就要把包发给传输层.怎么发给传输层呢?无非就是调用Socket,只不过浏览器这个程序已经帮你封装好了
Http请求的发送
HTTP 是基于 TCP 协议的,所以它使用面向连接的方式发送请求,通过 stream 二进制流的方式传给对方。当然,到了 TCP 层,它会把二进制流变成一个的报文段发送给服务器。
在发送给每个报文段的时候,都需要对方有一个回应 ACK,来保证报文可靠地到达了对方。如果没有回应,那么 TCP 这一层会进行重新传输,直到可以到达。同一个包有可能被传了好多次,但是 HTTP 这一层不需要知道这一点,因为是 TCP 这一层在埋头苦干。
HTTP 返回的构建
HTTP 的返回报文也是有一定格式的。这也是基于 HTTP 1.1 的。
状态行
状态码为200则为成功、404为找不到资源、500服务器异常
首部
content-type:指定返回的类型.到底是一个HTML还是JSON
HTTP2.0
HTTP目前最新的版本是2.0、它与1.1版本最大的不同是解决1.1串行化的问题
在1.1版本中,所有的http请求都是串行加载的,在应用层以纯文本的形式进行通信.每次通信都要带完整的 HTTP 的头。例如请求一个页面会出发多个HTTP请求:加载html文本、css样式文本、js脚本。它都是一个个进行的,加载完这个再进行下一个的加载,
而在2.0版本中,它对Request header(请求头)进行压缩,他不会每次请求都在请求头携带大量的key-value,而是在两端建立对应内容的索引,这样在相同请求头的请求中只需加上内容索引就OK。
并且2.0是采用并行的方式同时加载html文本、js等文件。HTTP 2.0 协议将一个 TCP 的连接中,切分成多个流,每个流都有自己独立的 ID,并且把请求分成Header帧和Data帧.每个帧都有请求的唯一标识(ID).这样只要哪个请求加载完毕便传给应用程序。这样大大提高了页面的加载响应效率
HTTP 2.0 还将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码。常见的帧有Header 帧,用于传输 Header 内容,并且会开启一个新的流。再就是Data 帧,用来传输正文实体。多个 Data 帧属于同一个流。