HTTP

1 状态码

HTTP CAT

2xx 没问题

200 OK 正常处理并返回对应资源
204 No Content 请求收到了,但是没给响应内容,只给响应头,那么浏览器显示的页面不发生更新
206 Partial Content 返回一部分资源

3xx 进一步操作

301  Moved Permanently 永久性重定向 第一次访问就记录在浏览器缓存中
302 Found:临时性重定向 每次重定向都要发送请求接收响应
304 Not Modified 缓存 用于返回是否更新数据,未更新就从缓存中获取

4xx 客户端出错

400 Bad Request:该状态码表示***请求报文中**存在语法错误 
403 Forbidden:该状态码表明对请求资源的访问被服务器拒绝了 权限错误
404 Not Found:一般是网址URL错误,服务器找不到地址
414 请求的URL 太长

5xx 服务器出错

500 Internal Server Error:表明服务器端在执行请求时发生了错误
503 Service Unavailable:表明服务器**暂时处于超负载****正在进行停机维护**,现在无法处理请求

2 HTTP 缓存

Expire 过期时间 GMT 日期格式

在某个时间点过期
用户本地时间更改后,这个Expire就失效了

Cache-Control:max-age:600

延迟600s过期
特点:延迟时间内无请求

Etag 一般存放MD5散列函数处理的数据

  1. MD5处理文件,得到一个MD5值
  2. 只要文件更改,这个MD5值就必定改变
  3. 每次请求与响应只需比对这个MD5值就可控制是否需要更新
  4. 不需要更新就返回状态码304 告诉浏览器从浏览器自己的缓存中获取

特点:每次都需请求

Last-Modified

和md5方法较为类似,通过记录文件的最后依次修改时间来判定是否需要更新文件

拓展:PWA技术

什么是PWA

4 GET和POST的区别

可回答的答案,先说:表层次的区别

  1. post 比get 安全 get参数直接暴露在URL上,所以不能用来传递敏感信息
  2. 一般 GET 放在URL 里 有长度限制,POST放在请求体中,没有长度限制
  3. 从发送的报文格式来说,Get 请求的报文中实体部分为空,Post 请求的报文中实体部分一般为向服务器发送的数据。
  4. GET幂等的,post不幂等的,发送多次GET不会改变数据库里的内容,如果发送POST会改变数据库

标准的答案,其实post和get没有本质区别,都是HTTP的请求方式,有区别的是人为规定用法

  1. 语义化区别,get是获取数据,post是提交数据,不能随便混用

5 Cookie / LocalStorage /SessionStorage /Session

Cookie 与session的区别

  1. cookie是服务器发给浏览器的一段内容,浏览器每次访问对应域名(服务器)的时候需要带上这个cookie
  2. session是会话,表示一次浏览器与服务器之间一段时间的会话
  3. session是在服务器上,cookie在浏览器上,session一般是基于cookie来实现的,把sessionID放入cookie里

Cookie与LocalStorage的区别

  1. cookie大小限制比较小(4k)localstorage限制大小较大(5MB)
  2. cookie是来存储用户信息,localstorage存储不重要的数据
  3. cookie是会被发送到浏览器中(相当于通行证)另一个不发送

LocalStorage与SessionStorage

localstorage不会过期,sessionstorage会在session结束的时候过期

6 HTTP2 和 HTTP1的区别是什么

HTTP 1.1

优点

  1. 复用链接(持久连接),一次连接,有多个请求响应(keep-alive)
  2. 管线化,并行处理,一个请求之后可以不等待响应,继续下一个请求
  3. 格外的缓存机制,状态码,提交方法以及内容协商机制等

缺点

  1. 请求头复杂冗余且重复,浪费资源和性能
  2. 数据未强制压缩
  3. 只能客户端发送请求,不能服务端主动发起,比如聊天时,客户端需要不断发送请求
  4. 请求没有优先级,无法首先加载重要资源
  5. 每个域名下的请求并行数量有限制

HTTP 2.0

HTTP 2.0 其实是SPDY演化而来的
改进了

  1. 采用二进制格式传输,取代了 HTTP1 的文本格式,二进制格式解析更高效
  2. 多路复用,一个tcp连接可以无限制处理多个请求
  3. 强制压缩HTTP首部
  4. 服务器推送(server push)允许服务器未经请求,主动向客户端发送资源,减少延迟时间
  5. 设置请求的优先级

7 HTTPS 协议

HTTPS 是基于 HTTP 协议的,HTTP的对称非对称算法混用仍然不安全,因为无法确定服务端给浏览器端的公匙是真的,可能会是别人伪造的,
所以HTTPS会使用 TLS/SSL握手流程来验证公匙

TLS握手过程

  1. 浏览器将自己支持的一套加密算法发给服务器,同时发一个浏览器随机数。
  2. 服务器向浏览器发送选择的加密算法、服务器生成的随机数、服务器数字证书。
  3. 浏览器收到证书后对证书的CA签名进行验证,如果验证通过,会从证书中拿到服务器的公钥
  4. 浏览器对浏览器随机数+服务器随机数进行处理,生成预备主密码
  5. 浏览器用服务器的公钥对预备主密码进行加密,发给服务器。
  6. 服务器收到后使用自己的私钥解密出预备主密钥
  7. 浏览器和服务器分别使用预备主密钥和两个随机数,生成共享主密钥
  8. 二者使用共享主密钥,使用对称加密算法加密数据

