面试-计算机基础
Kiml Lv5
  • 前言
    ❗表示必掌握,❔表示基本不会问

  • 更新

1
2
24-06-18 初始记录
24-06-21 网络安全

网络

❗TCP IP 四层网络模型、OSI 七层网络模型

大白话描述。

  1. 物理层:网线,电缆,在物理层面连接网络。(可以发送 0,1 信号)

  2. 数据链路层:定义一套协议,对 01 数据进行分组。把一堆 0/1 电路信号,封装成数据包,包含头和数据,头包含了目标的 mac 地址(从一台电脑的网卡发送到另一台网卡)。

    以太网规定了每个网卡包含一个 mac 地址(唯一)。

    在一个局域网/子网内,电脑是广播给所有的电脑(通过网络交换机),通过头的 mac 地址,实现通信。

  3. 网络层:IP 协议。如果计算机不在子网内,需要路由器进行子网的连接(子网内的请求把路由器的 mac 地址和请求的 mac 地址都写上,路由器把请求转发出去:这里可能是多个网关不断转发

    判断两个 ip 是不是在同一个子网内,要用子网掩码做与运算。再比较前 3 位是否一致(代表网络)。

    ARP 协议:局域网内,每个 ip 地址对应一个 mac 地址,局域网内的设备是互相知道的。

    网关:其实就是路由器的一种。可以把路由器上的 ip 地址认为是网关。

  4. 传输层:tcp 协议、udp 协议。端口对端口。(端口号是 0~655360~1023 被占用,别的要用 1024 以上的端口

    传输层的 tcp 协议,仅仅是规定了一套基于端口的点对点通信协议,包括如何建立连接,发送和读取消息,实际上要基于 tcp 协议开发,一般使用 socket。

  5. 应用层:http 协议,stp 协议(邮件)。读取数据,处理数据,发送响应……。

4 层模型:数据链路层 -> 网络层 -> 传输层 -> 应用层

7 层模型:物理层 -> 4 层模型(其中:会话层(SQL)、表示层(加密、ASCII)、应用层(HTTP) -> 应用层)

DNS 地址:把域名地址发送给 DNS 服务器,DNS 服务器(8.8.8.8)告诉你域名地址对应的 ip 和端口号。

HTTP 协议的特点有哪些?

  1. 默认端口为 80;

  2. 一次请求对应一次响应;

  3. 无状态:多次请求和响应间的数据是不共享的,可以通过会话技术解决该问题。

❗浏览器请求一个链接的全过程

  1. 把域名地址发送给 DNS 服务器,DNS 解析域名到服务器地址

  2. 先会判断 ip 地址是不是在一个子网内,不是就走网关。直接把浏览器发送的数据按应用层协议,比如 http 协议打包成一个应用层数据包(包含 http 请求报文)。

  3. 按 tcp 协议的规定,生成 tcp 数据包,请求头包含,发送的端口和请求的端口;tcp 数据包包含 http 数据包。

  4. 按 ip 协议的规定,生成 ip 数据包,请求头包含,发送的 ip 地址和请求的 ip 地址;ip 数据包包含 tcp 数据包。

  5. 按以太网的协议,生成以太网数据包,请求头包含,发送的网卡 mac 地址和请求的网卡 mac 地址(网关的 mac 地址);以太网数据包,包含 ip 数据包。以太网数据包限制大小 1500 字节,所以会进行切割。

  6. 打包完毕,把以太网数据包通过网络交换机发送给(路由器)网关,经过网关的多次转发,发送给请求域名的服务器。服务器按包的序号重新拼接、层层解包,获取 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 就可以加密通信?

  1. 浏览器把支持的加密规则发送给网站。网站选择一套加密算法和 hash 算法。

  2. 网站发自己的证书(网站地址、加密公钥、颁发机构)

  3. 浏览器去验证证书是否合法(合法链接会有一把锁)。浏览器接着生成一串随机数密码,然后用证书里的公钥进行加密,这块走的非对称加密;发送消息的 hash 值(这个是用随机密码加密过的)

  4. 网站从消息里提出公钥加密后的随机数密码(用私钥解密),用随机数密码再对消息进行解密,然后用 hash 算法对消息计算 hash 值并与浏览器发送的 hash 值进行比对。网站同样上面的步骤发送,浏览器同样解密。

  5. 之后浏览器和网站进行的通信,都是走随机密码加密,此时随机密码已经存在浏览器和网站的本地。后续不用再针对这个进行加密解密。(因为这个加密解密只在第一次链接发送,并且要证书才能加密解密,所以安全性较高

http 的长连接的工作原理是什么?

dubbo 协议走的长连接,可能会带到这个。

http1.0 底层 tcp 是短连接,http1.1 即以后都是长连接(建立了连接之后,无论有多少次请求都是走一个 tcp 连接)。

GET 请求和 POST 请求方式有什么区别吗?

  1. 请求参数的携带方式同:get 请求放在请求行中,post 放在请求体中。

  2. get 请求,请求参数是在请求行中,数据的大小受到浏览器限制;post 请求则是放在请求体中,数据无大小限制。

  3. get 请求的安全性低,post 请求相对安全性高(不会作为 url 的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中),且 post 可以进行加密操作。

  4. get 的效率比 post 更高,因为 post 请求在真正接受数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据,所以 get 一定是先于 post 执行的。

但是: 本质上来说,GET 请求和 POST 请求没什么区别,只是在浏览器端对它们的使用不同而已,它们底层都是基于 TCP(三次握手、四次挥手)的 Socket 进行数据传输的。

Socket 工作原理

socket 是属于传输层的编程规范。按照视频讲述的内容:就是浏览器发送一个请求链接的部分

  1. 按 tcp 协议的规定,生成 tcp 数据包,请求头包含,发送的端口和请求的端口;tcp 数据包包含 http 数据包。

  2. 按 ip 协议的规定,生成 ip 数据包,请求头包含,发送的 ip 地址和请求的 ip 地址;ip 数据包包含 tcp 数据包。

  3. 按以太网的协议,生成以太网数据包,请求头包含,发送的网卡 mac 地址和请求的网卡 mac 地址(网关的 mac 地址);以太网数据包,包含 ip 数据包。以太网数据包限制大小 1500 字节,所以会进行切割。

  4. 打包完毕,把以太网数据包通过网络交换机发送给(路由器)网关,经过网关的多次转发,发送给请求域名的服务器。服务器按包的序号重新拼接、层层解包,获取 http 请求报文。程序获取请求,做出响应,一层层封装再响应。

❔进程间是如何通信的

进程间的通信:管道(半双工)、命名管道(半双工)、消息队列、共享内存

❔线程间又如何切换

上下文切换、时间片算法。

场景题

线上服务器的 cpu 使用到达 100%,如何排查、定位、解决问题?

就是找哪段代码出了问题。

场景:catch 时写了死循环。在 catch 中调用了自己的方法

  1. 定位耗费 cpu 的进程

1
2
3
4
# 显示进程列表
top -c
# 然后输入 P,按照 cpu 使用率排序
# 输入 M,按照内存排序
  1. 定位耗费 cpu 的线程

1
2
3
4
# 这里的 pid 就是上一步查出来的 pid
top -Hp pid
# 这样可以获取线程的 pid
# 然后输入 P,按照 cpu 使用率排序
  1. 定位哪段代码导致的 cpu 过高

1
2
3
4
# 这里的 pid 是上一步获取到的 线程 pid 为了获取它的16进制表示
printf "%x\n" pid
# jstack 进行分析
jstack 进程pid | grep '线程pid' -C -color

线上进程 kill 不掉怎么办?

场景:发布系统搞了一个子进程,子进程是系统进程。杀不掉。

kill 一个进程 kill 不掉,这个进程就是变成了一个僵尸进程(zombie)状态。因为这个进程释放了资源,但是父进程没有确认。

1
2
3
4
5
# 显示所有进程和其状态,可以加 grep 过滤
ps aux
# 查看 STAT 那一栏,如果是 Z,就是僵尸进程
ps -ef|grep 僵尸进程id,可以找到父进程id
# 然后先 kill 父进程,再 kill 子进程

服务器存储空间快满了,在不影响服务正常运行的情况下怎么解决?

  1. 一般来说,可能是日志写满了。可以去 spring boot 下的日志去看看。还可以写个 shell 脚本,crontab 定时,定期删除 7 天以前的日志。

1
2
# 查看磁盘使用情况
df -h
  1. 要是不行

1
2
3
4
# 找大于100M的文件
find / -size +100M |xargs ls -lh
# 看各个目录占用的磁盘大小。这个命令可以把占用大小导出
du -h >fs_du.log

安全

❗黑客常用的 XSS 网络攻击原理

XSS 攻击和 SQL 注入是大部分的黑客进行网络攻击的手段,除此之外还有 CSRF、Session 劫持之类的。

XSS 攻击:

  1. 反射型攻击(在 URL 链接里嵌入自己的恶意脚本)。这个 URL 地址指向黑客的服务器,他的服务器会返回一段 html+javascript 恶意脚本(跨站点脚本),在网页内运行(跳转、下载、病毒、流氓软件)。

    • 这个脚本,可以通过浏览器获取大量的信息,比如说一些 cookie/密码。可以利用 cookie 伪造用户登录的 session 状态,以用户的名义干一些事情。
    • 处理方法:HttpOnly 方式,在浏览器存放 cookie 时,设置一个 HttpOnly 属性。
  2. 持久型攻击。把恶意脚本放到评论内容里面,这个内容会存到数据库,用户访问浏览器就会访问这个恶意脚本。

    • 处理方法:对评论内容进行消毒,就是进行一些转义,比如把 > 转义为 &gt 之类的。这样就可以把恶意脚本里的 html、js 脚本之类的失效。

❗SQL 注入攻击背后的原理

执行 SQL 注入必须要知道你的数据库表结构。

  1. 开源软件,会被知道表结构
  2. 错误回显。堆栈信息被暴露到前端。
  3. 根据参数的名称,大致推测(一般不现实)

参数使用预编译可以预防。例:mybatis 使用 # 不使用 $

❗CSRF 攻击及背后原理

(Cross Site Request Forgery) 跨站点请求伪造。通过恶意脚本获取用户 cookie,通过伪造 cookie,伪造请求获取信息。

处理方法

  1. 防止 cookie 被窃取。给网站的 cookie 设置 HttpOnly 属性。

  2. 随机 token。请求携带随机 token,存放在 redis 里。

  3. 验证码。

  4. 验证请求中的 referer。

❗如果系统允许用户上传文件,有可能会遭到什么攻击

文件可能是可执行的脚本、病毒。

处理方法

  1. 白名单校验。限制上传文件的类型(根据开头字节的 magic number 来判断文件的类型。例:FFD8FF:JEPG、89504E47:PNG)。限制文件大小。对文件重命名。对文件进行一定的压缩。

❗DDos 攻击是什么

distributed denial of service,分布式拒绝服务攻击。

Dos。假设你的系统每秒能接受的请求为 1000,黑客以每秒 1000 的请求访问,机器就会宕机。Dos 攻击是一对一的。但是,现在系统都设计了集群。攻击一台服务器,其他服务器还是可以接受请求。

DDos。控制大量的机器(肉鸡),比如一些共公司的服务器(被木马植入给控制了),一起攻击目标。

  1. SYN Flood 模式的 DDos 攻击三次握手。服务器返回 SYN+ACK 后,如果没有接收到返回,会进入等待列表(会为等待的客户端预留网络资源)。这个模式是一个漏洞。黑客利用肉鸡,发送大量的 SYN 请求,服务器会为它们预留网络资源(网络资源耗尽)。正常用户访问就会拒绝连接。

  2. 基于 DNS Query Flood 的 DDos 攻击控制肉鸡伪造大量不存在的域名,把 DNS 服务器瘫痪。这时用户访问域名地址就会失败。

  3. 基于 Http Flood 的 DDos 攻击(cc 攻击)控制大量 HTTP 代理服务器,去给目标服务器发送大量的 HTTP 请求。

处理方法
采购云厂商的安全服务。DDos 高防 IP,可以把攻击流量都导入到云厂商的高防 IP 服务器上。

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量