2018-09-17

2018-09-17  本文已影响0人  zhangyu_2943

http协议

五层模型介绍

解析:

HTTP协议的发展历史

第一个版本 HTTP / 0.9

第二个版本 HTTP / 1.0

第三个版本 HTTP / 1.1

第四个版本 HTTP / 2.0


HTTP三次握手

URI,URL和URN

urn作用在于搬动了资源后仍然可以直接找到,相当于面向对象命名。
框架一般都会出现这个概念,方便多次调用的东西都可以理解为urn,-。
个人理解

完整的URL地址:http://user:pass@host.com:80/path?query=string#hash

HTTP报文格式

HTTP方法

 用来定义对于资源的操作
 常用有GET、POST
 从定义上讲有各自的语义

HTTP CODE

定义服务器对请求的处理结果
各个区间的CODE有各自的语义 
好的HTTP服务可以通过CODE判断结果

method :

GET:获取数据
POST:创建数据
PUT:更新数据
DELETE : 删除数据

CORS跨域请求的限制和解决

CORS跨域请求的限制及预请求限制

在跨域的时候

1.默认允许的方法只有GET、HEAD、POST ,其余 PUT 、DELETE 都是默认不允许的,浏览器会预请求去验证的。
2.默认允许的 Content-Type 有 text/plain、multipart/form-data、application/x-www-form-urlencoded 其余Content-Type 都需要 预请求验证
3.其他限制:请求头限制、XMLHttpRequestUpload 对象均没有注册任何事件监听器、请求中没有使用 ReadableStream 对象

Cache-Control的含义和使用

客户端从服务器请求数据经历如下基本步骤:
1、如果请求命中本地缓存则从本地缓存中获取一个对应资源的"copy";
2、检查这个"copy"是否fresh,是则直接返回,否则继续向服务器转发请求。
3、服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。
4、客户端更新本地缓存。

no-cache的作用是:强制客户端跳过步骤2,直接向服务器发送请求。也就是说每次请求都必须向服务器发送。

must-revalidate:作用与no-cache相同,但更严格,强制意味更明显。但这只是理论上的描述,根据我在ff6上的测试,它几乎不起作用:只要请求的频率加快到一定程度,服务器就接收不到请求。

no-store:缓存将不存储response,包括header和body。测试结果表明,除每次请求都必发送到服务器外,响应代码均是200,且request并没有发送"If-Modified-Since"和"If-None-Match"头,这意味着缓存的确没有存储response。

以上三者都是要求客户端每次请求都必须到服务器进行revalidate,此功能还可以通过max-age实现: Cache-Control:max-age=100

有max-age,服务端内容更新后,希望客户端能获取新的静态资源

解决:加上hash码,内容不变,hash码不变,内容变了,hash码变了,请求的url变化,就可以获取更新的文件

重新验证:

must-revalidate:缓存过期后,必须去原服务端发送这个请求,重新获取这部分数据,验证是否真的过期
procy-revalidate:和上面的差不多,用在缓存服务器
其他:
no-store: 不能缓存,只能每次从服务器拿
no-transform:不压缩、转换返回内容
这些声明都没有强制效应

可缓存性:

public:http返回的内容经过的任何路径都可以对返回内容进行缓存
private:发起请求的浏览器才可以缓存
no-cache:可以在发起端进行缓存,要服务器验证才可以使用缓存
到期:
max-age=seconds 到期多少秒,再次请求
s-maxage=seconds 代替max-age 在代理服务器内生效
max-stale=seconds 返回的资源有这个属性,即便缓存已经过期,在这个时间内还可以继续使用已经过期的缓存

静态资源解决方案:把实际打包完成的js文件上的文件名上加上一串hash码,如果内容没有变化,hash码不会变化,如果内容有变化,则hash码也会变化。这样可以达到更新缓存的目的

