目录
[TOC]
#谈谈http1.0 ,1.1 ,2.0
http1.0主要规定了浏览器与服务器只保持短暂的连接,浏览器每次请求都需要向服务器建立一个TCP连接,服务器处理完之后,断开TCP连接
http1.1协议是一个标准化的协议,针对http1.0的缺陷进行了改进
- 连接可复用,节省了三次握手和四次挥手的时间,在并发高的时候性能有很大的提升,可以通过设置connection:close在每次请示处理完之后关闭连接,http1.1默认请求头中connection:keepalive。
- 引入额外的缓存控制机制
- 引入内容协商
- 支持响应分块
- 允许在第一个应答被完全发送之前发送第二个请求,降低通信延迟
- 安全级别更高
http2.0
- 所有数据二进制传输
- 赋予请求优先级:为请求分配优先级顺序,主要是为了在同一个连接里面发送多个请求时,解决因带宽低而导致响应变慢的问题,发送多个请求时不再需要按顺序发送
- 头信息压缩(有效减少带宽使用)
- server push(服务端主动推送消息至客户端)
- 信道复用:通过单一的TCP连接,无限制处理多个HTTP请求,所有请求都在一个TCP连接上完成,因此TCP的处理效率得到了提高
- 分帧传输
- 服务器提示功能:服务端主动提示客户端请求所需的资源,如果客户端提前知道所需要的资源,并且本地已经缓存的情况下,可以避免发送不必要的请求
HTTPS
我们在电脑或者手机上打开网页时,有时候会看到一些很突兀的广告,这其实就是http的通信内容被第三方篡改了,强行插入的内容
由于http协议传输的文本数据是没有加密的,都是明文传输,所以在网络传输过程中可能存在窃听风险、篡改风险、冒充风险,https主要通过对通信内容协商加密、对通信内容增加校验机制、配备证书,解决了http协议存在的三种风险
https协议在http和TCP协议之间增了TLS/SSL加密层,使用HTTPS
时
- 先用
非对称加密
传输密码,然后用这个密码对称加密数据
,使得第三方无法获得通信内容 - 发送方
将数据的
哈希结果写到数据中,
接收方解密后对比数据的
哈希结果,如果不一致则说明被修改。由于传输数据加密,第三方无法修改哈希结果。
由
权威机构颁发证书,再加上
证书校验机制,避免
第三方伪装`参与通信.
GET 和 POST 的区别
GET请求通常用于
查询、获取数据,而
POST请求则用于
发送数据、
GET所有数据都显示在URL中,安全性较差,POST数据不会显示在URL中,在发送敏感数据时,要使用POST,因为POST请求不会被浏览器历史记录保存
GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
GET书签可收藏,POST为书签不可收藏
GET能被缓存,POST不能缓存
GET发送数据时对数据长度有限制最大为2M,POST无限制
GET只允许 ASCII字符。POST没有限制。也允许二进制数据。
CORS ( Cross-Origin Resource Sharing )
CORS,跨域资源共享,它允许浏览器向跨源服务,发出请求,从而克服AJAX只能同源使用的限制。
跨域访问只会在浏览器访问时才才会出现,使用curl访问时,是不会出现跨域问题的。
- 跨域的时候允许的请求方式:get、head、post ,其它请求是不允许跨访问的,需要预请求判断是否支持跨域(OPTIONS)
- 跨域的时候允许的Content-Type: text/plain、multipart/form-data、application/x-www-form-urlencoded
解决域中的方法
- 服务端通过header告诉浏览器支持跨域
- 使用JSONP
header
在服务端响应时候增加header信息如下
1 | 'Access-Control-Allow-Orign': '*' |
*代表,支持任何域名跨域访问
但这样做是不安全的,我们可以限制只有固定域名可以跨域'Access-Control-Allow-Orign': 'http://domain.com'
这种方法只能设置一个域名,如果是多个域,可以在后端服务做判断,对于允许的域名响应时设置该响应头信息
只有拿到响应的头信息浏览器才知道是否支持跨域。浏览器发起的真实请求已经被服务器处理,并已交内容返回至浏览器,只是浏览器会根据响应中的跨域设置,对请求返回内容进行了处理。
其它头信息
- ‘Access-Control-Allow-Headers’: ‘X-TEST-CORS’ //允许跨域的头信息
- ‘Access-Control-Allow-Methods’: ‘PUT,DELETE’ //允许跨域的方法
- ‘Access-Control-Max-Age’: ‘1000’ //用一标识允许在1000秒不再发送OPTIONS预请求。时间单位是秒
jsonp实现方式
原理
其实在网页中,浏览器对于link,script,image标签中加载的请求,是允许跨越访问的,Jsonp就是利用这种方式,访问到服务器的内容,对内容进处理后,现返回的。
缓存
Cache-control 可缓存性
public: 是指请求返回的过程中,所经过的路径中,包括中间的代理服务器,都可以对返回内容进行缓存
private: 只有发起请求的客户端才可以缓存
no-cache: 任何地方都不可以缓存,每次请求会经过服务器验证,是否可以使用缓存
no-store客户端不会发送任何和缓存的请求头,直接忽略缓存
到期
max-age=
//客户端会使用max-age s-maxage=
//只有在代理服务器中才生效 max-stale=
//发起请求主动携带此请求头,表示如果缓存已经过期了,客户端可以在max-stale这个时间内还可以使用过期的缓存,而不去请求新的内容 重新验证
must-revalidate max-age缓存已过期 ,必须到源服务端验证获取数据
proxy-revalidate //使用在缓存服务器,指定缓存过期后,必须到尖服务器获取数据
其它
no-store 永远到服务器端拿最新的数据
no-trasform 禁止代理服务器,对返回的数据进行压缩或其它处理对于代理服务器的请求头都是约定,只是一种规范,没有强制性限制,代理服务器可以遵守也可以不遵守
示例
1
'Cache-Control': 'max-age=10000 , no-cache'
使用技巧
如果过期时间设置得不合理时,会导致客户端缓存的时间过长无法获取到最新的数据,这也是我们前端开发常见的问题
将打包完成的js,根据内容进行hash将hash码追回到js文件名中,页面中引用新的文件名,这样就可以达到一个更新缓存的目的,这也是一种常用的方案。
数据验证
Last-Modified
服务端返回头信息Last-Modified,告诉客户端资源的上次修改时间,客户端后续请求会带着请求头,If-Modified-Since
或If-Unmodified-Since
,对应的值是服务端 之前返回的Last-Modified
的值,服务端会对比上次修改时间和头信息的时间,服务器会通知客户端是否可以直接使用缓存
Etag(数据签名)
对资源的内容进行签名,如果数据有修改,数据签名就会发生变化,最简单的实现方法就是对资源内容进行HASH计算,得到一个唯一的标识,将hash值通过etag头返回给浏览器,
浏览器器会在将etag的值,在请求时候通过 If-Match或者If-None-Match请求头带上,服务器端对比头里面的etag和服务端真实的etag,告诉浏览器是否可以使用缓存
重定向(Redirect)
302(临时重定向)
通过302,服务端告诉浏览器你需要的资源在哪里,去指定地址去加载,浏览器会再发送请求到重定向的地址获取资源
服务端响应状态302 + 在头信息中增加Location告诉客户端所请求的资源临时重定向到的地址
301(永久重定向)
如果是永久跳转,可以使用301 + Location
301指定资源永久跳转,浏览器下次访问的时候,会直接指向新的地址,浏览器会尽可能时间长的缓存301重定向的地址,除非主动清理缓存,下次访问会从disk cache直接获取
使用时候要谨慎,使用之服务端无法控制
CSP ( Content-Security-Policy )
限制浏览器只能通过http和https来访问,无法通过inline script执行
'Content-Security-Policy' : 'default-src http: https:'
在html中写 这种方法称为inline script
限制只能加载本站的域名脚本
'Content-Security-Policy':'default-src \'self\''
目的是为了防止被嵌入脚本后,执行外部有风险的脚本,这种方式也会影响图片不可以使用外链,只能加载本站脚本和图片
上一条中会影响图片加载,可以使用如下配置,只对脚本作限制
'Content-Security-Policy':'script-src \'self\''
限制只能访问本站和指定网站的资源
'Content-Security-Policy':'default-src \'self\' http://albk.tech/'
限制FORM表单提交到其它域名
'Content-Security-Policy':'default-src \'self\'; from-action \'self\''
发生CPS设置的情况时候产生cps-report报告
'Content-Security-Policy':'script-src \'self\'; from-action \'self\'; report-uri /xxx'
xxx接收报告的本站路径
设置只产cps-report不限制加载
'Content-Security-Policy-Report-Only':'script-serc \'self\'; from-action \'self\'; report-uri /xxx'
除了header其它实现方式
可以在html中使用meta标签
<meta http-equiv="Content-Security-Policy" content = "script-serc 'self'; from-action 'self'">
meta中无法使用; report-uri /xxx,如果要使用report-uri必须使用header
其它策略指定
- child-src
- connect-src
- font-src
- img-src
- media-src
- object-src
- script-src
- style-src
- form-action
参考资料: CPS策略指令
数据协商
请示
- Accept,指定需要的数据类型
- Accept-Encoding 数据以什么方式压缩传输
- Accept-Language:接受的语言类型
- User-Agent :表示浏览器的一些信息,可用于判断返回PC或者H5页面
返回
- Content-Type : 返回的数据格式
- Content-Encoding: gzip
- Content-Language
- X-Content-Type-Options: nosniff
IE浏览器,会自动预测返回的内容,导致一些安全问题, 这引头会禁止自动预测
- Vary: ‘X-Test-Cache’
除了针对URL做缓存,还可以对不同的Vary进行区分,来缓存
设置了Vary之后,只能Vary的值和value相等时才会使用缓存,一般用于区分 PC ,H5 ,APP端或者判断语言类型,对不同的值 进行判断,实现细粒度的缓存
http长连接
因为http请求底层是TCP连接,建立需要三次握手,断开连接需要四次挥手,每次创建连接是一个很大的开销,如果客户端,可以维护一些固定大小的长连接,是可以很在程序上提升效率。
一般浏览器会维护一定大小的长连接,比如chorm浏览器默认是对同一个域名维护6个长连接,如果同一个域名请求过多,就出现了排队现象
在电商网站请求同一域名请求校多的时候,就会拆成不同的域名来优化网站响应速度,例如我们会看到一些网站打开,会看到通过http://img1.albk.tech,http://img2.albk.tech不同的域名去加载图片
Cookie
- Set-Cookie设置cookie
- max-age和expires设置过期时间
- Secure只有在https的时候才发送
- HttpOnly无法通过document.cookie访问,可防止CSRS攻击
TCP和UDP的区别
TCP协议是面向有连接的字符流传输,在使用TCP协议之前,需要客户端和服务端通过三次握手在双方之前建立连接,会有数据重传、流量控制等功能保证数据可以无差错、不丢失、不重复、按序传输。
TCP连接是点到点的全双工可靠信道。
TCP首部开销20字符
UCP协议是面向无连接的报文传输,UDP尽最大努力交付,但是不保证可靠交付。
UDP支持一对一、一对多、多对多、多对一的不可靠信道
UDP首部开销只有8字节
sendRedirect与foward区别
foward是服务器端控制页面转向,在客户端的浏览器地址中不会显示转向后的地址
sendRedirect则是完全的跳转,浏览器中会显示跳转的地址并重新发送请求链接。
原理:
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后再将这些内容返回给浏览器,浏览器根本不知道服务器发送的这些内容是从哪来的,所以地址栏还是原来的地址。
redirect是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求的那个地址,浏览器会用刚才的所有参数重新发送新的请求。
再谈HTTPS
共享密钥加密:加密和解密使用同一个密钥,但是如何在互联网上安全的转移密钥,这是共享密钥的一个困境
公开密钥加密:加密和解密使用一对非对称的密钥,一把叫公钥,一把叫私钥,公钥任何人都可以获得,加密后的数据只有私钥可以解密
- HTTPS采用混合加密机制:使用公开密钥加密后安全的交换稍后在共享密码加密中要使用的密钥,在确保交换的密钥是安全的前提下,使用共享密钥加密方式进行通信
可能聪明的你已经发现,如何证明公开密钥是正确的?
HTTPS协议引入了数字证书认证机构或相关机构办法的公开密钥证书,证书中包含两部分信息服务器的公开密钥
、数据证书认证机构的数据签名
,
服务器将这份由数据证书认证机构办法的证书发送给客户端
客户端拿到证书后,使用公开密钥向数据证书认证机构确认证书上的数据签名正确,是确保服务器的真实性
认证通过可以说明公开密钥的是可信的
如何将证书安全的转移至客户端
大多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥,以确保公开密钥安全转移
服务端如何校验客户端的真实性
HTTPS中可以使用客户端证书,客户端证书一秀是由安全性极高的认证机构颁发的证书,因为客户端证书是收费的, 一般用于特殊的业务,比如网上银行,确认使用的终端是授权的
HTTPS这么安全为不一直使用HTTPS呢
- 因为HTTPS的每次通信都会加密,这会消耗更多的CPU、内存等资源及大影响了服务器性能
- 并不是所有网站、所有业务的数据都是敏感数据,一般只在包含敏感数据时才使用HTTPS加密通信
- 如果一直使用HTTPS,对于访问量较高的网站,会影响网站的性能
- HTTPS证书的开销也是需要考虑的因素
- HTTPS要比HTTP慢2-100倍
OSI七层模型
应用层:FTP,DNS,HTTP都属于该层
表示层:数据的表现式,如加密
会话层:对应用会话的管理同步
传输层:提供处于网络连接中的两台计算机的数据传输,TCP,UDP都属于该层,主要解决了端口到端口的问题
网络传输层:用来处理在网络上流动的数据包,作用不是在众多的选项内选择一条传输路线,路由器工作在该层,主要记录了,源IP,目标IP
链路层:用来处理连接网络的硬件部分,硬件上的范畴都在链接层的作用范围内,交换机工作在该层,主要是基于源的自动学习 ,源MAC,目标MAC
物理层:网线,网口
交换机的记录了IP与端口
路由器记录了网段与端口