词条解释:通过谈判、协商而制定的共同认可、共同遵照的规定与条款。
标准协议:买票上车,司机与乘客都认同协议,只要乘客买了票,司机必须让乘客上车。
流氓协议:生米煮成熟饭。html
Http协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。
客户端与服务端都是认同的,简单一点理解就是客户端找服务端要东西,也就是请求,服务端必须给客户端东西,也就是响应。nginx
搜索本地Dns > 本地host > 向宽带运营商服务器发起Dns解析请求 > 创建TCP链接(三次握手) > 数据传输 > TCP链接断开(也就是挥手)chrome
Dns是domain name service的缩写,它的做用是将域名翻译成ip地址。服务器或者应用,对于域名是无感知的,它们只会IP地址查找网络节点,Dns其实就是一个翻译,将服务器看不懂的域名地址翻译成Ip地址,这样用户在浏览器中输入域名,服务器就能够经过dns知道用户请求的是哪一个网站,而后才将对应的网站内容返回给用户。
Dns找不到的状况下会从本地host中查找;
chrome查看本地Dns缓存 chrome://net-internals/#dnsjson
Http协议分为三部分,Http状态行、Http请求头,Http响应segmentfault
必应的:跨域
百度的:浏览器
上面的图片是firefox的,chrome的长这样缓存
状态行由包含了请求方式,请求路径,协议版本等数据构成
常见属性:服务器
Request URL:请求Url
Request Method: 请求方式,除了经常使用的GET、POST外还有PUT与DELETE
Status Code: 经常使用的状态码有以下几种cookie
表示数据正在处理中
* 200:数据被正常处理 * 204: 服务器接受数据并请求成功处理,但没有资源可返回
* 302:临时性重定向 * 301:永久重定向,与302的区别是对于SEO更加友好,搜索引擎到页面后爬虫会记录重定向的地址 * 304:重定向到本地缓存,浏览器中存在访问页面时会用到
* 400:错误的请求,好比本地开发nginx配置错误后,访问某个本地站点返回400 * 403:服务端收到了请求,但拒绝访问,好比普通员工请求管理员数据提示403 * 404:找不到该路径对应的资源
* 500:服务器端执行请求时发生错误 * 503:服务器处于超负载或者正在停机维护,如今没法处理请求
固然Http状态码包含六七十种,具体能够看W3C关于状态码的规范)
Remote Address: 请求远程Ip地址
Referrer Policy: Referrer策略,当咱们在页面中请求图片、Js、接口的时候浏览器通常会加上表示来源的Reffer数据,该数据有5个值。
* no-referrer: 全部状况下都不发送referrer * no-referrer-when-downgrade: 协议降级时不发送 Referrer 信息,好比Https页面中请求http资源,大部分浏览器默认所采用的 * Origin Only: 发送只包含host部分的Reffer信息,好比“101.101.0.3/main的referrer”值就是“101.101.0.3” * origin-when-crossorigin: 只有跨域是才发送只包含host部分的reffer值,(域名,协议,端口其中任何一个值不一致则被认为是跨域) * unsafe-url: 不管任何状况下都发送reffer信息,不多使用
包含3部分,请求行、请求首部、请求体。
相似于上图的一串数据,默认为空
请求首部就是客户端向服务器提供的额外信息,好比User-Agent代表客户端身份,代表客户端的身份,常见的请求首部以下:
Get类型的请求请求内容是有长度限制的,好比IE中限制是2KB,Post中无限制。
HTTP响应是服务器在接收客户端发送请求后通过一些处理而作出的响应,Http响应与Http请求相似,也由三个部分组成,分别是:状态行,响应头,响应正文
与Http请求状态行一致,不深究
响应头就是服务端想客户端提供的额外信息,常见的响应头以下:
与Http请求正文一致,区别是数据由服务度发送给客户端
因为Http协议是一个无状态协议,该协议不能保存客户信息,一旦数据传输完毕,下次数据请求须要从新链接,因此须要会话跟踪
简单一点理解就是Cookie是服务端颁发给客户端的一个通行证,用来确认客户信息,浏览器获得这个通行证后,会在本地保存起来,当浏览器再次请求该网站是,浏览器将这个通行证一并提交给服务器,服务器检查该通行证,一次来确认用户信息。
Cookie在请求头和响应头之间来回传递,因此客户端与服务端都能获取到Cookie数据。
在不理解Http协议是一个无状态协议的状况下,初学者每每会有一个误区,认为Session是保存在服务端的,当服务端与客户端链接关闭的时候Session会被清空。
正确的理解应该是Session实际上是一个特殊的Cookie。
举个例子:
上图在koaJs中添加session
上图是服务端返回的cookie,这个cookie与通常的cookie的区别是是带一串session标识加密字符串(koa:sess.sig=Dp_qBm3JsJX1rxvx9kgEQi64TV0)
上图是客户端发送的cookie,与通常的cookie的区别也是呆了一串session标识加密字符串
对比cookie:
目前大部分网站使用的都是Http1.1协议,Http1.1协议存在如下缺点
了解Http2一开始可能会有两个误区
HTTP/2 采用二进制格式传输数据,而非HTTP1.1 中的文本格式,对于计算机解析起来会更高效二进制协议解析起来更高效。
在同一个域名下,Http2只会建立一个Tcp或者Tls链接,减小了链接数,对于多个资源的页面Http1.1中会建立6~8个链接。
而且因为Tcp的滑动链接(链接刚开始数据传输很慢,后续会愈来愈快),Http1.1中多个Tcp链接会致使每一个资源的请求都至关慢,Http2中因为只建立一个链接,完美的避免了这种情形。
Http2中的这个链接能够承载任意数量的双向数据流。每一个数据流都以消息的形式发送,而消息由个帧(HTTP2中数据通讯的最小单位)组成。多个帧之间能够乱序发送,由于根据帧首部的流标识能够从新组装。
关于帧的格式(官方)以下:
+-----------------------------------------------+ | Length (24) | +---------------+---------------+---------------+ | Type (8) | Flags (8) | +-+-------------+---------------+-------------------------------+ |R| Stream Identifier (31) | +=+=============================================================+ | Frame Payload (0...) ... +---------------------------------------------------------------+
多路复用是经过在一个流上分配多个HTTP请求响应交换来实现的。流在很大程度上是相互独立的,所以一个请求上的阻塞或终止并不会影响其余请求的处理。下图一目了然
HTT2在客户端和服务器端使用“请求对照表”来跟踪和存储以前发送的请求头key-value,对于相同的数据,再也不经过每次请求和响应发送;
在必定的时间内,在HTTP/2的链接存续期内始终存在,由客户端和服务器共同渐进地更新;
每一个新的首部键-值对要么被追加到当前表的末尾,要么替换表中以前的值
而且Http2对请求头进行数据进行“HPACK”数据压缩,╯□╰说实话我也不知道这个是个什么鬼~
服务端能够在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端能够主动把 JS 和 CSS 文件推送给客户端,而不须要客户端解析 HTML 再发送这些请求。
该如何开启,如何设置,好像没有比较好的教程~
资源传输设置优先级,好比优先加载js脚本,让页面尽快出现动态效果
还没研究过怎么进行设置~
http状态码:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
浏览器缓存:https://segmentfault.com/a/1190000012233230
Session原理:https://zhuanlan.zhihu.com/p/33925382