http2.0所有数据以二进制进行传输,
同一个连接里面发送多个请求不再按顺序来
头信息压缩以及等提高效率的功能,头压缩减少带宽,请求html同时提前推送js,css资源。
http1.1之后,发送一个http请求,会建立一个tcp连接,该链接在请求返回后不会关闭,下次发送其他http请求,会继续使用该链接。
抓包工具:wireshark (传输层, 网络层都可以抓), Charles
tcp三次握手
seq = 0
seq = 0 ack =1
seq = 1 ack = 1
第一次握手,发送SYN报文,传达信息:“你好,我想建立连接”;
第二次握手,回传SYN+ACK报文,传达信息:“好的,可以建立链接”;
第三次握手,回传ACK报文,传到信息:“好的,我知道了,那我们连接”。然后就建立连接了。
uri, url, urn uri包括 url, urn
uri Uniform Resource Idetifier /统一资源标志符,唯一标识互联网上的资源
url Uniform Resource Locator /统一资源定位符
ftp协议也可以获取网络资源
urn 永久资源定位符 使用较少
在命令行中发起http请求 curl -v www.baidu.com
关于跨域:浏览器发送请求后,即使跨域。服务端也会返回信息,只是此时浏览器没有检测到access-control-allow-origin已设置允许跨域的域名,直接忽略返回内容,并报错
link, image, script标签无跨域限制
跨域限制:
X-Test-Cors设置后, Access-Control-Allow-Origin不允许跨域
Get , Header, Post 默认允许跨域, 其他请求方法浏览器会进行预请求验证
Content-Type设置为text-plain, multipart/form-data, application/x-www-form-urlencoded默认允许跨域,其他类型浏览器需要进行预请求
什么是预请求:
Access-Control-Allow-Headers: 'X-Test-Cors' 设置允许跨域的请求头
浏览器请求头设置X-Test-Cors:''的值后,发送正式请求之前,浏览器会先发送一个options请求,用来验证当前设置的请求头是否被允许跨域使用
其他的预请求验证还有:
Access-Control-Allow-Method:' POST, PUT, DELETE'
Access-Control-Max-Age: '1000' 预请求保存的最长有效时间 单位s 1000s之内不用再进行预请求验证
Cache-Control
可缓存性:
public 是指在http请求返回的内容所经过的任何路径中都可以将其缓存
private 不允许代理服务器缓存(中间经过的路径)
no-cache 可以使用缓存,但是每次都要验证
到期
max-age 单位秒
s-maxage 会覆盖max-age,只在代理服务器生效
max-stale (浏览器中很少用)
重新验证(浏览器中用的比较少)
must-revalidater
proxy-revalidater 使用在缓存服务器中
其他:
no-store 浏览器和代理服务器都不可以使用缓存
no-transform 使用在缓存服务器中,禁止转换返回内容
实例:Cache-Control: 'max-age = 200, public' 多个用逗号隔开
max-age后,如果时间没有到期,即使服务器资源进行了修改,浏览器端还是会使用本地的缓存。
解决上面问题的方法:资源url路径加内容计算出来的hash值
cache设置 no-cache时, 每次都会进行缓存验证
验证头:
Last-Modified 上次修改时间 , 配合If-Modified-Since和If-Unmodified-Since(使用较少)使用
上面的是对比最后修改时间,判断资源有没有被修改
ETag 数据签名 根据内容生成的hash值 对比浏览器端和服务端的Etag是否一致
实例:设置no-cache后才可以使用ETag和Last-modified
服务端设置
Cache-Control: 'max-age = 200000,no-cache',
ETag:'777',
Last-Modified:'123'
浏览器第一次请求时接收到上面的请求头信息,浏览器在下次发送请求时,会带上下面两个值
If-Modified-Since: 123,
If-Modified-Match: 777
此时服务端的逻辑设置为:
const ETag = request.headers['if-modified-match'];
if(ETag === '777'){
response.writeHeader(304,{
Cache-Control: 'max-age = 200000,no-cache',
ETag:'777',
Last-Modified:'123'
})
response.end('')
}
对于If-Modified-Since对比的是最后的修改时间,服务端在修改资源后,可以在数据库存储该资源最后的修改时间
Cookie
通过set-cookie设置
下次请求会自动带上
键值对形式,可以设置很多个
cookie属性
max-age,expires设置cookie过期时间
max-age代表cookie有效时间有多长
expires是指cookie到期的时间点
Secure只在https的时候发送
HttpOnly无法通过document.cookie访问
实例:
response.writeHeader(304,{
'Cache-Control': 'max-age = 200000,no-cache',
’Set-Cookie': 'id=123'
})
子域名获取主域名设置的cookie
服务端:
const host = request.headers.host;
if(host === 'a.test.com'){
'Cache-Control': 'max-age = 200000,no-cache',
’Set-Cookie': 'id=123;max-age=200'
}
chrome工具 Host Admin 映射域名和ip
设置所有子域名都可以访问主域名的cookie
只需要设置cookie中的domain = test.com
’Set-Cookie': 'id=123;max-age=200;domain=test.com'
session
cookie不等于session
Http长连接
chrome最大并发 6个 最多一次6个不同的TCP连接
connect:'keep-alive' | 'close'
http2有信道复用, 所有的请求复用一个tcp连接 (同域名)
数据协商
分类:请求 返回
请求:
Accept 指定想要的数据类型
Accept-Encoding
Accept-Language
User-Agent 浏览器相关信息 系统版本 浏览器内核 渲染引擎的版本 chrome版本号 等等
返回
content
Content-Type : 数据的格式
Content-Encoding 数据压缩的方式
Content-Language 是否按照请求设置的语言返回
node中使用zlib包压缩数据
res.end(zlib.gzipSync(html))
Redirect
指定302
response.writeHeader(302,{
'Loaction' : '/new'
})
指定301
response.writeHeader(301,{ //将路径永久重定向,由浏览器重定向请求
'Loaction' : '/new'
})
设置请求头:vary 当请求头是同一个值时,才会使用缓存(针对代理缓存)
Cache-Control:"s-maxage=200"
vary: "X-Test-Cache"
X-Test-Cache的值相同时,才可以使用缓存
Https
加密
私钥
公钥 放在互联网上的加密过的字符串,所有人都可以拿到,用来对传输的信息加密
公钥和私钥在握手的时候传输
https握手过程
https默认使用443端口
nginx配置https http重定向到http