对称加密算法与非对称加密算法

  • 对称加密算法的特点是 速度快,不安全,加密解密使用同一个共享密匙
  • 非对称加密特点是 速度慢,安全,公密匙加密,私密匙解密
  • 所以一般都是两者混用:
    1. 使用对称加密的共享密钥加密数据
    2. 浏览器通过非对称加密的公密匙加密这个共享密钥,传输给服务器
    3. 服务器通过私密匙解密出对称加密的共享密钥,再使用这个共享密钥解密数据
  • 而加密共享密匙用的公密匙一般是服务器提供

但是这种组合的方法同样不安全

因为无法确定得到的公密匙就是服务器发送的,可能会有坏人截取,发送坏人自己的公密匙,浏览器发送加密数据后,坏人通过自己的私密匙解密

因此就产生了TLS的握手方式

8 TCP 的三步握手,四步挥手

三步握手

SYN 同步序列编号
ACK 确认字符
其中ACK报文是用来应答的,SYN报文是用来同步的
使用SYN+ACK应答表示接收到了这个消息

  1. 客户端向服务器发送一个 SYN 连接请求报文段,首部的同步位SYN=1,初始序号seq=x,此时客户端处于SYN_SEND 状态
  2. 服务器端收到 SYN 报文,使用SYN+ACK应答,一个在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y,此时服务器处于 SYN_REVD 的状态
  3. 客户端收到服务器端的 SYN 报文,确认报文段ACK=1,确认号ack=y+1,序号seq=x+1,双方处于 ESTABLISHED 状态,此时,双方已建立起了连接

客户端发送 syn(同步序列编号) 请求,进入 syn_send 状态,等待确认
服务端接收并确认 syn 包后发送 syn+ack 包,进入 syn_recv 状态
客户端接收 syn+ack 包后,发送 ack 包,双方进入 established 状态
在这里插入图片描述

为什么需要三次握手

首先得知道握手的目的是为了什么,是为了确认双方的接收和发送功能是正常的

  1. 第一次握手:客户端发送报文给服务端。说明,客户端的发送能力正常

  2. 第二次握手:服务端接收到了并发出报文,说明:服务端的接收、发送能力,是正常的

  3. 第三次握手:客户端接收到服务端的确认报文,再次发送给服务端确认报文,说明客户端的接收功能也是正常的

因此,至少需要三次握手才能确认双方的接收与发送能力是否正常

四步挥手

客户端 – FIN --> 服务端, FIN—WAIT
服务端 – ACK --> 客户端, CLOSE-WAIT
服务端 – ACK,FIN --> 客户端, LAST-ACK
客户端 – ACK --> 服务端,CLOSED

  1. 客户端发送一个 FIN = 1报文 ,告诉服务器想关闭连接。seq = p(随机数代表A)
  2. 服务器收到这个 FIN ,发回一个 ACK,表示知道了,正在关闭(关闭服务器需要时间) ack = p + 1(代表确认了的是A seq = p 的询问)
  3. 服务器通知应用程序关闭了网络连接,应用程序关闭后通知服务器。服务发送一个 FIN 给客户端 sep = q (代表B的询问)ack = p + 1(代表确认A的询问)
  4. 客户端发回 ACK = q+1 报文确认B的询问
    在这里插入图片描述

为什么需要四次挥手

  • 只要知道一点,服务端关闭连接是需要时间的,而不是瞬间关闭
  • 服务器收到关闭消息后需要发送一次ACK确认报文说正在关闭,然后关闭成功后再发送一次FIN+ACK表示关闭成功请浏览器再确认一次
  • 当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文

9 UDP

UDP 是一种无连接的,不可靠的传输层协议。它只提供了传输层需要实现的最低限度的功能
通俗的来讲,UDP传输协议没有tcp复杂的功能,类似于广播,只管发送不管对方是否接收到

10 XSS和CSRF 的攻击和预防

跨站脚本 XSS Cross-Site Scripting

  • 正常情况下 用户A提交正常内容,显示在用户B的网页上

  • 但是有恶意用户 C提交恶意内容,对B的网页进行篡改

  • 具体的篡改方式就是拿到B用户的cookie,伪装成B进行登录篡改内容

    <script>console.log(document.cookie)</script> // 拿到cookie
    document.querySelector('h2').remove() // 篡改页面
    

成因以及解决

成因就是form表单提交的内容直接变成了js中的有效代码

  1. 后台模板问题

    <p>
    评论内容:<?php echo $content; ?>
    </p>
    

    $content 的内容,没有经过任何过滤,原样输出。

    要解决这个原因,只需要后台输出的时候,将可疑的符号 < 符号变成 &lt; (HTML实体)就行。

  2. 前端代码问题

    $p.html(content)
    或者
    
    $p = $('<p>'+ content +'</p>')
    

    content 内容又被原样输出了。
    解决办法就是不要自己拼 HTML,尽量使用 text 方法。如果一定要使用 HTML,就把可疑符号变成 HTML 实体。

  3. cookie 设置 httpOnly

