HTTP
属于网络七层协议中的"最上层":应用层。由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
这里顺便说一下网络七层协议:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层;
解释 | 例子 |
应用层主要由高级传输协议构成 | http,ftp等 |
表示层负责对相应的协议进行加密或定义数据格式 | SSL(http+SSL就变成了https) |
会话层负责会话的开始,结束,多个会话的控制与管理 | RPC |
传输层负责根据高级传输协议确定相应的底层传输协议 | TCP,UDP |
网络层负责确定传输地址,相应数据包的定义以及拆分(数据都是通过包来传递的) | ip |
数据链路层定义了在单个链路上如何传输数据 | ATM |
物理层负责最终数据包通过什么介质传递 | 电缆,光纤,水晶头 |
HTTP的通信过程
客户端向服务器发起一个tcp请求,建立进程,通过Socket(会话)访问tcp |
客户端通过tcp向服务器发送报文,报文包含请求头部,地址,请求参数,相应的请求数据 |
服务器接受到报文后,进行解析,认证,获取相应的资源(数据,文件等),然后封装到响应报文,通过Socket发送至客户端 |
服务器响应报文后,服务器进程通知tcp,t断开tcp请求(只是通知,此时TCP连接不一定关闭),TCP发送完数据后,实际断开该连接。 |
客户端接受报文,数据处理,渲染浏览器。 |
注意:http请求,断开tcp的权限到底在谁手里。
http1.0 | |
请求头部带content-length,body长度可知,客户端在接收body时,就可以依据这个长度来接受数据。接受完毕后,就表示这个请求完毕了。 | 客户端主动调用close进入四次挥手。 |
不带content-length ,body长度不可知 | 客户端一直接受数据,直到服务端主动断开 |
http1.1/2.0 | |
带content-length | 客户端主动断开 |
带Transfer-encoding:chunked body会被分成多个块,每块的开始会标识出当前块的长度,body就不需要通过content-length来指定了。 | 客户端主动断开 |
不带Transfer-encoding:chunked且不带content-length | 客户端接收数据,直到服务端主动断开连接。 |
注意:那么一般的数据请求(接口请求),都是服务器决定的。
HTTP1.0/1.1/2.0的区别
- TTP1.1默认使用长连接,可有效减少TCP的三次握手开销。
- HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。
- HTTP1.0是没有host域的,HTTP1.1才支持这个参数。
- HTTP2.0使用多路复用技术(Multiplexing),多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。
"HTTP1.1在同一时间对于同一个域名的请求数量有限制,超过限制就会阻塞请求"。多路复用底层采用"增加二进制分帧层"的方法,使得不改变原来的语义、首部字段的情况下提高传输性能,降低延迟。
二进制分帧将所有传输信息分割为更小的帧,用二进制进行编码,多个请求都在同一个TCP连接上完成,可以承载任意数量的双向数据流。HTTP/2更有效的使用TCP连接,得到性能上的提升。