首先分析一张图1:为什么我们一开始就要Redirect
输入URL后这个URL可能已经永久跳转成新的地址了 所以需要先判断
2: 缓存
你请求的资源可能已经缓存过来 所以需要查找
3:DNS
查找域名对应的Ip
4:TCP:连接
经过TCP三次握手 如果是HTTPS连接 需要一个Https的连接
网络协议分层
OSI七层模型
应用层 表示层 会话层 传输层 网络层 链路层 物理层
表示层
数据格式化转化 数据加密
会话层
建立 管理和维护会话
五层网络协议
物理层主要作用是定义物理设备如何传输数据(硬件 网线 光缆)
数据链路 在通信实体之间建立数据链路连接
物理层的线路有传输介质与通信设备组成,比特流在传输介质上传输时肯定会存在误差的。这样就引入了数据链路层在物理层之上,采用差错检测、差错控制和流量控制等方法,向网络层提供高质量的数据传输服务。
网络层 为数据在节点之间的传输创建逻辑链路(我们从我的电脑访问百度服务器,寻找百度的地址这就是 网络层创立的)
IP选址以及路由选择
传输层(TCP/IP UDP)
向用户提供了可靠的端到端的服务
将上层应用的数据进行分段和重组 将他们合并到一个数据流中 提供了端与端的数据传输服务 并可在发送主机与目标主机之间建立逻辑连接
像高层屏蔽了下层数据通信细节
应用层
为应用软件提供了很多服务
构建与TCP协议之上
屏蔽了网络传输相关的细节
Http 各种版本
0.9
只有一个命令Get
没有HEADER等信息
服务器发送完毕就关闭TCP连接
1.0
增加了很多命令(post put delete)
增加status code 和 header
多字符集支持,多部分发送,权限和缓存
1.1
持久连接
pipeline(同一个连接多个请求 串行化处理)
增加host(允许了一台物理服务器同时跑多个web服务 相应的后端需要设置这个host)和其他一些命令
2
所有数据以二进制传输
同一个连接发送多个请求不需要再按顺序进行处理
头信息压缩以及推送等效率低下的功能
三次握手
Http 没有连接这个概念 只有响应和请求 所以需要建立一个Tcp Connection连接通道 来发送响应 请求 数据包
表示有三次网络传输
发起一个我要创建连接的数据包请求
SYN=1(同步序列编号) 标志位 这是一个创建请求的数据包
服务端接受到这个请求 开启一个TCPSOCKET的端口 返回给客户端 ACK(确认字符) = Seq(序号)+1 再发送一个服务端的Seq(序号)
再去发送一个ACK = 服务端Seq+1 与一个Seq这个Seq值是第二次握手的ACK值
未来规避网络传输中各种情况导致连接失败,客户端不知道仍然等待连接的情况
URI URL URN
URI
统一资源标志符
用来标识互联网上唯一的资源的标识
包括URL 和 URN
URL
统一资源定位器
http://user:pass@host.com:80/path?query=string#hash https ftp xxxx
URN
永久统一资源定位符
Http报文
Post请求才有请求体
Http 方法 用来定义对资源的操作
Restful风格的 get post put delete
查 增 改 删
Cors跨域请求
请求已经发送了 服务器也确实响应返回了 浏览器帮你拦截掉了
因为浏览器的同源限制
浏览器是允许路径标签跨域的
跨域中127.0.0.1 和 localhost 不一样
Cors 预请求
GET
HEAD
POST
不需要预请求
text/plain
multipart/form-data
application/x-www-form-urlencoded
不需要
请求头限制
预请求 Request Method 会显示为OPTIONS
Access-Control-Allow-Origin 允许其他地址
Access-Control-Allow-Headers 允许自定义请求头
Access-Control-Allow-Methods 允许其他方法 PUT DELETE
Access-Control-Max-Age 允许以这个请求的最大时间 这个时间之内不要发送预先请求
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); resp.setHeader("Access-Control-Allow-Origin", "*"); resp.setStatus(200); PrintWriter printWriter = resp.getWriter(); printWriter.write("<h1>1</h1>"); } //java Servlet案例
Cache-Control 缓存
代理服务器 Nginx
public Http 经过的任何地方都可以缓存
private 发起请求的浏览器才可以进行缓存
no-cache 经过服务器验证才可以使用缓存
max-age 缓存到期时间
s-maxage 在代理服务器才会生效
max-stale 可以接收超出max-age时间的响应消息
must-revalidate 设置了max-age的缓存当中 已经过期了 必须去原服务端验证
proxy-revalidate 给缓存服务器设置的
no-store 不可以缓存
no-transform 不允许服务器压缩等改动返回内容
例子
'Cache-Control' : 'max-age = 5, s-maxage = 20'
浏览器缓存
Last-Modified 上次修改时间配合If-Modified-Since使用
对比上次修改时间来验证资源是否需要更新
Etag
数字签名
这两种都是服务端可以用来确认是否要更新浏览器数据的方式
Cookie 和 Session
Cookie 是服务端通过Set-Cookie设置到浏览器里面的
下次同域请求中会带上这个Cookie
属性
max-age
expires
Secure 表示只有在Https请求的时候才会带上
HttpOnly 无法通过document.cookie访问
domain 表示可以设置cookie的域名 比如domain=test.com test.com 和 它的二级域名都可以访问到
二级域名
a.com是一级域名,那么b.a.com就是a.com的二级域名
Session
session不一定需要用cookie实现‘
Http 长连接
一个TCP连接可以发送多个Http请求
但是1.1 是有先后顺序的 当Http连接达到上限 要进行等待
connection : close 可以关闭连接
数据协商
Accept 接受的数据类型
Accept-Encoding 服务端如何进行数据压缩 什么编码方式
Accept-Language 返回信息语言
User-Agent 判断哪个端(PC 移动)的页面
Content-Type 返回的数据格式
Content-Encoding 服务端具体用了哪种压缩方式
Content-Language 服务端实际返回的语言
X-Content-Type-Options **nosniff **
CSP
内容安全策略 为了减少和报告xss攻击
作用
限制资源获取
报告资源获取越权
default-src 限制全局
制定资源类型
**'Content-Security-Policy: ‘default-src http: https:’ **
有很多配置 还有script-src report-uri 等 具体可以参考MDN