• 前端基础之HTTP篇


    http篇

    http2.0 协议

    历史:

    http/1.0:每次请求都需要建立一个新的 tcp 连接
    
    http/1.1:可以持久连接,但是必须先进先出(浏览器有并发限制,一般是 6 个,同时这个也防止了 ddos 攻击)
    

    首部压缩:

    目标:为了减少传输流量
    
    条件:两端维护相同的静态字典和动态字典,并且都支持静态哈夫曼表的哈夫曼编码
    
    原理:完全匹配的键值对直接用字典的key;只匹配到头部信息,可以用一个字符+哈夫曼编码;浏览器可以告知服务器往动态字典里面添加头部信息
    

    二进制分帧:

    目标:在高层 http api 与低层 tcp 之间引入二进制分帧层,一个请求报文会被分割成多个帧。
    
    原理:tcp 连接在客户端、服务端建立双向通道;A端将消息切割成多个帧;A端发起一个流,并在流中将多个帧传输到B端,B端把多个帧整合成消息。
    

    多路复用:

    目标:在一个 tcp 连接可以并发多个请求和响应
    
    原理:二进制分帧的帧具有流ID,接收端可以根据ID整合帧,这样可以无序并发的发送多个流的帧。
    
    注意:由于可以并发和木桶效应,影响传输的瓶颈在于体积最大的那个帧。
    

    服务器推送

    目标:服务器拥有主动推送资源的能力
    
    原理:服务器在响应请求的时候,可以主动推送一些其他的资源。
    
    注意点:需要有请求才能有推送;服务器推送只是减少了客户端的对推送资源的请求
    

    优先级与依赖性

    目标:由于 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 协议,只不过通过 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:主要用于页面之间的通信,页面的所属域不同
    

    什么是cors: 跨域资源共享,允许浏览器向跨域服务器发出 http 请求,从而克服跨域问题。

    1.浏览器会自动向请求添加 origin 字段,表明当前请求来源
    2.服务器端需要设置响应头:access-control-allow-methods、access-control-allow-headers、access-control-allow-origin字段,指定允许的方法、头部、源等信息
    3.简单请求是 head、get、post 这三种之一,请求头信息不超过 accept、accept-language等字段
    4.非简单请求在请求之前会使用option进行一次预检。
    

    http 协议

    定义:超文本传输协议。它不关心寻址、路由、数据完整性等传输细节,而要求这些工作都有下层处理。因为当时流行的 tcp/ip 协议正好满足 http 的需求,所以 http 协议就运行在了 tcp/ip 之上
    

    报文:

    起始行:描述请求或响应的基本信息
    头部字段集合:使用 key-value 的形式更详细地说明报文
    消息正文:实际传输的数据,可能不是文字,而是图片、音频等二级制数据
    请求头和响应头:起始行 + 头部字段集合
    实体:消息正文
    body:消息正文(与header对应)
    请求行:请求报文的起始行。它包括:请求方法、请求目标、版本号
    状态行:响应报文的起始行。它包括:版本号、状态码、原因
    

    头部通用字段:Cache-Control

    public: 表示客户端和代理服务器都可以缓存
    private:表示只有客户端可以缓存,默认值
    no-cache: 表示使用协商缓存来决定
    no-store: 表示既不使用强制缓存,也不使用协商缓存
    max-age=xxx:缓存内容将在xxx秒后失效(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
    

    队头阻塞:

    定义:由于http长连接是一个请求一个应答交替进行的,所以如果前面的请求-应答会阻塞后面的请求-应答,即使后面的请求-应答数据量很少。
    
    解决方法:并发连接(浏览器支持并发多个连接,但同一域名下的并发连接有数量限制)、域名分片(把资源的域名分为多个二级域名,指向原本的同一资源,这样就避免了同一域名的并发连接数量)、http2(多路复用)
    

    什么是 http:

    定义:http全称超文本传输协议,它是基于 tcp 协议上的应用层协议,定义了数据传输和连接方式的规范。
    组成:它由起始行、头部和实体组成
    起始行:起始行有http版本、状态码和原因组成
    头部:头部有各种首部字段,主要有请求首部、响应首部、实体首部、cookie首部和其它首部
    实体:一般是数据
    
    请求首部:描述能接受什么文件(accept、accept-charset、accept-encoding、accept-language),鉴权信息(authorization),缓存情况(if-modified-since、if-none-match),其它信息(host、referer、user-agent)
    响应首部:描述服务器的信息(age、server、location)
    实体首部:allow、content-encoding、content-type、content-language、content-length、last-modified、etag
    cookie首部:set-cookie、cookie
    其它首部:x-
    

    cookie 有哪些字段:name、value、domain、path、expires、http、secure、samesite

    响应状态码

    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漏洞。
    

    SQL 注入:

    概念:恶意代码被插入到查询字符串中,然后将该字符串传递到服务器执行,服务器在查询数据库的时候会加上恶意代码一起查询
    应对策略:检查查询字符串的数据类型和格式;过滤特殊符号;使用预编译(比如使用orm)
    

    restful api

    put 和 patch 的区别:

    put是使用实体去替换全部信息,patch是包含一个指令,用这个指令更新部分信息。所以put是幂等的,patch不是幂等的。
    

    oauth2.0

    Oauth2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据:

    1.第三方应用申请应用id。
    2.用户使用应用id从第三方应用跳转授权服务器请求授权
    3.用户在授权服务器登录并且同意授权之后,授权服务器返回access token,并跳转回原始 url
    4.用户把这个access token传给资源服务器
    5.资源服务器使用access token和应用id向授权服务器验证,成功之后返回资源(登录token)
    

    基于 jwt 和 session 进行用户认证的优缺点:

    jwt: 无状态,不需要储存在服务端,性能好。但是解密简单,不能保存隐秘信息,载荷会很长,并且需要一个过期时间和黑名单。
    session: 有状态,需要redis储存和查询,但是框架自带容易部署
    
  • 相关阅读:
    earlycon 的使用【转】
    DDR工作原理【转】
    DDR工作时序与原理【转】
    kernel内存、地址【转】
    Linux时间子系统之定时事件层(Clock Events)【转】
    QEMU 2.10.1 编译安装【转】
    Kernel 内核调试【转】
    The Slab Allocator in the Linux kernel【转】
    Linux内存管理:slub分配器【转】
    linux内存管理笔记(二十七)----slub分配器概述【转】
  • 原文地址:https://www.cnblogs.com/yangzhou33/p/13733058.html
Copyright © 2020-2023  润新知