前端基础之HTTP篇

http篇

http2.0 协议

历史:html

http/1.0:每次请求、响应都须要创建一次 tcp 链接

http/1.1:能够持久链接,可是必须先进先出(浏览器有并发限制,通常是 6 个,同时这个也防止了 ddos 攻击)

首部压缩:前端

目标:为了减小传输流量

条件:两端维护相同的静态字典和动态字典,而且都支持静态哈夫曼表的哈夫曼编码

原理:彻底匹配的键值对直接用字典的key;只匹配到头部信息,能够用一个字符+哈夫曼编码;浏览器能够告知服务器往动态字典里面添加头部信息

二进制分帧:node

目标:在高层 http api 与低层 tcp 之间引入二进制分帧层,一个请求报文会被分割成多个帧。

原理:tcp 链接在客户端、服务端创建双向通道;A端将消息切割成多个帧;A端发起一个流,并在流中将多个帧传输到B端,B端把多个帧整合成消息。

多路复用:nginx

目标:在一个 tcp 链接能够并发多个请求和响应

原理:二进制分帧的帧具备流ID,接收端能够根据ID整合帧,这样能够无序并发的发送多个流的帧。

注意:因为能够并发和木桶效应,影响传输的瓶颈在于体积最大的那个帧。

服务器推送web

目标:服务器拥有主动推送资源的能力

原理:服务器在响应请求的时候,能够主动推送一些其余的资源。

注意点:须要有请求才能有推送;服务器推送只是减小了客户端的对推送资源的请求

优先级与依赖性算法

目标:因为 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

对称加密:json

定义:加密和解密用的是同一个秘钥,速度很快

算法:AES,ChaCha20

分组模式:把秘钥加密成任意长度的密文,好比:GCM,CCM,Poly1305

定义:把算法和分组模式结合起来,就是对称加密,好比 AES128-GCM 表示秘钥长度为 128 位 AES 算法,而且分组模式为 GCM 的对称加密方法

非对称加密:后端

定义:加密和解密用的是不一样秘钥,速度不快

例子:DH、DSA、RSA、ECC

RSA:最著名的一个,基于因素分解的数学难题

ECC:是后起之秀,基于椭圆曲线离散对数的数学难题

混合加密:api

原由:须要速度快又安全的加密方式

定义:在通讯刚开始的时候使用非对称加密,解决秘钥交换问题,以后使用对称加密进行信息传输

完整性:跨域

定义:指数据在传输过程当中没有被篡改。

算法:摘要算法,好比散列函数、哈希函数

原理:把任意长度的数据加密成任意长度而且独一无二的摘要字符串

特色:单向不可逆推,雪崩效应

哈希消息认证码(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:对请求进行处理

DNS 协议

DNS 查询:因为 DNS 数据包不大,而且只须要一个请求,一个应答就行了,因此 DNS 协议通常使用 UDP 协议就行了,除非当数据长度大于 512 字节时,才会使用 tcp 协议。

非权威域名服务器:许多大公司会创建本身的 DNS 服务器,代理用户访问核心 DNS 系统。

DNS的查询顺序:浏览器 DNS 缓存,操做系统 DNS 缓存,Hosts 文件,非权威域名服务器,根域名服务器,顶级域名服务器,权威域名服务器

DNS 查询的应用场景:负载均衡、域名屏蔽、域名劫持

IP 协议

目的:主要解决寻址和路由问题,以及如何在两点传输数据包。对比现实中的电话系统。
特色:提供可靠的(数据不丢失)、字节流形式(保证数据完整)的通讯

TCP 协议

定义:面向链接的、可靠的字节流服务

三次握手:首先客户端发送一个 syn 的tcp 包,表示请求应答;服务端接受这个 tcp 包以后回传一个 syn 和 ack 的 tcp 包,表示确认应答;客户端接受这个 tcp 包以后再发送一个 syc + 1 和 ack 的 tcp 包,表示确认链接。

为何要用三次:防止失效的链接请求耗费服务器资源的状况

四次挥手:首先客户端说本身已经没有数据要发送了,可是仍然能够接受数据;而后服务器回复收到了,准备关闭请求,可是尚未准备好;而后服务器准备好了以后就对客户端说已经准备好了;客户端收到后,回复能够关闭了,而后服务器接收到以后就会关闭请求,而客户端这边等待一下子以后若是没有再收到数据才会关闭。

为何要四次挥手:由于客户端再也不发送数据的时候可能还须要接受数据

tcp/ip 协议族:ip协议、tcp协议以及基于它们的其余协议好比udp协议、dns协议等

http 安全

xss 跨站脚本攻击:

本质:攻击者提交恶意代码,浏览器执行恶意代码

反射型:恶意 js 脚本是用户本身发送给网站的(一般被带在连接里面),而后网站又把恶意 js 脚本返回给用户进行执行,这个时候 js 脚本就会作一些恶意操做。好比:http://localhost:3000/?xss=<script>alert('你被xss攻击了')</script>

储存型:恶意 js 脚本被上传到服务器,经过服务器发送给用户。好比论坛系统的恶意代码

DOM型:经过修改 Web 页面的数据,把恶意代码注入到 html 里面,从而在用户打开页面的时候执行恶意操做。好比 wifi 路由器劫持、本地恶意软件劫持等。

应对策略:输入过滤、转义、限制输入长度、使用验证码等。

CSP网页安全策略:本质是白名单,明确告诉浏览器,哪些资源能够加在,开发者能够经过 meta 标签添加。好比:<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

csrf 跨站请求伪造:

概念:诱导用户在登陆状态下打开其它网站,此时就能够利用用户目前的登陆状态发起跨站请求

特色:主要发生在第三域名;攻击者不能获取 cookie,但能使用

应对策略:使用白名单阻止不明外域的访问(referer等);请求上添加只有本域才能得到的 csrf token;验证码;转帐前输入密码

SameSite:cookie 有一个 SameSite 属性,它可以禁止第三方请求携带cookie

简单检测网站是否存在 csrf 漏洞的方法:抓取一个正常请求的数据包,去掉 Referer 字段后再从新提交,若是该提交还有效,那么基本上能够肯定存在CSRF漏洞。
相关文章
相关标签/搜索