no-cache:本地可以用使用缓存,但需要服务器验证后才能使用
no-store:本地和代理服务器都不能存储缓存,都需要从服务器端重新请求
no-transform:告诉代理服务器不能随便改变返回的内容
must-revalidate:当缓存到期后,不能直接使用本地缓存数据而需要重新验证
proxy-revalidate:缓存服务器上,必须去原服务器重新请求一遍,不能使用本地缓存

到期:

max-age=<seconds> 服务器缓存到期时间
s-maxage=<seconds> 代理服务器缓存的到期时间
max-stale=<seconds> 到期后,即便缓存过期,只要在max-stale时间内,依然有缓存

其他

1,no-store 本地和代理服务器都不可以存缓存
2,no-transform 代理服务器不要去改动返回内容
no-store(本地和代理服务器都不可以缓存),no-transform(主要用在代理服务器,不允许改动服务器返回的内容)

缓存头Cache-Control:

一、可缓存性(哪些地方可以缓存):public(任何地方都可以), private(发起请求的浏览器可以进行缓存),  no-cache(任何地方都不可以)
二:时间限制:max-age = <seconds>, s-max-age = <seconds>(专用在代理服务器中),max-stale = <seconds>(发起请求端设置的)
三:重新验证:must-revalidate(时间过期必须去原服务端重新获取数据),proxy-revalidate(和must-revalidate类似,用于缓存服务器中)

缓存验证Last-Modified和Etag的使用

HTTP验证头:

1,Last-Modified 上次修改时间
配合If-Modified-Since使用
对比上次修改时间以验证资源是否需要更新
2,Etag
数据签名,对响应内容产生一个唯一的字符串。
配合If-Non-Match使用
对比资源的签名判断是否使用缓存

cookie

domain
访问域设定
cookie只能一个域访问
a.com的cookie b.com不能访问
domain让a.test.com能访问test.com的cookie
不能跨域设置cookie,只能一级通过domain设置二级等

max-age:有效期多长
expires:到期的具体时间
服务端返回数据时通过set-Cookie设置到浏览器内,浏览器保存cookie后,在同域的访问内下次请求会自动带上

max-age 和 expires 设置过期时间
Secure 只在https的时候发送
httpOnly无法通过js访问,浏览器中还是有的。
cookie时效
如果没有设置时间,浏览器关闭失效。
'Set-cookie': ['id=123; max-age=30', 'name=lin'] : id=123->30s后失效

设置test.com以及test.com的所有二级域名享受到cookie

HTTP长连接

Connection:keep-alive(长)、close(短)
http2:信道复用 tcp并发发送http请求
http请求是在tcp上发送的,一个tcp可以发送多个http,http1.1是阻塞的

现在保持长链接比较多
应为多次建立tcp链接可能比长链接的开销更大
长链接可以设置timeout
同个tcp内是有先后顺序的
浏览器可以并发6个tcp

session
用cookie保存sesion将用户登陆key保存到cookie,每次用户请求时读取cookie值,定位用户信息
session:定位到用户

数据协商

服务端返回
X-Content-Type-Options : nosniff
服务端不接受contnettype的数据类型或没设置type,不主动预测类型

浏览器端会自动加上,也可以在ajax时设置
Accept:浏览器能展示的数据格式
Accept-Encoding:能接受的数据压缩格式
Accept-Language:希望接受的语言
User-Agent:系统名 内核 浏览器版本


数据协商:
根据客户端发来的要求,服务端返回对应的数据
Accept 属性
Accept(什么数据类型) Accept-Encoding(编码方式,压缩) Accept-Language(使用的语言) User-Agent(处于哪种系统环境)
Content属性
Content-Type Content-Encoding Content-Language

redirect

通过url去访问资源,资源不在原来的位置,服务器要告诉浏览器,请求的资源在哪里,浏览器再重新请求
Lacation:新url
302:临时跳转 每一次都要通过服务器跳转
301:永久跳转 第二次访问后,就不需要再通过服务器去跳转,是通过浏览器跳转的,被缓存了新url

总结

上一篇下一篇

猜你喜欢

热点阅读