HTTP

HTTP

网络协议分层

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三次握手

HTTP

URI,URL,URN

URI:Uniform Resource Identifier统一资源标识符,用来位移标识互联网上的信息资源,包括URL和URN
URL:Uniform Resource Locator统一资源定位器
URN:Uniform Resource Name永久同一资源定位符,在资源移动之后还可以被找到,目前还没有非常成熟的方案

HTTP报文

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:用在代理服务器端,告诉代理服务区不要随便改动返回的内容

资源验证

HTTP

验证头

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']