网上笔记参考:html
https://juejin.im/post/5b34e6ba51882574d20bbdd4#heading-8前端
http://dy.163.com/v2/article/detail/DJU2L7E50516W1GE.htmlnode
https://blog.csdn.net/zhanghuali0210/article/details/82080096web
https://www.cnblogs.com/ycxqdkf/articles/10397122.htmlchrome
缓存(cache-control):json
可缓存性(哪里能够缓存):public/任何地方,private/浏览器,no-cache/(能够缓存可是每次都要验证,验证后告诉你用缓存仍是从新请求)后端
到期(缓存可用多久): max-age,s-maxage(代理服务器使用),max-stale(在该值的时间内可使用过时缓存)跨域
从新验证:must-revalidate,proxy-revalidate浏览器
No-store:(本地和服务器都不能存缓存)缓存
No-transform: 不能对缓存进行改动(如: 压缩,转换)
查看资源是走缓存仍是从新请求:
走缓存的条件: 1.响应头设置了cache-control 2.缓存在有效期max-age之内 3. 若是超过max-age有效期或者设置了no-cache时,就要经过last-modified和Etag验证才可用缓存。4.没有设置no-store
缓存验证:1.Last-modified(响应头设置Last-modified即上次修改时间,请求头会带上if-modified-since供服务端与最新修改时间比对是否相等。)2.Etag(数据签名: 内容一旦修改就会修改签名)
同源
跨域实现: 1.jsonP(原理:script和img的src能够跨域,前端定义回调函数,后端拼接,并把数据做为参数传入回调函数一块儿返回给前端调用), 2.access-origin.. ,3. Proxy ...
跨域是浏览器的限制!(有请求和返回,只是浏览器会根据响应头中设置判断是否容许跨域!)
CORS预请求验证: 它的Request Method是OPTIONS。经过OPTIONS请求得到服务端的容许,而后再发送实际的请求。
限制:
默认容许方法: Get,post,head。 其余方法(put,delete等)浏览器须要预请求(method:option)验证。
默认容许的Content-Type:
text/plain、multipart/form-data,applicaton/x-www-form-urlencoded。 其余type须要浏览器预请求。。。
默认容许请求头:https://fetch.spec.whatwg.org里面有介绍容许的头部。 其余请求头须要浏览器预请求。。。
XMLHttpRequestUpload对象均没有注册任何事件监听器
请求中没有使用ReadableStream对象
解决办法:根据CORS标准定义,服务端须要在浏览器的跨域请求响应中包含指定消息头,浏览器根据响应消息头知道是否能够访问跨域资源。以下:
http客户端: 浏览器,curl等(安装curl,并curl -v www.baidu.com)
启动一个node服务: 1.安装node 2.node server.js
URI URL URN
URI(统一资源标识符)包含URL和URN
URN永久统一资源定位符,目的是让资源移动后还能被找到,目前尚未成熟的使用方案。
HTTP发展历史
HTTP/0.9
该版本只有一个命令GET;没有HEADER等描述数据的信息; 服务器发送完毕,就关闭TCP链接。
HTTP/1.0
该版本增长了不少命令;增长status code 和header;多字符集支持、多部分发送、权限、缓存等。
HTTP/1.1
该版本增长了持久链接、Pipeline,增长host和其余一些命令。持久链接会在HTTP特性中介绍;若是没有pipeline,那么Web服务器就须要串行处理请求,而有了pipeline,Web服务器就并行处理请求;而增长host实现了一台物理设备能够运行多个web服务。
HTTP/2.0
全部数据以二进制传输,以前版本使用字符串进行传输;同一个链接 里面发送多个请求再也不须要按照顺序来;头信息压缩以及推送等提升效率的功能。
http发展历史: http/0.9 http/1.0 http/1.1 http/2.0将来(二进制数据传输,并行请求,服务端推送)
Tcp connection(一次tcp链接中可有屡次http请求。三次握手)
wireshark抓包工具,学习并使用一下
三次握手分析!
web开发只须要学习应用层和传输层(顶多接触TCP),其余三层了解便可:
从输入URL到http传输完成流程图:
根据上图知道哪一个阶段用时多,针对该阶段(好比是缓存阶段)进行优化。
http报文:请求(请求首行,请求header, 请求body),响应(响应)
请求报文和响应报文分为起始行、首部(header)和主体(body),请求报文的首部包括三部分,分别是HTTP方法、资源目录和协议,而响应报文的首部包括协议版本、状态码和状态码对应的意思,好比200状态的意思是ok。须要注意的是:HTTP header和HTTP body之间以一行分隔。
请求首行: (1.http方法Get,post(新增),put(修改),delete 2.path 3.http version)
响应首行: (1.http version 2.http code 3.http code的含义)
http code:用于定义服务器对请求的处理结果,各个区间的code有不用的语义。1xx 表示信息响应类,表示接收到请求而且继续处理;2xx 表示成功;3xx 表示重定向;4xx 表示客户端出错;5xx 表示服务器出错。
Cookie
定义:cookie是由服务端响应头的set-cookie设置的,返回给客户端后,此后浏览器每次请求都会带上
过时时间:默认是浏览器关闭后,也能经过max-age和expires设置
secure只在https的时候发送
设置httpOnly后,js便没法经过document.cookie访问cookie(经常使用安全策略)
cookie不能跨域设置。
a.test.com和 b.test.com属于不一样域名,但都是test.com的子域,所以能经过在顶级域名设置domain来实现cookie共享。
HostAdmin App: 相似于DNS的域名:IP映射工具(chrome插件):
TCP长连接:
长链接
咱们知道一个HTTP须要建立一个TCP链接,完成以后就关闭TCP链接,这个成本比较高(由于建立一个TCP链接须要经过三次握手),因此在HTTP/1.1开始支持长链接,请求头标识是Connection:keep-alive。以下图所示,同一个Connection ID表示同一个链接。须要注意的是同一个链接只能是同域请求。
长链接就是一个tcp连接中能够发多个http请求,
即一个connection id表明一个tcp连接。长链接设置: 响应头设置为'Connection': 'keep-alive'
短链接设置:'Connection': 'close'
设置长链接后,一个tcp链接中能够同时发多个http请求,便可以并行。
tcp链接个数的限制: 如谷歌是限制为最多6个,即6个connection id(就是tcp 连接id),6个用完后不会建立新的tcp链接,只能等哪一个tcp链接完了再进入哪一个老的tcp链接。