状态码
- 3位数,5大类
- 1XX 表示通知信息,如请求收到了或正在进行处理。
- 2XX 表示成功
- 201 created
- 204 no content
- 206 服务器成功处理了部分 GET 请求
- 3XX 表示重定向,如果完成ygfigip必须采取进一步的行动。
- 301 永久移动
- 302 临时重定向 post到get
- 303 See Other通常作为 PUT 或 POST 操作的返回结果,它表示重定向链接指向的不是新上传的资源,而是另外一个页面,比如消息确认页面或上传进度页面。而请求重定向页面的方法要总是使用 GET。
- 304 Not Modified
- 307 与 302 之间的唯一区别在于,当发送重定向请求的时候,307 状态码可以确保请求方法和消息主体不会发生变化。
- 4XX 表示客户的差错,如请求中有错误的语法或不能完成。
- 400 服务器不理解请求的语法,当参数错误的时候会遇到
- 401 身份验证错误,当访问受保护路由需要登录
- 403 Forbidden,当访问的资源不被允许
- 404 服务器找不到请求的网页
- 405
Method Not Allowed方法实现了但是不充许用 - 406 Not Acceptable MIME type
- 5XX 表示服务器
- 500 后端程序报错会遇到
- 501
Not Implemented请求的方法没有实现 - 502 错误网关,服务器作为网关或代理,从上游服务器收到了无效的响应。
- 503 服务不可用,当服务器宕机
- 504 请求超时
- 505 HTTP 版本不受支持
HTTP 缓存
- 命中强缓存的情况下,返回的 HTTP 状态码为 200
- Cache-Control 相对于 expires 更加准确,它的优先级也更高。当 Cache-Control 与 expires 同时出现时,我们以 Cache-Control 为准。
- 如果服务端提示缓存资源未改动(Not Modified),资源会被重定向到浏览器缓存,这种情况下网络请求对应的状态码是 304(如下图)。
- Etag 在感知文件变化上比 Last-Modified 更加准确,优先级也更高。当 Etag 和 Last-Modified 同时存在时,以 Etag 为准。
ETag: W/"2a3b-1602480f459"
If-None-Match: W/"2a3b-1602480f459"
Last-Modified
If-Modified-Since
must-revalidate
那么这样一来,基本可以将 no-cache 与 must-revalidate, max-age=0 划等了,但这两者也有些细节上的区别,即:
在执行must-revalidate时,若浏览器第二次去请求服务器来做新鲜度验证,结果服务器挂了,无法访问,那么缓存需要返回一个504 Gateway Timeout的错误(这里应该是像nginx这样的代理来返回,若是浏览器如chrome,将直接是ERR_CONNECTION_REFUSED,即无法访问,连接被拒绝)。
而如果是no-cache,当验证新鲜度时,服务器扑街,则会照样使用本地缓存显示给用户(有的总比没的好,当然有可能显示的就是旧的文档了)。
所以must-revalidate用在对事务要求比较严苛的情况下使用(比如支付)
报文分三部分
- 开始行 用于区分是请求报文还是响应报文,在请求报文中的开始行叫做请求行,而在响应报文中的开始行叫做状态行。
- 首部行 每一行在结束的地方都要有回车或换行。整个首部行结束时,还有一空行将首部行和后面的实体主体分开。
- 实体主体
3次握手和4次挥手
6个控制位,用来说明本报文段的性质。说明: 确认 ack、推送 psh、 复位 rst、同步 syn、 终止 fin、 窗口
为什么A最后还要发送一次确认呢?这主要是为了防止已失效的连接请求报文段突然又传到B,因而产生错误。
seq是序列号,这是为了连接以后传送数据用的,ack是对收到的数据包的确认,值是等待接收的数据包的序列号。
在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。
seq是数据包本身的序列号;ack是期望对方继续发送的那个数据包的序列号。
UDP/TCP
用户数据报协议 UDP
- 无连接,发送数据之前不需要建议连接,因此减少了开销和发送数据之前的时延。
- 尽最大努力交付,不保证可靠交付。
- 没有拥塞控制
- 支持一对一、一对多、多对一和多对多的交互通信
- 首部开销小,只有8字节,比tcp的20个字节短。
传输控制协议 tcp
- 面向连接,在使用之前必须建议连接。传送完后再释放,就像打电话,挂机。
- 可靠交付,无差错、不丢失、不重复、并且按序到达。
- 全双工通信
- 每一条连接只有两个端点,只能是点对点的。
- 面向字节流
可靠传输的工作原理
- 停止等待协议,就是每发完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
- 每发送完一个分组,设置一个超时计时器。如果超时没有收到,认为丢失了,重传前面发过的分组,叫做超时重传。
- 确认迟到,重复收到到,不向上层交付,然后发送确认。
http1.1 keep-alive
1.1版本新增,对同一个域名同时开6个connection,我发了12个get请求,浏览器采用非流水线模式。见下图:
观察connection列,第二组与第一组的id是相同的,说明是共用的第一组。
跨域资源共享(CORS)
不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。 浏览器限制从脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确CORS响应头。
- express 设置允许跨域代码
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Content-Type,Access-Token,X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
})
预检请求
与前述简单请求不同,“需预检的请求”要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。
- 使用了下面任一 HTTP 方法,应首先发送预检请求
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH
- Content-Type 的值不属于下列之一:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
举例:OPTIONS /users/ 200 0.883 ms - 13
发送post请求到users,S端只收到options请求,B收到响应后, 知道不准许跨域,不会再发送真正的post请求
跨域请求发送携带身份凭证信息
# vue 中axios
this.$http.get('http://localhost:3000/users/', {
withCredentials: true
})
# 响应头设置
res.header("Access-Control-Allow-Origin", "http://localhost:8080");
res.header("Access-Control-Allow-Headers", "Content-Type,x-xsrf-token");
res.header("Access-Control-Allow-Credentials",true);
对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为“*”。
功能概述
跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。
五层协议
- 计算机通信 是两个运行的进程之间的通信
- 五层协议的体系结构只为介绍网络原理而设计,实用应用的还是tcp/ip四层体系结构
HTTPS和HTTP的区别
- 一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
- 二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
- 三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- 四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
http2
之所以要递增一个大版本到 2.0,主要是因为它改变了客户端与服务器之间交换数据 的方式。为实现宏伟的性能改进目标,HTTP 2.0 增加了新的二进制分帧数据层,而 这一层并不兼容之前的 HTTP 1.x 服务器及客户端——是谓 2.0。
- 二进制分帧数据层
- 服务器端推送
- 所有通信都在一个TCP连接,多路复用
- 头部进行压缩
-
流是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数 标识符(1、2…N)
-
消息是指逻辑上的 HTTP 消息,比如请求、响应等,由一或多个帧组成
-
帧是最小的通信单位,承载着特定类型的数据,如 HTTP 首部、负荷,等等。
-
有了新的分帧机制后,HTTP 2.0 不再依赖多个 TCP 连接去实现多流并行了。 现在, 每个数据流都拆分成很多帧,而这些帧可以交错,还可以分别优先级。 于是,所有 HTTP 2.0 连接都是持久化的,而且客户端与服务器之间也只需要一个连接即可。
参考链接
- 跨域 developer.mozilla.org/zh-CN/docs/…
- http1.1流水线 developer.mozilla.org/zh-CN/docs/…
- HTTP 缓存 developers.google.com/web/fundame…
持续新增
HTTP Strict Transport Security
(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP。
语法
设置在浏览器收到这个请求后的<expire-time>秒的时间内凡是访问这个域名下的请求都使用HTTPS请求。
Strict-Transport-Security: max-age=<expire-time>
如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
查看 预加载 HSTS 获得详情。不是标准的一部分。
Strict-Transport-Security: max-age=<expire-time>; preload
Chrome、Firefox等浏览器里,当您尝试访问该域名下的内容时,会产生一个307 Internal Redirect(内部跳转),自动跳转到HTTPS请求。
Upgrade-Insecure-Requests: 1 是一个请求首部,用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应,
参考 :developer.mozilla.org/zh-CN/docs/…
HTTPS
密码编码学是密码体制的设计学,而密码分析学则是未知密钥的情况下从密文推演出明文或密钥的技术。密码编码学与密码分析学合起来即为密码学。
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
HTTPS在传输的过程中会涉及到三个密钥:
服务器端的公钥和私钥,用来进行非对称加密
客户端生成的随机密钥,用来进行对称加密
简要过程
-
(1)协商加密算法。
- 1.浏览器A向服务器B发送浏览器的ssl版本号和一些加密算法。
- 2.B从中选定自己所支持的算法如RSA,并告知A.
-
(2) 服务器鉴别。
- 3.服务器B向浏览器A发送包含其rsa公钥的数字证书。
- 4.A使用该证书的认证机构CA公开发布的RAS公钥对该证书进行验证。
-
(3) 会话密钥计算。 由浏览器A随机产生一个秘密数。
- 5。用服务器B的RAS公钥进行加密后发送给B。
- 6 双方根据协商的算法产生共享的对称会话密钥。
-
(4)安全数据传输
- 7双方用会话密钥加密和解密他们之间传送的数据并验证其完整性。