在鸡年的最后一天完成了这篇文章。表示愉悦的同时,更要祝福你们狗年大吉吧....css
下方是一根正经的分割线...html
从新学习前端知识,本身整理总结了些内容...因此想分享给你们。在分享的同时,也能够本身学习的更扎实...若是有错误或者理解不正确的地方,麻烦告知我会及时更正。同时也很是欢迎你们一块儿讨论。鞠躬。 Github地址:项目地址 (不按期更新...前端
定义
HTTP( HyperText Transfer Protocol )超文本传输协议 ,是一种用于分布式、协做式和超媒体信息系统的应用层 协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。经过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。git
TCP/IP & HTTP
HTTP是如何创建链接的 首先咱们要看下熟知的七层网络模型(计算机网络中的七层模型毕竟是理想中的状况,现实是不多有应用实现了七层模型,通常都是整合其中两个或多个,实现一个四层或者五层的模型)和TCP/IP的四层网络模型(TCP处于传输层,IP属于网络(际)层 ps:关于TCP/IP到底是几层协议,目前为止没有定论,四层和五层都有,这里不展开讨论 ),以下图
在这里咱们研究的是HTTP,天然要知道它所处在哪一个模型中,答案是应用层 由于HTTP是基于TCP/IP开发的协议,看过HTTP协议的同窗确定都知道,有句话概述HTTP协议为无差错的协议,按序传输,未分段的数据流,这其实说的就是TCP协议。github
当你在浏览器输入一个URL的时候,其中发生了什么?
获取主机名
DNS 缓存/ 解析 获取服务器IP + 端口 (浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存)
链接到服务器 (这里实际上是TCP链接)
经过TCP信道发送一个HTTP请求
服务器读取一个HTTP请求
服务器查找所需资源并经过TCP信道返回资源
关闭TCP链接
版本变迁
HTTP/0.9 已过期,只接受 GET 一种请求方法,没有在通信中指定版本号,且不支持请求头.
HTTP/1.0 第一个在通信中指定版本号的HTTP 协议版本。
HTTP/1.1 继承了HTTP1.0简单的特色,持久链接被默认创建,并能很好地配合代理服务器工做。还支持以管道方式在同时发送多个请求,以便下降线路负载,提升传输速度。
HTTP/2.0 2015年5月做为互联网标准正式发布。
HTTP客户端请求和服务端响应(目前主流的HTTP1.1和HTTP2
请求组成
起始行(start line) 请求方法 + 请求URI + 协议版本
报文首部(Header)
空行
报文主体
响应组成
起始行(start line) 协议版本 + 状态码 + 状态嘛的缘由短语
报文首部(Header)
空行
报文主体
请求方法
GET — 获取资源
HEAD — 得到报文首部
POST -- 传输实体文本
PUT -- 传输文件
DELETE — 删除文件
CONNECT — 要求用隧道协议链接代理
OPTIONS — 询问支持的方法
TRACE — 追踪路径
首部文件 这一块图解HTTP的第六章有详细内容
通用首部
信息:Connection/Date/MIME-Version/Trailer/Update/Via
缓存:Cache-Control/Pragma
请求首部
信息:Client-IP/From/Host/Referer/UA-Color/UA-CPU/UA-Disp/UA-OS/UA-Pixels/User-Agent
Accept:Accept/Accept-Charset/Accept-Encoding/Accept-Language/TE
条件请求:Expect/If-Match/If-Modified-Since/If-None-Match/If-Range/If-Unmodified-Since/Range
安全请求:Authorization/Cookie/Cookie2
代理请求:Max-Forward/Proxy-Authorization/Proxy-Connection
响应首部
信息:Age/Public/Retry-After/Server/Title/Warning
协商:Accept-Ranges/Vary
安全响应:Proxy-Authorization/Set-Cookie/Set-Cookie2/WWW-Authenticate
实体首部
信息:Allow/Location
内容:Content-Base/Content-Encoding/Content-Language/Content-Length/Content-Location/Content-MD5/Content-Range/Content-Type
实体缓存:ETag/Expires/Last-Modified
响应状态码
100 Continue 继续,通常在发送post请求时,已发送了http header以后服务端将返回此信息,表示确认,以后发送具体参数信息
200 OK 正常返回信息
201 Created 请求成功而且服务器建立了新的资源
202 Accepted 服务器已接受请求,但还没有处理
206 Partial Content 响应报文包含了多个范围内的内容
301 Moved Permanently 请求的网页已永久移动到新位置。
302 Found 临时性重定向。
303 See Other 临时性重定向,且老是使用 GET 请求新的 URI。
304 Not Modified 自从上次请求后,请求的网页未修改过。
400 Bad Request 服务器没法理解请求的格式,客户端不该当尝试再次使用相同的内容发起请求。
401 Unauthorized 请求未受权。
403 Forbidden 禁止访问。
404 Not Found 找不到如何与 URI 相匹配的资源。
500 Internal Server Error 最多见的服务器端错误。
503 Service Unavailable 服务器端暂时没法处理请求(多是过载或维护)。
各版本简介
HTTP/1.0
早先的HTTP/1.0是一种无状态、无链接的应用层协议。规定浏览器和服务器保持短暂的链接,浏览器的每次请求都须要与服务器创建一个TCP链接,服务器处理完成后当即断开TCP链接(无链接),服务器不跟踪每一个客户端也不记录过去的请求(无状态)
这种无状态性能够借助cookie/session机制来作身份认证和状态记录。而下面两个问题就比较麻烦了。
首先,无链接的特性致使最大的性能缺陷就是没法复用链接。每次发送请求的时候,都须要进行一次TCP的链接,而TCP的链接释放过程又是比较费事的。这种无链接的特性会使得网络的利用率很是低。
其次就是就是队头阻塞(head of line blocking)。因为HTTP1.0规定下一个请求必须在前一个请求响应到达以前才能发送。假设前一个请求响应一直不到达,那么下一个请求就不发送,一样的后面的请求也给阻塞了。
HTTP/1.1
长链接,经过设置Keep-Alive 能够保持HTTP链接不断开,避免了每次客户端与服务器请求都要重复创建释放创建TCP链接,提升了网络的利用率。能够在请求头中携带Connection: false来告知服务器关闭请求。
支持请求管道化(pipelining)。 基于长链接,使得请求管线化成为可能。管线化使得请求可以并行传输。举个例子来讲,假如响应的主体是一个html页面,页面中包含了不少img,这个时候keep-alive就起了很大的做用,可以进行并行发送多个请求。(客户端依据域名来向服务器创建链接,通常PC浏览器会针对单个域名的服务器同时创建6 ~ 8个链接,手机端通常控制在4 ~ 6个。这也是为何不少大型网站设置不一样的静态资源CDN域名来加载资源。) 须要注意的是,服务器必须按照客户端请求的前后顺序依次回送相应的结果,以保证客户端可以区分出每次请求的响应内容。 也就是说,HTTP管道化可让咱们把先进先出队列从客户端(请求队列)迁移到服务端(响应队列)。
如图所示,客户端同时发了两个请求分别来获取html和css,假如说服务器的css资源先准备就绪,服务器也会先发送html再发送css。 同时,管道化技术只是使得客户端可以往一个服务器同时发送一组请求,倘若客户端想往这个相同的服务器发起另外一组请求,也必须等待上一组请求所有响应完毕。 可见,HTTP1.1解决队头阻塞(head of line blocking)还不完全 。chrome
缓存处理,支持断点传输,以及增长了Host字段(使得一个服务器可以用来建立多个Web站点)。
HTTP/2.0
HTTP/2 is the future of the Web 这是 Akamai 公司创建的一个官方的演示,用以说明 HTTP/2 相比于以前的 HTTP/1.1 在性能上的大幅度提高。 同时请求 379 张图片,从Load time 的对比能够看出 HTTP/2 在速度上的优点。 顺口提一句 HTTP/2 协议是从 SPDY 演变而来,SPDY 已经完成了使命并很快就会退出历史舞台(例如 Chrome 将在「2016 年初结束对 SPDY 的支持」;Nginx 已经正式支持 HTTP/2 后,也再也不支持 SPDY)segmentfault
二进制分帧 HTTP2.0经过在应用层和传输层之间增长一个二进制分帧层,突破了HTTP1.1的性能限制、改进传输性能。
可见,虽然HTTP2.0的协议和HTTP1.x协议之间的规范彻底不一样了,可是实际上HTTP2.0并无改变HTTP1.x的语义。 简单来讲,HTTP2.0只是把原来HTTP1.x的header和body部分用frame从新封装了一层而已。浏览器
多路复用 下面是几个概念:
流(stream):已创建链接上的双向字节流。
消息:与逻辑消息对应的完整的一系列数据帧。
帧(frame):HTTP2.0通讯的最小单位,每一个帧包含帧首部,至少也会标识出当前帧所属的流(stream id)。
从图中可见,全部的HTTP2.0通讯都在一个链接上完成,这个链接能够承载任意数量的双向数据流。 每一个数据流以消息的形式发送,而消息由一或多个帧组成。这些帧能够乱序发送,而后再根据每一个帧首部的流标识符(stream id)从新组装。 举个例子,每一个请求是一个数据流,数据流以消息的方式发送,而消息又分为多个帧,帧首部记录着stream id用来标识所属的数据流,不一样属的帧能够在链接中随机混杂在一块儿。接收方能够根据stream id将帧再归属到各自不一样的请求当中去。缓存
请求优先级 多路复用致使全部资源都是并行发送,可能会致使关键请求被阻塞。那么就须要「优先级」的概念了,这样就能够对重要的文件进行先传输,加速页面的渲染。
首部压缩 在HTTP1.x中,首部元数据都是以纯文本的形式发送的,一般会给每一个请求增长500~800字节的负荷。 HTTP/2.0规定了在客户端和服务器端会使用而且维护「首部表」来跟踪和存储以前发送的键值对,对于相同的头部,没必要再经过请求发送,只需发送一次。 事实上,若是请求中不包含首部(例如对同一资源的轮询请求),那么首部开销就是零字节。此时全部首部都自动使用以前请求发送的首部。 若是首部发生变化了,那么只须要发送变化了数据在Headers帧里面,新增或修改的首部帧会被追加到“首部表”。首部表在 HTTP2.0的链接存续期内始终存在,由客户端和服务器共同渐进地更新。
好比说cookie,默认状况下,浏览器会在每次请求的时候,把cookie附在header上面发送给服务器。(因为cookie比较大且每次都重复发送,通常不存储信息,只是用来作状态记录和身份认证)安全
服务器推送 服务器除了对最初请求的响应外,服务器还能够额外的向客户端推送资源,而无需客户端明确的请求。 在 HTTP/2官网 能够找到更多有关 HTTP/2 协议的资料。
HTTP/2 的协议协商机制? 浏览器 服务器 协商结果 不支持 HTTP/2 不支持 HTTP/2 不协商,使用 HTTP/1.1 不支持 HTTP/2 支持 HTTP/2 不协商,使用 HTTP/1.1 支持 HTTP/2 不支持 HTTP/2 协商,使用 HTTP/1.1 支持 HTTP/2 支持 HTTP/2 协商,使用 HTTP/2
HTTPS
HTTPS, 全称Hyper Text Transfer Protocol Secure。相比HTTP,多了一个Secure,这是由TLS(SSL)提供的。 固然也能够理解为:HTTPS = HTTP + 加密 + 认证 + 完整性保护。
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通讯提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络链接进行加密。 图解SSL/TLS协议 - 阮一峰的网络日志 这一篇阮老师的内容写的不错.就是时间有点久了,目前TLS 1.3已经上线了,感兴趣的能够了解下,这个也属于性能优化的一部分。(这里就大体的说下:TLS 1.2:须要两次往返才能完成握手,而后才能发送请求。经过移动网络访问网站能够在加载时间上增长超过半秒的时间。TLS 1.3:初始握手会减半,只须要一次往返…)
传输过程:
HTTP => TCP => IP
HTTP => SSL/TLS => TCP => IP
CURL
这个实际上是题外话,由于本身调试不多用到CURL,了解了后才发现这东西真的很好用,因此也就带在这里写了进去,当给本身记录下 用法也很简单 curl [options...] <url>
具体的options能够用curl -help 去查看,这里我就说我几个会用到的
-H/--header
自定义头信息传递给服务器
-X/--request 指定什么命令
-d/--data HTTP POST方式传送数据
-e/--referer 来源网址
总结
若是没有时间看,直接看这里和以第一张的思惟导图。若是你以为好,点个star.这个是个人git地址 个人Git地址
HTTP是一种无状态、无链接的应用层 协议
如今主流的在使用的是HTTP/1.1 (特色:持久连接,增长缓存处理,支持断点传输)和 HTTP/2(特色:二进制分帧,首部压缩,多路复用,服务端推送)
HTTPS 是由TLS(SSL)提供安全的HTTP协议
chrome查看协议类型
上次看到有人提问这个,按照如下步骤就能够了
打开检查 ...选择到Network
右键Bar勾选protocol 便可
文档参考
总结这篇学习笔记也是从不少大神的文章中和书里找到的,感兴趣的同窗能够去看下,更深的研究。欢迎你们一块儿来讨论学习。固然我写的有问题的地方,也麻烦各位帮助指出,谢谢。
《图解 HTTP》和《HTTP 权威指南》 我是先看了图解HTTP以后读的文章。最后粗看了一下HTTP 权威指南,这本书很优秀,可是其实比较厚,因此一上来阅读比较困难,建议看图解HTTP,图片可爱,介绍的也清楚,关键这本书页数少….
http2讲解 · GitBook 中文翻译…
HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比 - 前端的那些事儿 - SegmentFault 思否
Mark Nottingham 在 Velocity Beijing 2015 的 speech ,关于 HTTP/2 下的前端性能优化相关 HTTP/2 for Front-End Developers
专题 | JerryQu 的小站
HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比 - 前端的那些事儿 - SegmentFault 思否