http篇
http2.0 协议
1.历史:
http/1.0:每次请求、响应都需要建立一次 tcp 连接
http/1.1:可以持久连接,但是必须先进先出(浏览器有并发限制,一般是 6 个,同时这个也防止了 ddos 攻击)
2.首部压缩:
目标:为了减少传输流量
条件:两端维护相同的静态字典和动态字典,并且都支持静态哈夫曼表的哈夫曼编码
原理:完全匹配的键值对直接用字典的key;只匹配到头部信息,可以用一个字符+哈夫曼编码;浏览器可以告知服务器往动态字典里面添加头部信息
3.二进制分帧:
目标:在高层 http api 与低层 tcp 之间引入二进制分帧层,一个请求报文会被分割成多个帧。
原理:tcp 连接在客户端、服务端建立双向通道;A端将消息切割成多个帧;A端发起一个流,并在流中将多个帧传输到B端,B端把多个帧整合成消息。
4.多路复用:
目标:在一个 tcp 连接可以并发多个请求和响应
原理:二进制分帧的帧具有流ID,接收端可以根据ID整合帧,这样可以无序并发的发送多个流的帧。
注意:由于可以并发和木桶效应,影响传输的瓶颈在于体积最大的那个帧。
5.服务器推送
目标:服务器拥有主动推送资源的能力
原理:服务器在响应请求的时候,可以主动推送一些其他的资源。
注意点:需要有请求才能有推送;服务器推送只是减少了客户端的对推送资源的请求
6.优先级与依赖性
目标:由于 http2.0 可以并发多个请求和响应,这些资源又有重要性的区别,所以需要制定这些资源的优先级
udp 协议
定义:面向报文的简单协议
特点:无连接的;可以一对多;尽最大努力交付,不保证可靠;传输效率高
应用场景:包总量很少的通信:DNS;视频音频即时通信;广播
与tcp的区别:tcp是面向连接的,只能一对一,保证可靠,传输效率低
tcp、ip网络分层
定义:分为应用层,传输层,网络层和数据链路层
应用层:决定了向用户提供何种服务,常见协议有http、ftp、dns
传输层:对应用层提供数据传输,常见协议有tcp、udp
网络层:用来处理网络上的数据包,规定了传输路线和怎么样把数据包传送给对方
数据链路层:硬件
osi 七层网络模型
全称:Open System Interconnection Reference Model
历史:当时符合tcp、ip网络分层的协议很多、很混乱
定义:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
应用层:面向具体的应用传输数据
表示层:把数据转换成合适、可理解的语法
会话层:维护网络中的连接状态
传输层:相当于tcp/ip里面的传输层
网络层:相当于tcp/ip里面的网络层
数据链路层:相当于tcp/ip里面的数据链路层
物理层:网络的物理形式,比如电缆、光纤等
cdn
定义:Context Delivery Network,应用了 http 协议里的缓存和代理技术,代理源站响应客户端的请求。是一种专门解决长距离网络传输慢这个问题的网络应用服务。
核心原则:就近原则
使用的技术:缓存代理,负载均衡
web 服务器
硬件含义:物理形式或云形式的物理机器,可能不是一台服务器,而是一个集群。
软件含义:提供 Web 服务的应用程序
url 和 uri
差异: url 是 uri 的一个子集
构成部分:协议名 + 主机名 + 路径
代理
定义:执行转发的服务器
匿名代理:隐匿了的代理服务器
透明代理:外界既知道代理,也知道服务器
正向代理:靠近客户端
反向代理:靠近服务器
用途:负载均衡、内容缓存、安全防护、数据处理
https 协议
定义:本质上还是 http 协议,只不过把下层的 tcp/ip 协议换成了 ssl/tls
对称加密:
定义:加密和解密用的是同一个秘钥,速度很快
算法:AES,ChaCha20
分组模式:把秘钥加密成任意长度的密文,比如:GCM,CCM,Poly1305
定义:把算法和分组模式结合起来,就是对称加密,比如 AES128-GCM 表示秘钥长度为 128 位 AES 算法,并且分组模式为 GCM 的对称加密方法
非对称加密:
定义:加密和解密用的是不同秘钥,速度不快
例子:DH、DSA、RSA、ECC
RSA:最著名的一个,基于因素分解的数学难题
ECC:是后起之秀,基于椭圆曲线离散对数的数学难题
混合加密:
起因:需要速度快又安全的加密方式
定义:在通信刚开始的时候使用非对称加密,解决秘钥交换问题,之后使用对称加密进行信息传输
完整性:
定义:指数据在传输过程中没有被篡改。
算法:摘要算法,比如散列函数、哈希函数
原理:把任意长度的数据加密成任意长度并且独一无二的摘要字符串
特点:单向不可逆推,雪崩效应
哈希消息认证码(HMAC):摘要算法并不保证机密性,所以在混合加密里面同时加密消息和摘要,它主要运用于身份认证中
数字签名:
定义:是私钥对摘要的加密,只能由私钥对应的公钥解密,实现身份认证。
数字证书:
目标:解决公钥的信任问题。(因为数字签名里面的公钥容易被替换)
过程:由 CA 把公钥、序列号、用途、颁发者、有效时间打成一个包再进行签名,就形成了数字证书
用途:用来在非对称加密中确认服务器的真实性
中间人攻击:
定义:中间人产生一对非对称秘钥,然后代替假装服务器发布公钥给客户端
怎么避免中间人攻击:使用数字证书证明公钥是服务器的公钥
数字证书所需的 CA 公钥怎么认证:内置在浏览器或操作系统中
跨域
同源策略:
定义:协议、域名、端口三者必须相同
限制内容:Cookie、Storage、DOM 节点、Ajax 等
解决方案:
图像ping: 利用了 img src标签没有跨域限制的漏洞
jsonp:利用了script标签没有跨域限制的漏洞
cors:跨域解决方案,前端不需要做什么,需要后端配置 cors。(cors请求会分为简单请求和非简单请求,简单请求的话浏览器会自动加上Access-Control-Allow-Origin-xx 头部,非简单请求会在通信之前增加一次 http 查询请求)
websocket: 使用 ws
node、nginx等代理:服务器没有同源策略
postmessage:主要用于页面之间的通信,页面的所属域不同
http 协议
定义:超文本传输协议。它不关心寻址、路由、数据完整性等传输细节,而要求这些工作都有下层处理。因为当时流行的 tcp/ip 协议正好满足 http 的需求,所以 http 协议就运行在了 tcp/ip 之上
报文:
起始行:描述请求或响应的基本信息
头部字段集合:使用 key-value 的形式更详细地说明报文
消息正文:实际传输的数据,可能不是文字,而是图片、音频等二级制数据
请求头和响应头:起始行 + 头部字段集合
实体:消息正文
body:消息正文(与header对应)
请求行:请求报文的起始行。它包括:请求方法、请求目标、版本号
状态行:响应报文的起始行。它包括:版本号、状态码、原因
头部通用字段:Cache-Control
public: 表示客户端和代理服务器都可以缓存
private:表示只有客户端可以缓存,默认值
no-cache: 表示使用协商缓存来决定
no-store: 表示既不使用强制缓存,也不使用协商缓存
max-age=xxx:缓存内容将在xxx秒后失效
头部通用字段:Connection
1.Connection: 不再转发的首部字段名
2.Connection: close。因为 http1.1 默认都是持久连接,所以可以用这个字段断开连接
3.Connection: keep-alive。持久连接
头部通用字段:Date
定义:表明创建 http 报文的日期和时间
头部通用字段:Upgrade
用途:用来检测 http 协议或其它协议是否可用更高的版本进行通信
头部请求字段:Host
用途:告知服务器,请求的资源所处的互联网主机名和端口号。它是 http1.1 唯一一个必须被包含在请求内的首部字段
头部请求字段:Accept
用途:告知服务器,用户代理能够处理的媒体类型和优先级
头部请求字段:Accept-Charset
用途:告知服务器,用户代理能够支持的字符集和优先级
头部请求字段:Accept-Encoding
用途:告知服务器,用户代理能够支持的内容编码和优先级
gzip:由 gzip 生成的编码格式
compress:由 UNIX 文件压缩程序 compress 生成的编码格式
deflate:组合使用 zlib 格式并有 deflate 算法生成的编码格式
identity: 不执行压缩或不会变化的默认编码格式
头部请求字段:Accept-Language
用途:告知服务器,用户代理能够支持的自然语言集和优先级
头部请求字段:Authorization
用途:告知服务器,用户代理的认证信息
头部请求字段:If-Modified-Since
用途:用于确认资源的更新时间,如果资源发生了更新,服务器会接受请求;如果资源没有发生更新,服务器会返回状态码 304 Not Modified 的响应,浏览器使用本地缓存
头部请求字段:If-None-Match
用途:用于检查 ETag,如果不一致时,服务器会接受请求;如果一致则返回状态码 304 Not Modified 的响应,浏览器使用本地缓存
头部请求字段:Referer
用途:告知服务器,请求的原始资源的 uri
头部响应字段:Age
用途:告知客户端,实体从产生到现在经过多长时间
头部响应字段:ETag
用途:将资源以字符串形式做唯一性标识的方式
头部响应字段:Location
用途:配合 3xx 可以将接收方引导至另一个资源
实体字段:Content-Type
用途:说明实体内对象的数据类型
实体字段:Allow
用途:用于通知客户端支持的所有 http 方法,当服务器收到不支持的方法时,会以状态码 405 Method Not Allowed 作为响应返回
实体字段:Content-Encoding
用途:告知客户端实体主体部分选用的内容编码方式,内容编码是指在不丢失实体信息的前提下所进行的压缩
实体字段:Content-Language
用途:告知客户端实体主体部分选用的自然语言
实体字段:Content-Length
用途:告知客户端实体主体部分的大小
实体字段:Expires
用途:告知客户端资源失效的日期
实体字段:Set-Cookie
expires: cookie 的有效期
path: cookie 的文件路径
domain: cookie 的域名
secure: 限制仅在 https 的情况下才发送 cookie
HttpOnly: 限制 js 能否获取 cookie
响应状态码
1xx:
定义:表示目前是协议处理的中间状态,还需要后续的操作
101:表示客户端正在使用 Upgrade 字段改变协议
2xx:
定义:表示成功,报文已收到并被正确处理
200:OK,表示一切正常
204:No Content,表示一切正常,但是后面没有 body 数据
206:Partial Content,表示范围请求,是断点续传的基础
3xx:
定义:重定向,资源位置发生变动,需要客户端重新发送请求
301:Moved Permanently,永久重定向,请求的资源不存在,需要用新的 uri 访问。比如网站升级到了 https,以前的 http 不再使用了,就需要使用 301 跳转
302:Found,临时重定向,表示请求的资源还在,但需要暂时用另一个 uri 访问。比如夜里网站后台需要维护,服务暂不可用,就可以配置 302 跳转,此时浏览器不会做缓存优化,第二天还会访问原来的地址。
304:Not Modified,表示资源未修改,用于缓存控制,通常不会进行跳转,但是可以理解成重定向到已经缓存的文件
4xx:
定义:客户端错误,请求报文有误,服务器无法处理
400:Bad Request,表示请求报文有误,是一个笼统的错误,客户端一头雾水。在开发时应尽量使用有其它明确意思的状态码。
403:Forbidden,表示服务器禁止访问资源
404:Not Found,表示资源在本服务器上未找到
405:Method Not Allowed,表示不允许使用某些方法操作资源
406:Not Acceptable,表示资源无法满足客户端请求的条件,比如请求中文但是只有英文
408:Request Timeout,表示请求超时
409:Conflict,表示多个请求发生了冲突
413:Request Entity Too Large,表示请求报文的 body 太大了
414:Request URI Too Large,表示请求行里的 uri 太大了
429:Too Many Request,客户端发送了太多的请求
431:Request Header Fields Too Large,请求头某个字段太大了
5xx:
定义:服务器错误,服务器在处理请求时内部发生了错误
500:Internal Server Error,通用的服务器错误,没有告知原因
501:Not Implemented,表示客户端请求的功能还不支持,意思是即将开业,敬请期待
502:Bad Gateway,表示网关或代理服务器工作正常,但是访问后端服务器发生了错误
503:Service Unavailable,表示服务器当前很忙,暂时无法响应服务
安全和幂等
安全:指请求方法不会破坏服务器上的资源。只读操作的 GET 和 HEAD 方法是安全的。
幂等:指多次执行相同的操作,结果也是相同的。GET 和 HEAD 显然是幂等的,DELETE 多次删除同一个资源,会提示资源不存在,所以也是幂等的,PUT 多次更新一个资源,结果还是第一个更新的资源,所以也是幂等的,POST 多次提交新数据会创建多个资源,所以不是幂等的
并发与域名分片
原理:浏览器对每个域名的并发请求数有数量限制,一般是6个,所以域名分片是指,把单个域名分拆成多个域名,然后指向同一个服务器。
缺点:已过时,现在被 http2.0 所取代
一个 http 请求的全周期
1.DNS 解析:得出 ip 地址
2.HTTP:生成请求报文
3.TCP:将请求报文分成多个报文段,确保报文段准确送到。使用三次握手确保连接可靠
4.ip地址:节点被分配的地址(ip地址:节点被分配的地址;MAC地址:网卡所属的固定地址),一边中转一边传动
5.TCP:重组报文
6.HTTP:对请求进行处理