引言: 转前端一年了,期间工做较忙,也没时间整理一些知识体系,此系列文章是对前端基础的一些回顾与总结。
咱们知道,HTTP是基于TCP/IP协议的。属于TCP/IP 协议的一个子集,TCP/IP是互联网通讯相关联的协议族的总称。了解TCP/IP协议族有助于咱们更好的理解HTTP协议。html
TCP/IP协议族主要分为:前端
盗用《图解HTTP》中的一张图:程序员
举个栗子,客户端在应用层按规范发起了一个HTTP请求,而后由传输层(TCP)负责将报文分片,编序发给网络层,再由网络层增长目标服务器的mac地址,最终由链路层将请求发往目标机器。服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP请求。web
URI是一个用于标识互联网资源名称的字符串,最多见的形式是统一资源定位符(URL),常常指定为非正式的网址。更罕见的用法是统一资源名称(URN),其目的是经过提供一种途径。用于在特定的命名空间资源的标识,以补充网址。
即URL和URN 都是 URI的子集,URI是一种抽象的概念,URL是URI的一种常见的具象表达形式。算法
简介sql
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时
也接收服务器返回的响应并转发给客户端。每次经过代理服务器转发请求或响应时,会追加写入 Via 首部信息。数据库
代理的分类:浏览器
代理的方式:缓存
使用代理的好处:安全
网关的工做机制和代理十分类似,可是它可使用非http协议与服务器、数据库进行通讯,便是说,网关在收到来自客户端的http请求以后,能够直接与数据库链接,使用sql查询数据库。
隧道的目的是确保客户端能与服务器进行安全的通讯,自己不会去解析 HTTP 请求,也就是说,请求保持原样中转给以后的服务器,隧道会在通讯双方断开链接时结束。隧道多用于相隔较远的两台服务器的安全通讯。
HTTP是一种属于应用层通讯协议,它容许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
HTTP请求的报文通常是由 协议行、可选的请求头部、请求体组成
请求:
Request line
包括:请求方法、请求的资源、HTTP协议的版本号
Request header
包括:Cache头域、Client头域、Cookie/Login头域、Entity头域、Miscellaneous头域、Transport头域等
空行
Request body
Response响应
回包:
Response line
包括:HTTP协议的版本号、状态码、消息
Response header
包括:Cache头域、Cookie/Login头域、Entity头域、Miscellaneous头域、Transport头域、Location头域等
空行
Response body
一个完整的HTTP请求过程以下:
常见状态码:
200 OK
302 Found 暂时重定向
301 Move Permanently永久重定向
304 Not Modified 没有内容更新,使用缓存
400 Bad Request 客户端请求与语法错误
403 Forbidden 服务器拒绝提供服务
404 Not Found 请求资源不存在
500 Internal Server Error服务器发生了不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
首部字段通常分为4类:
HTTP被设计之初,就以简易、灵活为目的。它的主要特性就是简易、灵活 、 无状态 、无链接、支持B/S模式。
无链接是指每一次请求结束后都会断开TCP链接。在web技术高速发展的今天,每一个页面须要请求的资源都日益增多,而每次请求都须要从新创建TCP链接,这显然极大的增长了无心义的通讯开销。因而,Keep-Alive 被提出,以解决TCP没法复用的问题。
Keep-Alive 其实就是在协议头里面设置 Connection: Keep-Alive , 表示当前链接是持久化的,持续时间有服务器控制,在没有接收到关闭信号时,TCP链接不会断开,这样避免了重复创建TCP请求的无用耗时。
keep-Alive 对应PC端的帮助很大,但在APP端,请求比较分散,且时间跨度大,将keep-Alive的时间设置为很大显然是不合理的。因此,通常会寻求其余的长链接方案和伪长链接方案。这个下文会详细介绍。
HTTP是一个优秀的协议,可是仍然存在着一些缺陷:
可是,程序员的智慧是无穷的,既然不安全,那就让它安全,因而,HTTPS就诞生了。
HTTPS是 HTTP+ SSL +TLS 的产物,用于对通讯的加密、认证、完整性保护。它并非一种新的协议,而是HTTP的某些部分由SSL和TLS代理。
咱们先来了解一下经常使用的两种加密方式:
HTTPS 使用混合加密机制,即先经过非对称加密交换通讯密钥,拿到密钥后再使用对称加密的方式进行后续的通讯。可是如何保证第一步中,客户端获取到的公共密钥是正确的呢?这时候,就须要用到咱们的数字证书了。
证书是由第三方机构提供认证的,服务器先去第三方机构申请公共密钥,而后会得到公共密钥和使用第三方数字签名,在非对称加密的过程当中,将数字证签名和包含的公共密钥一块儿发给客户端,客户端经过第三方机构的公共密钥对证书上的签名进行验证,一旦经过,则说明公共密钥是正确的。
下面看看具体的安全通讯创建过程:
secret加密随机串(对称密钥)。
通常APP会基于TCP造一个长链接的通讯协议,门槛较高,可是一旦完成,带来的回报也是很是大的。信息的推送和更新变得及时,且在一些请求爆发点,相较于传统HTTP重复创建请求的耗时,也能减轻服务器的压力。如今业界的成熟方案如:google的protobuf。
long-polling请求就是在客户端初始化的时候发起一个polling请求到服务器,而后请求一直等待中,当服务器有资源更新的时候,再返回数据,数据放回时,再次发起一个polling请求继续监听。固然,polling请求也有一些缺陷,好比 长时间的链接会增长服务器压力,复杂的业务场景下须要考虑如何才能创建健康的请求通道等。此外,这种方式有个致命的缺陷是:数据通讯是单向的,主动权在服务端这边,客户端只能根据服务端被动的接受数据,有新的业务请求的时候没法及时传送。
与http-polling 不一样的是, http-streaming 在初始化的的时候就发起一个不会断开的请求,持续监听服务器的回包,服务器有数据更新时就经过这个请求通道返回数据。此种方式跟http-polling同样是单向的,streaming是经过在server response的头部里增长”Transfer Encoding: chunked”来告诉客户端后续还会有新的数据到来。固然,streaming 也有缺陷: 业务数据没法按照请求来作分割,因此客户端没收到一块数据都须要本身作协议解析,也就是说要作本身的协议定制。
WebSocket和传统的tcp socket链接类似,也是基于tcp协议,提供双向的数据通道。WebSocket优点在于提供了message的概念,比基于字节流的tcp socket使用更简单,同时又提供了传统的http所缺乏的长链接功能。websocket 通常在数据须要实时更新的场景中使用。
管线化的前提是长链接的创建,keep-alive的多个请求使用同一个tcp链接使请求并行成为可能,pipelining与传统的请求能够形象的比喻为 串行和并行 , 多个请求同时发起,无需等待上一个请求的回包。可是它并非救世主,也存在着缺陷:
HTTP1.0和1.1的普及程度使得HTTP2必须得在不改变原有方式的状况下解决上述问题,即HTTP2 并不能像angular2那样放飞自我。因此,HTTP2的使用方式和原来的差很少,HTTP2的改变至关之多,这里主要讲一下对咱们影响较大的几点:
http2.0的协议解析决定采用二进制格式,实现方便且健壮。每个请求都有这些公共字段:Type, Length, Flags, Steam Identifier和frame payload。http2.0的格式定义更接近tcp层的方式,length定义了整个frame的开始到结束,type定义frame的类型(一共10种),flags用bit位定义一些重要的参数,stream id用做流控制,剩下的payload就是request的正文了。
多路复用是HTTP2.0主要解决的一个问题,一个request对应一个stream并分配一个id,这样一个链接上能够有多个stream,每一个stream的frame能够随机的混杂在一块儿,接收方能够根据stream id将frame再归属到各自不一样的request里面。
无状态的HTTP致使每次请求都须要携带服务器所须要的参数,而一些头部信息基本上是固定的,这部分重复的信息恰好能够用于压缩,减小报文体积。
HTTP 1.1的有一个缺点是:当一个含有确切值的Content-Length的HTTP消息被送出以后,你就很难中断它了。固然,一般你能够断开整个TCP连接(但也不老是能够这样),但这样致使的代价就是须要从新经过三次握手创建一个新的TCP链接。一个更好的方案是只终止当前传输的消息并从新发送一个新的。在http2里面,咱们能够经过发送RST_STREAM帧来实现这种需求,从而避免浪费带宽和中断已有的链接。
每一个流都包含一个优先级,优先级被用来告诉对端哪一个流更重要。从而实现资源的有效分配。
当一个客户端请求资源X,而服务器知道它极可能也须要资源Z的状况下,服务器能够在客户端发送请求前,主动将资源Z推送给客户端。这个功能帮助客户端将Z放进缓存以备未来之需。
http2上面每一个流都拥有本身的公示的流量窗口,它能够限制另外一端发送数据。
HTTP 虽然只有2个版本,可是每一个版本所包含的改动是很是之大的。所作出的突破和尝试也是很是多的,固然,HTTP也有竞争者,好比在HTTP2还未提出时,由google提出并推行的SPDY协议,它的优点在于解决了HTTP1.0的不能多路复用的问题,对资源请求速度有极大的提高,目前在市场上仍然有许多的使用量,HTTP2也是借鉴了不少SPDY的特性。再好比quic协议,是号称比HTTP2更快的协议。这个在下一篇文章中会重点介绍~ 哈!主要是这篇有点长了。
https://www.zhihu.com/questio...
http://wiki.jikexueyuan.com/p...