-
前言
❗表示必掌握,❔表示基本不会问 -
更新
1 | 24-06-18 初始记录 |
网络
❗TCP IP 四层网络模型、OSI 七层网络模型
大白话描述。
-
物理层:网线,电缆,在物理层面连接网络。(可以发送 0,1 信号)
-
数据链路层:定义一套协议,对 01 数据进行分组。把一堆 0/1 电路信号,封装成数据包,包含头和数据,头包含了目标的 mac 地址(从一台电脑的网卡发送到另一台网卡)。
以太网规定了每个网卡包含一个 mac 地址(唯一)。
在一个局域网/子网内,电脑是广播给所有的电脑(通过网络交换机),通过头的 mac 地址,实现通信。
-
网络层:IP 协议。如果计算机不在子网内,需要路由器进行子网的连接(子网内的请求把路由器的 mac 地址和请求的 mac 地址都写上,路由器把请求转发出去:这里可能是多个网关不断转发)
判断两个 ip 是不是在同一个子网内,要用子网掩码做与运算。再比较前 3 位是否一致(代表网络)。
ARP 协议:局域网内,每个 ip 地址对应一个 mac 地址,局域网内的设备是互相知道的。
网关:其实就是路由器的一种。可以把路由器上的 ip 地址认为是网关。
-
传输层:tcp 协议、udp 协议。端口对端口。(端口号是
0~65536
,0~1023
被占用,别的要用 1024 以上的端口)传输层的 tcp 协议,仅仅是规定了一套基于端口的点对点通信协议,包括如何建立连接,发送和读取消息,实际上要基于 tcp 协议开发,一般使用 socket。
-
应用层:http 协议,stp 协议(邮件)。读取数据,处理数据,发送响应……。
4 层模型:数据链路层 -> 网络层 -> 传输层 -> 应用层
7 层模型:物理层 -> 4 层模型(其中:会话层(SQL)、表示层(加密、ASCII)、应用层(HTTP) -> 应用层)
DNS 地址:把域名地址发送给 DNS 服务器,DNS 服务器(8.8.8.8)告诉你域名地址对应的 ip 和端口号。
HTTP 协议的特点有哪些?
-
默认端口为 80;
-
一次请求对应一次响应;
-
无状态:多次请求和响应间的数据是不共享的,可以通过会话技术解决该问题。
❗浏览器请求一个链接的全过程
-
把域名地址发送给 DNS 服务器,DNS 解析域名到服务器地址
-
先会判断 ip 地址是不是在一个子网内,不是就走网关。直接把浏览器发送的数据按应用层协议,比如 http 协议打包成一个应用层数据包(包含 http 请求报文)。
-
按 tcp 协议的规定,生成 tcp 数据包,请求头包含,发送的端口和请求的端口;tcp 数据包包含 http 数据包。
-
按 ip 协议的规定,生成 ip 数据包,请求头包含,发送的 ip 地址和请求的 ip 地址;ip 数据包包含 tcp 数据包。
-
按以太网的协议,生成以太网数据包,请求头包含,发送的网卡 mac 地址和请求的网卡 mac 地址(网关的 mac 地址);以太网数据包,包含 ip 数据包。以太网数据包限制大小 1500 字节,所以会进行切割。
-
打包完毕,把以太网数据包通过网络交换机发送给(路由器)网关,经过网关的多次转发,发送给请求域名的服务器。服务器按包的序号重新拼接、层层解包,获取 http 请求报文。程序获取请求,做出响应,一层层封装再响应。
❗画一下 TCP 三次握手、四次挥手流程图。为什么是三次?
三次握手:客户端 ->服务端 ->客户端
四次挥手:客户端 ->服务端 ->服务端 ->客户端
为什么是三次:如果只有二次握手,可能会出现比如:发送一次请求,卡在半路;发送二次请求,握手成功。这时一次请求发送成功,服务端建立连接,但是客户端无响应,资源浪费。如果是三次握手,第三次握手可以复位连接,释放资源。
❗http 的工作流程?http1.0、http1.1、http2.0 具体有哪些区别?
工作流程就是浏览器请求一个链接的全过程。
http1.0:tcp 短连接。三次握手、四次挥手,断开连接。
http1.1:默认支持长连接,第一次打开网页,就会打开一个 tcp 连接,接着一段时间内都不关闭。所有网页资源的获取走同一个 tcp 连接,直到获取完毕,关闭连接。但是每个通道都需要一个线程守护,大大影响服务器的并发能力(目前是主流版本 BIO)。
http2.0:支持多路复用,一个 tcp 连接可以并行发送多个请求以及接收响应数据。二进制分帧,将传输数据拆分成更小的包。(底层基于 NIO 的选择器技术实现,未普及)
BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单、使用方便,并发处理能力低。
-
每个客户端与服务端通信都会建一个配对的 socket 线程。缺点:连接客户端过多,服务器会宕机。优化:建一个线程池。
NIO(比较常用):Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
-
服务端有一个 selector 线程(一般 +Cached 线程池),每个客户端连接,注册创建一个 channel。如果客户端发送请求,对 channel 创建一个线程(从线程池),处理完请求线程被销毁。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
-
NIO 比 BIO 多了一个 buffer(缓冲区)的概念,线程从 channel 读取数据会从缓冲区读取(这个读取是直接交给操作系统来干的,是异步的,操作系统读完数据,再告诉线程去处理),写入缓冲区(这个也是异步的)。
小结:
-
BIO 是一个连接一个线程。(只要连接,就分配一个线程)
-
NIO 是一个请求一个线程。(只有 IO 请求,才分配一个线程)
-
AIO 是一个有效请求一个线程。(AIO 是异步的 NIO)
同步阻塞、同步非阻塞、异步非阻塞
BIO 同步阻塞。不是完全网络通信模型,是针对磁盘文件的 IO 读写。
NIO 是同步非阻塞。发起请求后可以去干别的事,但是还是需要主动轮询操作系统。
AIO 是异步非阻塞。操作系统异步通知。
// todo 看 demo 代码
❗聊聊 HTTPS 的工作原理?为什么用 HTTPS 就可以加密通信?
-
浏览器把支持的加密规则发送给网站。网站选择一套加密算法和 hash 算法。
-
网站发自己的证书(网站地址、加密公钥、颁发机构)
-
浏览器去验证证书是否合法(合法链接会有一把锁)。浏览器接着生成一串随机数密码,然后用证书里的公钥进行加密,这块走的非对称加密;发送消息的 hash 值(这个是用随机密码加密过的)
-
网站从消息里提出公钥加密后的随机数密码(用私钥解密),用随机数密码再对消息进行解密,然后用 hash 算法对消息计算 hash 值并与浏览器发送的 hash 值进行比对。网站同样上面的步骤发送,浏览器同样解密。
-
之后浏览器和网站进行的通信,都是走随机密码加密,此时随机密码已经存在浏览器和网站的本地。后续不用再针对这个进行加密解密。(因为这个加密解密只在第一次链接发送,并且要证书才能加密解密,所以安全性较高)
http 的长连接的工作原理是什么?
dubbo 协议走的长连接,可能会带到这个。
http1.0 底层 tcp 是短连接,http1.1 即以后都是长连接(建立了连接之后,无论有多少次请求都是走一个 tcp 连接)。
GET 请求和 POST 请求方式有什么区别吗?
-
请求参数的携带方式同:get 请求放在请求行中,post 放在请求体中。
-
get 请求,请求参数是在请求行中,数据的大小受到浏览器限制;post 请求则是放在请求体中,数据无大小限制。
-
get 请求的安全性低,post 请求相对安全性高(不会作为 url 的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中),且 post 可以进行加密操作。
-
get 的效率比 post 更高,因为 post 请求在真正接受数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据,所以 get 一定是先于 post 执行的。
但是: 本质上来说,GET 请求和 POST 请求没什么区别,只是在浏览器端对它们的使用不同而已,它们底层都是基于 TCP(三次握手、四次挥手)的 Socket 进行数据传输的。
Socket 工作原理
socket 是属于传输层的编程规范。按照视频讲述的内容:就是浏览器发送一个请求链接的部分
-
按 tcp 协议的规定,生成 tcp 数据包,请求头包含,发送的端口和请求的端口;tcp 数据包包含 http 数据包。
-
按 ip 协议的规定,生成 ip 数据包,请求头包含,发送的 ip 地址和请求的 ip 地址;ip 数据包包含 tcp 数据包。
-
按以太网的协议,生成以太网数据包,请求头包含,发送的网卡 mac 地址和请求的网卡 mac 地址(网关的 mac 地址);以太网数据包,包含 ip 数据包。以太网数据包限制大小 1500 字节,所以会进行切割。
-
打包完毕,把以太网数据包通过网络交换机发送给(路由器)网关,经过网关的多次转发,发送给请求域名的服务器。服务器按包的序号重新拼接、层层解包,获取 http 请求报文。程序获取请求,做出响应,一层层封装再响应。
❔进程间是如何通信的
进程间的通信:管道(半双工)、命名管道(半双工)、消息队列、共享内存
❔线程间又如何切换
上下文切换、时间片算法。
场景题
线上服务器的 cpu 使用到达 100%,如何排查、定位、解决问题?
就是找哪段代码出了问题。
场景:catch 时写了死循环。在 catch 中调用了自己的方法
-
定位耗费 cpu 的进程
1 | 显示进程列表 |
-
定位耗费 cpu 的线程
1 | 这里的 pid 就是上一步查出来的 pid |
-
定位哪段代码导致的 cpu 过高
1 | 这里的 pid 是上一步获取到的 线程 pid 为了获取它的16进制表示 |
线上进程 kill 不掉怎么办?
场景:发布系统搞了一个子进程,子进程是系统进程。杀不掉。
kill 一个进程 kill 不掉,这个进程就是变成了一个僵尸进程(zombie)状态。因为这个进程释放了资源,但是父进程没有确认。
1 | 显示所有进程和其状态,可以加 grep 过滤 |
服务器存储空间快满了,在不影响服务正常运行的情况下怎么解决?
-
一般来说,可能是日志写满了。可以去 spring boot 下的日志去看看。还可以写个 shell 脚本,crontab 定时,定期删除 7 天以前的日志。
1 | 查看磁盘使用情况 |
-
要是不行
1 | 找大于100M的文件 |
安全
❗黑客常用的 XSS 网络攻击原理
XSS 攻击和 SQL 注入是大部分的黑客进行网络攻击的手段,除此之外还有 CSRF、Session 劫持之类的。
XSS 攻击:
-
反射型攻击(在 URL 链接里嵌入自己的恶意脚本)。这个 URL 地址指向黑客的服务器,他的服务器会返回一段 html+javascript 恶意脚本(跨站点脚本),在网页内运行(跳转、下载、病毒、流氓软件)。
- 这个脚本,可以通过浏览器获取大量的信息,比如说一些 cookie/密码。可以利用 cookie 伪造用户登录的 session 状态,以用户的名义干一些事情。
- 处理方法:HttpOnly 方式,在浏览器存放 cookie 时,设置一个 HttpOnly 属性。
-
持久型攻击。把恶意脚本放到评论内容里面,这个内容会存到数据库,用户访问浏览器就会访问这个恶意脚本。
- 处理方法:对评论内容进行消毒,就是进行一些转义,比如把
>
转义为>
之类的。这样就可以把恶意脚本里的 html、js 脚本之类的失效。
- 处理方法:对评论内容进行消毒,就是进行一些转义,比如把
❗SQL 注入攻击背后的原理
执行 SQL 注入必须要知道你的数据库表结构。
- 开源软件,会被知道表结构
- 错误回显。堆栈信息被暴露到前端。
- 根据参数的名称,大致推测(一般不现实)
参数使用预编译可以预防。例:mybatis 使用 #
不使用 $
❗CSRF 攻击及背后原理
(Cross Site Request Forgery) 跨站点请求伪造。通过恶意脚本获取用户 cookie,通过伪造 cookie,伪造请求获取信息。
处理方法
-
防止 cookie 被窃取。给网站的 cookie 设置 HttpOnly 属性。
-
随机 token。请求携带随机 token,存放在 redis 里。
-
验证码。
-
验证请求中的 referer。
❗如果系统允许用户上传文件,有可能会遭到什么攻击
文件可能是可执行的脚本、病毒。
处理方法
-
白名单校验。限制上传文件的类型(根据开头字节的 magic number 来判断文件的类型。例:FFD8FF:JEPG、89504E47:PNG)。限制文件大小。对文件重命名。对文件进行一定的压缩。
❗DDos 攻击是什么
distributed denial of service,分布式拒绝服务攻击。
Dos。假设你的系统每秒能接受的请求为 1000,黑客以每秒 1000 的请求访问,机器就会宕机。Dos 攻击是一对一的。但是,现在系统都设计了集群。攻击一台服务器,其他服务器还是可以接受请求。
DDos。控制大量的机器(肉鸡),比如一些共公司的服务器(被木马植入给控制了),一起攻击目标。
-
SYN Flood 模式的 DDos 攻击三次握手。服务器返回 SYN+ACK 后,如果没有接收到返回,会进入等待列表(会为等待的客户端预留网络资源)。这个模式是一个漏洞。黑客利用肉鸡,发送大量的 SYN 请求,服务器会为它们预留网络资源(网络资源耗尽)。正常用户访问就会拒绝连接。
-
基于 DNS Query Flood 的 DDos 攻击控制肉鸡伪造大量不存在的域名,把 DNS 服务器瘫痪。这时用户访问域名地址就会失败。
-
基于 Http Flood 的 DDos 攻击(cc 攻击)控制大量 HTTP 代理服务器,去给目标服务器发送大量的 HTTP 请求。
处理方法
采购云厂商的安全服务。DDos 高防 IP,可以把攻击流量都导入到云厂商的高防 IP 服务器上。