HTTP
网络协议分层
-
经典五层模型
-
物理层主要作用是定义物理设备如何传输数据(硬件设备相关——网卡端口、网线、光缆)
-
数据链路层在通信的实体间建立数据链路连接(创建链路连接0101)
-
网络层为数据在节点之间传输创建逻辑链路(寻找服务器网络地址)
-
传输层向用户提供可靠的端到端(End-to-End)服务,向高层屏蔽了下层数据通信的细节
- TCP/IP协议
- UDP协议
-
应用层为应用软件提供服务,构建于TCP协议之上,屏蔽网络传输相关细节
HTTP发展历史
- HTTP/0.9
- 只有一个命令GET
- 没有header等描述数据的信息
- 服务器发送完毕,就关闭TCP连接
- HTTP/1.0
- 增加了POST等命令
- 增加status code和header
- 多字符集支持、多部分发送、权限、缓存等
- HTTP/1.1
- 持久连接
- pipeline
- 增加host和其他一些命令
- HTTP2
- 所有数据以二进制传输
- 同一个连接里面发送多个请求不再需要按照顺序来
- 头信息压缩以及推送等提高效率的功能
HTTP三次握手
- 规避网络延迟导致的数据开销浪费
URI/URL/URN
- URI(Uniform Resource Identifier)统一资源标志符,用来唯一表示互联网上的信息资源,包括url和urn
- URL(Uniform Resource Locator)统一资源定位器
- http://host.com:80/path?query=string#hash
- http:skema 协议,https/ftp等
- host.com:定位资源服务器所在位置,可以是ip也可以是域名
- 80:端口,一个服务器可以起多个web服务,通过端口区分,默认为80
- path:路由
- query=string:传参
- hash:哈希作为锚点
- URN 永久统一资源定位符,在资源移动之后还能被找到
HTTP报文
- 请求报文
//起始行
GET /test/hi-there.txt HTTP/1.0
/*
GET:方法
/test/hi-there.txt:请求资源地址
HTTP/1.0:协议版本
*/
//头部
Accept:text/*
Accept-Language:en,fr
- 响应报文
//起始行
HTTP/1.0 200 OK
/*
HTTP/1.0:协议版本
200:Status Code
OK:Status Message
*/
// 头部
Content-type:text/plain
Content-length:19
// 主体
Hi!I am a message!
HTTP方法
- HTTP方法:用来定义对资源的操作
- 常用有GET/POST等
- HTTP Code
- 定义服务器对请求的处理结果
- 各个区间的CODE有各自的语义
HTTP特性
-
curl -v url
-
跨域
-
允许方法:GET/HEAD/POST
-
允许Conent-Type
- text/plain
- multipart/form-data
- application/x-www-form-urlencoded
-
其他限制
- 请求头限制
- XMLHttpRequstUpload对象均没有注册任何事件监听器
- 请求中没有使用ReadableStream对象
-
突破浏览器跨域限制的方法
- jsonp
-
<script src="">
src引入需要访问的服务器函数
-
- 响应头控制,浏览器会发送method为optios的预请求来验证
'Access-Control-Allow-Origin':'*', 'Access-Control-Allow-Headers':'X-Test-Cors',// 自定义响应头 'Access-Control-Allow-Methods':'POST,PUT,DELETE', 'Access-Control-Max-Age':'1000',
- jsonp
-
-
缓存cache-control
- 可缓存性
- public:返回内容所经过的任何路径当中http代理服务器、客户端浏览器都可对返回内容进行缓存
- private:发起请求的浏览器可进行缓存
- no-cache:可以缓存,但是需要在服务器验证可使用缓存,才能使用缓存
- no-store:任何节点均不作缓存
- 到期
- max-age= xx秒
- s-maxage= xx秒(在代理服务器生效)
- 重新验证
- must-revalidate(过期必须去原服务端重新请求)
- proxy-revalidate(在代理服务器生效)
- 可缓存性
-
缓存验证
- 验证头
- Last-Modified
- 上次修改时间
- 配合If-Modified-Since使用
- 对比上次修改时间以验证资源是否需要更新
- E-tag
- 数据签名:资源对内容产生唯一的数据签名(Hash计算)
- 配合If-Match使用
- 对比资源的签名判断是否使用缓存
- Last-Modified
- 验证头
-
cookie和session
- cookie
- 通过Set-Cookie设置
- 下次请求会自动带上
- 是键值对,可以设置多个
- cookie属性
- max-age和expires设置过期时间
- secure属性代表只在https的时候发送
- HttpOnly无法通过documents.cookie访问
- cookie
HTTP长连接
- Connection:keep-alive 保持长连接
- 并发数最多6个,即当保持长连接时,前6个同域请求的connectionId相同,即不需要重复创建TCP连接,减少时间损耗
HTTP数据协商
- 分类
- 请求
- Accept:想要的数据类型
- Accept-Encoding:限制服务端数据压缩
- Accept-Language:返回的语言
- User-Agent:浏览器信息
- 返回
- Content-Type:返回的数据格式
- Content-Encoding:数据压缩方式声明
- Content-Language:返回语言
- 请求
HTTP Redirect
- 在response Header中增加Location,responseCode可以是302(临时跳转),可以是301(永久跳转)
HTTP CSP(内容安全策略)
- Content-Security-Policyontent-Security-Policy
- 限制资源获取
- 报告资源获取越权
- 限制方式
- defalut-src限制全局
- 指定资源类型
HTTPS
- http是明文传输的,因此不安全
- https
- 加密
- 私钥 服务器通过私钥解密,只放在服务器
- 公钥 放在互联网上所有人均可拿到的加密字符串,通过公钥加密数据
- 握手过程:
- 客户端生成随机数,然后传输到服务端,中间会带上客户端支持的加密套件
- 服务端拿到随机数后存储,并且也生成一个随机数,该随机数和公钥一起传输给客户端
- 客户端拿到随机数后存储,并根据拿到的公钥生成预主秘钥,并生成一个通过公钥加密的随机数,并传输给服务端
- 服务器端通过私钥解密,拿到预主秘钥
- 客服端和服务端同时对以上三个随机数进行算法操作,生成一个主秘钥,后期传输的数据均通过该主秘钥进行加密和解密
- 加密
HTTP2
- 优势
- 信道复用
- 分帧传输
- Server Push
网友评论