HTTP
网络协议分层
物理层:定义物理设备如何去传输设备
数据链路层:在通信实体之间建立数据链路连接
网络层:为数据在结点之间传输创建逻辑链路
传输层:向用户提供端到端的服务(tcp,udp),传输层向高层屏蔽 了下层数据通信的细节
应用层:为应用软件提供了很多服务,构建于tcp协议之上,屏蔽了网络传输的相关细节
HTTP历史
HTTP/0.9 只有GET,没有header等描述数据的信息,服务器发送完毕就关闭tcp连接。
HTTP/1.0 增加了很多命令,增加了status code和header,增加了多字符集支持、多部分发送、权限、缓存。
HTTP/1.1 支持了持久连接,增加了pipeline在同一个连接里发送多个请求,增加了host和其他命令。
HTTP/2.0 所以的数据以二进制传输,同一个连接里面发送的请求不需要再按照顺序来,头信息压缩及推送等提高效率的功能
HTTP三次握手
URI,URL,URN
URI:Uniform Resource Identifier统一资源标识符,用来位移标识互联网上的信息资源,包括URL和URN
URL:Uniform Resource Locator统一资源定位器
URN:Uniform Resource Name永久同一资源定位符,在资源移动之后还可以被找到,目前还没有非常成熟的方案
HTTP报文
HTTP方法
用来定义对于资源的操作
常用的有GET和POST等
从定义上讲有各自的语义
HTTP CODE
定义服务器对请求的处理结果
各个区间的CODE有各自的语义
好的HTTP服务可以通过CODE判断结果
一个最简单的web服务
const http = require('http');
http.createServer(function(request,response){
console.log('request come',request.url);
response.end('1234');
}).listen(8888);
console.log('server listening on 8888');
CORS跨域请求
response.writeHead(200,{
'Access-Control-Allow-Origin':'*'
})
在要访问的服务器上加上这个头就可以跨域了
<script src='http://127.0.0.1:8887/'></script>
也可以用jsonp的方式,浏览器允许link、img、script标签跨域
CORS的预请求
允许的方法,即不需要预请求
GET
HEAD
POST
允许的Content-Type,即不需要预请求
text/plain
multipart/form-data
application/x-www-form-urlencoded
其他限制
请求头限制
XMLHttpRequestUpload对象均没有注册任何时间监听器
请求中没有使用ReadableStream对象
预请求方法
Request Method: OPTIONS
预请求是method会变成OPTIONS
'Access-Control-Allow-Headers':'X-Test-Cors'
在访问的服务器端设置自定义的头
'Access-Control-Allow-Methods':'POST,PUT,DELETE'
在访问的服务器端设置允许的方法
'Access-Control-Max-Age':'1000'
允许允许跨域请求的最长时间,1000s内不需要再预请求
Cache-Control
可缓存性
- public:http经过的任何节点都可以进行缓存
- private:发起请求的浏览器可以缓存
- no-cache:任何一个节点都不可以缓存,本地可以有缓存,但要等到服务器验证之后才可以使用
到期
- max-age=<seconds>:设置缓存内容多少秒之后过期
- s-maxage=<seconds>:代替max-age,只有在代理服务器中才有效
- max-stale=<seconds>:在max-age过期之后,如果返回的资源有max-stale的设置,表示即便缓存已经过期了,但是在max-stale的期限之内还是可以使用过期的缓存,不需要再从服务器获取
重新验证
- must-revalidate:在设置的max-age的缓存当中,如果已经过期了,必须去原服务器发送请求重新获取数据,再来验证本地缓存是否真正过期,不能直接使用本地的缓存
- proxy-revalidate:使用在代理服务器中
其他
- no-store:彻底的本地和代理服务器都不可以由缓存,永远都要从服务器中区
- no-transform:用在代理服务器端,告诉代理服务区不要随便改动返回的内容
资源验证
验证头
Last-Modified:上次修改时间,配合If-Modified-Since或者If-Unmodified-Since使用,对比上次修改时间来验证资源是否需要更新
Etag:数据签名,配合If-Match或If-Non-Match,对比资源的签名判断是否使用缓存
Cookie
通过Set-Cookie设置,下次请求会自动带上,键值对保存,可以设置多个
属性
max-age和expires设置过期的时间
Secure只在https的时候发送
HttpOnly无法通过document.cookie访问
'Set-Cookie':['id=123;max-age=2','abc=456;HttpOnly']