Big Picture

年底了,面试/被面试的需求比较多,整理一下传统运维的基础面试题,每次10题,随缘更新

  1. 介绍下HTTP请求/响应报文结构
    一个HTTP请求报文由四个部分组成:请求行,请求头部,空行,请求数据
  • 请求行 GET /data/info.html HTTP/1.1(请求方法, URL, HTTP版本)
  • 请求头 大多数服务器在请求中都会在头部带上游览器信息等
  • 空行 空行标识请求头部的结束
  • 请求数据:请求主体,在GET方法中这里一般会是空

一个HTTP响应报文由三个部分组成: 状态行,空行,请求数据

  • 状态行 协议版本(空格)状态码(空格)短语
  • 空行 标识状态行的结束
  • 请求数据 实际的返回数据
  1. cookie是啥
    Cookie是由服务器端生成,发送给客户端,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器

  2. iptables的四表五链

  • 四表: raw, mangel, nat, filter
  • 五链: pre-routing, input, output, forward, post-routing
  1. 给一个linux服务器1G内存,不考虑CPU,一个目录下10个文件,每个文件包含1G大小的正整数,获取10个文件里前10大的正整数。

    内存小,所以无法直接cat,不然直接OOM,如果文件是有换行符的,所以最简单的方法是逐行读取,或者分片读取,读取的数据进行排序,比如逐行读取,定义一个长度为10的数据,先取10个正整数放到数组中,然后排序,随后开始继续逐行读文件,每读取一个,则和之前的数组里的数据比大小,直到每个文件比完。

  2. iptables如何优化

    无非也就两种方法,一种是改写内核过滤策略,比如不依赖netfilter,使用ipset之类的,还要就是优化iptables的写法,写法优化一般以下几类:

  • 带状态连接(new,established,invalid,related)的策略建议放在第一条
  • 应该将那些可由一条规则能够描述的多个规则合并为一条
  • nf_conntrack相关内核参数设置,避免nf_conntrack 爆满
  • iptables -P 谨慎使用,避免把自己关在外面
  • 能合并的策略尽量合并
  • 同类策略范围小的放前面,比如单独1-2个IP的特殊策略
  • 异类策略范围大的放前面,让其早日匹配到
  1. poll, epoll, select的区别是什么?
  • select 无差别轮询所有套接字,如果套接字数量越大,则轮询时间越短。
  • poll 和select其实差别不大,但存储空间会大,select默认支持的数量就是服务器的最大支持句柄数量,本质上是个数组,但poll维护的其实是个链表。
  • epoll 类似个上报机制,每个句柄都会关联上提前需写的函数(事件),一旦socket有请求,则会唤醒对应的事件,好处在于不用轮询,但是问题在于负载高了回调的事件函数会比较多,导致高负载
  1. DNS的解析过程
  • 迭代查询 – 客户端-> 根域名服务器-> if域名服务器查询不到-> 则DNS服务器作为客户端再去查询
  • 递归查询 – 客户端-> 根域名服务器-> if域名服务器查询不到-> 则DNS客户端自己再去查询
  1. 进程间通信方式有哪些

    一共6种: 管道,信号,信号量,消息队列,共享内存,套接字共六种
  • 管道: 数据只能单向操作,比如 ls -l | grep string , 该操作是无法逆向的
  • 信号: 按键、硬件异常、进程调用kill函数将信号发送给另一个进程,比如Kill 动作其实就是对一个进程发送一个SIGKILL的动作,传递的消息比较少
  • 信号量: 类似于一个线程锁, 主要用于线程内部对共享资源的通信。
  • 消息队列: 消息队列是消息的链表,存放在内核中并由消息队列标识符标识,能传递的消息相对较多,但会存在缓冲区的限制,类似可以想象下go里面带缓冲的channel。
  • 共享内存: 性能最高的一种, 就是映射一段能被其他进程所访问的内存,速度很快,但缺乏锁的机制,容易出现类似问题
  • 套接字: 写socket的方式进行通信,主要是面向网络的
  1. 对称加密和非对称加密
  • 对称加密: 即加密的密钥和解密的密钥相同, 对称加密解密的速度比较快,适合数据比较长时的使用。
  • 非对称加密: 非对称加密将密钥分为公钥和私钥,公钥可以公开,私钥需要保密,客户端公钥加密的数据,服务端可以通过私钥来解密, 非对称加密和解密花费的时间长、速度相对较慢,只适合对少量数据的使用。
  1. https通信过程
  • 客户端发送请求到服务端
  • 服务端返回公钥和证书到客户端
  • 客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端
  • 服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做私钥对需要发送的数据进行对称加密
  • 客户端在接收到加密后的数据使用私钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户
  • SSL加密建立