跨站请求伪造 Cross Site Request Forgery

通俗的讲

  1. 问题出在form表单中,表单无法确定是否是页面的表单,可以伪造
  2. 比如视频网站bilibili中,A用户可以给UP主B送礼物,页面中有个提交按钮,下面有评论区
  3. 但是恶意用户C在评论区写了一个链接,伪造了一个礼物赠送的表单,如果用户A不小心点击了这个链接,就会给这个恶意用户C送出礼物
  4. 总结就是恶意用户伪造请求

解决办法

客户端防范:对于数据库的修改请求,全部使用POST提交,禁止使用GET请求。
服务器端防范:一般的做法是在表单里面添加一段隐藏的唯一的token(请求令牌)。

  1. 服务端在收到路由请求时,生成一个随机数,在渲染请求页面时把随机数埋入页面(一般埋入 form 表单内,<input type="hidden" name="_csrf_token" value="xxxx">)类似于身份证
  2. 服务端设置setCookie,把该随机数作为cookie或者session存入用户浏览器
  3. 当用户发送 GET 或者 POST 请求时带上_csrf_token参数(对于 Form 表单直接提交即可,因为会自动把当前表单内所有的 input 提交给后台,包括_csrf_token)
  4. 后台在接受到请求后解析请求的cookie获取_csrf_token的值,然后和用户请求提交的_csrf_token做个比较,如果相等表示请求是合法的。

注意:

  1. Token 最好保存在 Session 中,如果保存在cookie中可能会造成用户开启多个页面后,新打开页面改变cookie造成无法提交老的页面
  2. 尽量少用 GET,因为会直接将信息提交到url中

11 DNS

  • DNS 的全称是 Domain Name System 或者 Domain Name Service
  • 它主要的作用就是将人们所熟悉的网址 (域名) “翻译”成电脑可以理解的 IP 地址,这个过程叫做 DNS 域名解析
  • 打个比方,我们登百度的地址的时候,都是敲www.baidu.com,进行登陆,难道你会去敲IP地址登百度?明显,域名容易记忆。

浏览器中输入URL到页面返回的全过程

  1. 根据域名,进行DNS域名解析;
  2. 拿到解析的IP地址,建立TCP连接;
  3. 向IP地址,发送HTTP请求;
  4. 服务器处理请求,返回响应结果;
  5. 关闭TCP连接;
  6. 浏览器解析HTML并渲染;

12 CDN

CDN(Content Delivery Network,内容分发网络)是构建在现有互联网基础之上的一层智能虚拟网络,通过在网络各处部署节点服务器,实现将源站内容分发至所有 CDN 节点,使用户可以就近获得所需的内容。CDN 服务缩短了用户查看内容的访问延迟,提高了用户访问网站的响应速度与网站的可用性,解决了网络带宽小、用户访问量大、网点分布不均等问题。

加速原理

当用户访问使用 CDN 服务的网站时,本地 DNS 服务器通过 CNAME 方式将最终域名请求重定向到 CDN 服务。CDN 通过一组预先定义好的策略(如内容类型、地理区域、网络负载状况等),将当时能够最快响应用户的 CDN 节点 IP 地址提供给用户,使用户可以以最快的速度获得网站内容。使用 CDN 后的 HTTP 请求处理流程如下:

CDN 节点有缓存场景

在这里插入图片描述

  1. 用户在浏览器输入要访问的网站域名,向本地 DNS 发起域名解析请求。
  2. 域名解析的请求被发往网站授权 DNS 服务器。
  3. 网站 DNS 服务器解析发现域名已经 CNAME 到了 www.example.com.c.cdnhwc1.com。
  4. 请求被指向 CDN 服务。
  5. CDN 对域名进行智能解析,将响应速度最快的 CDN 节点 IP 地址返回给本地 DNS。
  6. 用户获取响应速度最快的 CDN 节点 IP 地址。
  7. 浏览器在得到速度最快节点的 IP 地址以后,向 CDN 节点发出访问请求。
  8. CDN 节点将用户所需资源返回给用户。

CDN 节点无缓存场景

在这里插入图片描述

  1. 用户在浏览器输入要访问的网站域名,向本地 DNS 发起域名解析请求。
  2. 域名解析的请求被发往网站授权 DNS 服务器。
  3. 网站 DNS 服务器解析发现域名已经 CNAME 到了 www.example.com.c.cdnhwc1.com。
  4. 请求被指向 CDN 服务。
  5. CDN 对域名进行智能解析,将响应速度最快的 CDN 节点 IP 地址返回给本地 DNS。
  6. 用户获取响应速度最快的 CDN 节点 IP 地址。
  7. 浏览器在得到速度最快节点的 IP 地址以后,向 CDN 节点发出访问请求。
  8. CDN 节点回源站拉取用户所需资源。
  9. 将回源拉取的资源缓存至节点。
  10. 将用户所需资源返回给用户。

PS:CNAME 别名解析是将域名指向一个网址(域名)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值