网络资源
- uri(uniform resource identifier) 统一资源标识符。
- url(uniform resource location) 统一资源定位符,统指绝对路径。
- urn(uniform resource name) 统一资源名。
Http
Http历史版本
报文结构
请求报文
- 第一部分简略信息,包含请求方法、url 和协议版本;或者协议版本和状态码
- 第二部分为请求首部 Header 或者响应首部 Header;
- 第三部分为内容主体
响应报文
请求方法
状态码
- 200: 成功返回响应
- 301: 永久重定向, 客户端第一次访问此 url 时, 告知客户端以后直接访问新的 url, 该状态保存在浏览器缓存中
- 302: 临时重定向, 客户端每次访问此 url 时, 告知客户端重定向到新的 url , 后续访问依然访问当前的 url
- 400: 发送的请求错误, 请求格式错误,或者没有服务器要求的数据
- 401: 没有权限访问, 当前用户没有权限访问此资源
- 403: 请求被服务器禁止
- 404: 请求的 url 不存在, 一般是 url 出错
- 500: 服务器处理请求出现错误
- 501: 服务器超出能力之外的方法,例如:请求的方法服务器不支持
- 504: 来自网关或者代理服务器,请求资源服务器时超时
Http特点
- 无连接 : 不保持客户端与服务器的持久连接
- 无状态 : 它不对请求和响应之间的通信状态进行保存
长连接与短连接
- 长连接: 只需要建立一次 tcp 连接就能进行多次 http 通信
- 短连接: 每有一个http请求就要建立一次tcp连接
- http/1.1 开始默认是长连接的, 若要断开连接,首部为 Connection : close;
- 在 http/1.1 之前默认是短连接的, 若要使用长连接, 首部为 Connection : Keep-Alive
无状态协议
cookie与session
- cookie
- 客户端第一次发送信息到服务器时, 服务器根据该客户端信息编码加密生成一个 cookie
- 服务端将此 cookie 发送给客户端, 客户端发送请求时带有此cookie,服务端就可以区分客户端
- session
- 客户端第一次发送信息到服务器时, 服务器为客户端创建一个session对象, 它包含了客户端的身份信息, 同时为session生成一个sessionId
- 服务端将sessionId传给客户端, 客户端发送请求时带此sessionId, 服务端就可以区分客户端
- 发送
- 服务端通过set-cookie 首部将cookie 和sessionId发送给客户端
- 客户端通过cookie首部将将cookie 和sessionId发送给服务端
Https
http安全问题
- 窃听 : Http使用明文通信, 不保证数据的机密性,内容可能被窃听
- 篡改: HTTP保证不了数据的完整, 有可能被修改
- 冒充: HTTP无法认证用户
通过 ssl(Secure Sockets Layer)/tls(Transport Layer Security) 的方式使 http 变成了安全的https
对称加密与非对称加密
- 对称加密:加密和解密使用同一密钥. 运算速度快, 但无法安全地将密钥传输给数据接收方.
- 非对称加密:加密和解密使用不同密钥. 公钥加密, 私钥解密, 安全但速度慢
问题: 效率低, 耗资源, 一次保证单向安全
- 两者结合: 使用非对称加密去加密"公钥", 保证公钥的安全, 然后使用对称加密的方法
问题: 无法确定对端是网站还是冒充的中间人
数字证书
数字证书认证机构 (CA, Certificate Authority) 是客户端和服务器双方都信任的第三方机构
- 功能 : 标识身份
- 过程: CA机构根据公钥以及网站信息生成数字证书 -- 拿到数字证书, 是信任的CA机构, 使用其公钥加密
- 问题: 如何确定证书是有效的 -- 数字签名
数字签名
- 功能: 验证证书有效
- 过程
- CA网站收到网站信息和公钥后-->hash运算-->拿到较短的哈希字符
- CA也生成一对专门用于"数字证书"的公钥和私钥-->使用私钥加密哈希字符-->数字签名 --CA将含有数字签名的证书发给服务端
- 客户端拿到证书后进行验证
- 使用CA证书的公钥解密数字签名 --> 拿到哈希字符str1
- 对收到的数字证书做同样的hash运算 --> 拿到哈希字符str2
- 比对str1 == str2
TLS四次握手
- 1.协商TLS版本, 加密算法
- 2.验证身份并拿到公钥
- 3.协商并生成会话密钥, 之后使用其通信
- 1.客户端 hello : 告知支持的TLS版本, 加密套件, 生成第1随机数
- 2.服务端 hello : 确认支持的TLS版本, 选择加密套件, 生成第2随机数
- 服务端再发送响应来出示证书, 发送公钥, 告知发送完成 (该证书检测由浏览器比对信任列表完成)
- 3.客户处理响应 : 客户端生成第3随机数(预主密钥), 使用收到的公钥加密, 然后发送给服务器
- 4.服务端使用私钥解密拿到预主密钥, 客户端与服务端使用第1随机数 + 第2随机数 + 预主密钥 计算出会话密钥
DNS
- 功能 : 将域名转换为IP地址 -- IP地址难记
浏览器缓存--> 本地hosts文件 --> 本地DNS解析缓存 --> 本地DNS服务器
--> 根域名服务器--> 顶级域名服务器 --> 权威域名服务器