1、tcp和udp的区别
TCP |
UDP |
tcp是面向连接的,需要经过三次握手后才能连接 |
udp是无连接的,直接发送数据即可 |
tcp提供可靠传输,无差错,不丢失 |
udp尽最大努力交付,即不保证可靠交付 |
面向字节流 |
面向报文 |
点对点连接 |
一对一,一对多,多对一,多对多 |
|
|
2、tcp三次握手四次挥手
三次握手
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手
四次挥手过程
第一次挥手:客户向服务器发送FIN段(FIN=1),请求释放连接,等待服务器确认
第二次挥手:服务器向客户发送ACK段(ACK=1)
第三次挥手:服务器向客户发送FIN段(FIN=1),请求释放连接,等待客户确认
第四次挥手:客户向服务器发送ACK段,并等待2MSL时间后关闭连接;服务器收到ACK段后马上关闭连接
为什么是四次??
因为服务端还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文
为什么客户端在TIME-WAIT阶段要等2MSL?
客户在TIME_WAIT状态之所以要等待2MSL时间才真正释放连接,一方面是为了以防最后一次ACK段丢失,会导致服务器重发FIN,这样在客户端真正释放连接前还可以再次发送ACK段,尽可能确保服务器尽快释放连接;另一方面是为了保证在2MSL期间,该连接的本地端点地址(IP+PORT)不被再次使用,避免可能的较早连接请求到达,被误认为时新连接请求
3、https传输是怎么是安全的?
https相对于http,其实就是在http和tcp之间多加了一层TLS/SSL加密协议
原先是应用层将数据直接给到TCP进行传输,现在改成应用层将数据给到TLS/SSL,将数据加密后,再给到TCP进行传输。现在一般加密套件都是TLS,TLS是SSL的升级版
加密又又对称加密和非对称加密两种
4、nginx状态码499过很多,如何解决?
499 :client has closed connection
499产生的原因“服务端处理时间太长,客户端主动断开”,即服务器upstream处理过慢,导致用户提前关闭连接,可以通过修改nginx配置proxy_ignore_client_abort on;来解决
5、redis cluster集群分片机制是怎么样的?
Redis Cluster 采用虚拟哈希槽分区,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:slot = CRC16(key) & 16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。
6、redis 配置中rdb aof区别?
RDB |
AOF |
RDB很适用于灾难恢复,它只有一个文件 |
AOF持久化会让Redis变得非常耐久,以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync |
RDB可以最大化redis性能,生成RDB快照时redis会fock出一个子进程,由子进程处理保存快照工作,父进程无磁盘I/O操作 |
AOF文件有序保存了所有写入操作,可以很轻松的对文件进行分析和导出 |
RDB恢复速度比AOF快 |
自动缩小:当aof文件大小到达一定程度的时候,后台会自动的去执行aof重写 |
缺点:在数据量庞大的时候,fork进程会很耗时 |
缺点:性能相对较差 |
缺点:不能事实保存快照数据,存在数据丢失的风险 |
缺点: 体积相对更大,恢复速度更慢 |
7、redis缓存过期key优化
为啥设置了expire过期key,内存没有释放
key设置过期时间了,ttl为0后并不会自行删除该key,而是等到下次访问该key发现已过期,才会删除。
解决方法:
- 命令keys * 会瞬间释放所有过期key,但是有风险,慎行。
- 其实缓存是在释放的,只不过是没有那么快,释放的快慢取决于redis.conf中的hz参数默认为10,意思是每秒执行10次删除过期key。所以在redis过期较多的场景可以适当调大。并观察cpu是否升高, 提高它的值将会占用更多的cpu,固然相应的redis将会更快的处理同时到期的许多key,和更精确的去处理超时
可在命令行执行:config set hz 50
8、简述Kubernetes创建一个Pod的主要流程?
1.客户端提交pod配置信息到apiserver
2.apiserver收到指令后,会通知controll-manager创建资源对象
3.apiserver会讲配置信心存储到etcd数据中心
4.scheduler检测到pdo信息后开始调度预选,会先过滤掉不符合pod资源配置的节点,然后开始调度优选评分,挑选出更适合的pod节点,然后将pod资源配置信息发送到node节点上的kubelet组件上
5.kubelet根据scheduler发来的资源配置运行pod,运行结果返回scheduler,scheduler将运行状况信息存储到etcd数据中心
9、Memcache与Redis的区别都有哪些?
Memcache |
Redis |
数据不能持久化 |
可持久化数据 |
只支持简单字符串 |
丰富的数据类型,list set hash |
只有1M大小 |
value值大小 string类型最大到512M |
10、python 用一行实现对一个列表中元素做平方操作
* 列表生成式 : newlist = [a*a for a in list]
* map 函数: newlist = map(lambda a:a*a,list)
A1 = [1,2,3,4,5,6]
print(list(map(lambda x:x*2,A1)))
print([a*2 for a in A1])
11、docker网络模式
网络模式 |
说明 |
host模式 |
容器和宿主机共享网络空间 |
none模式 |
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP,只有回环网络,没有网卡 |
container模式 |
新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享 |
briage模式 |
默认为该模式,Docker启动时,会创建一个docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,工作在二层网络中,从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中 |
12、Dockerfile中cmd和entrypoint的区别
CMD(默认方式) |
ENTRYPOINT |
Dockerfile中只能有一条CMD指令,如果有多个CMD 则只有最后一个CMD才会生效 |
如果Dockerfile中有CMD和ENTRYPOINT,那么CMD将作为ENTRYPOINT的参数执行 |
docker run指定的cmd可以覆盖Dockerfile中定义的CMD |
docker run --entrypoint可覆盖Dockerfile定义的ENTRYPOINT |
13、docker存储驱动有哪些?
Driver |
说明 |
特点 |
overlay2 |
首选存储驱动程序,官方推荐 |
文件级别存储 |
aufs |
内核支持 |
文件级别存储 |
devicemapper |
以后可能会废弃 |
块级别存储,适合io密集 |
14、docker数据存储方式?
options |
information |
volumes |
首选,基于本地文件系统Volumn管理,通过-v参数,volume中的数据并不会因为容器的删除二消失,实现了数据持久化的目标。但是这种方式的volume需要在Dockerfile中使用VOLUME来预先指定容器中的数据存放路径 |
bind mounts |
可以动态的指定容器内文件存放路径和宿主机上的数据库卷目录,通过--mount, |
docker run -d -p 80:80 --mount type=bind,source=/Users/u51/Desktop/dockerfile/,target=/usr/share/nginx/html --name web xull_n
15、elastisearch分片机制是怎么分配的?
Elasticsearch6.X及之前的版本默认索引分片数为5、副本数为1,从Elasticsearch7.0开始调整为默认索引分片数为1、副本数为1.
数据的最小单元块,ES默认为一个索引创建1个主分片,并分别为其创建一个副本
建议:(仅参考)
SN(分片数) = IS(索引大小) / 10-40G
1、每一个分片数据文件小于10-40GB
2、每一个索引中的一个分片对应一个节点
3、节点数大于等于分片数
16、nginx工作机制是怎样的?
通常采用1个master+多个worker进程配合异步非阻塞的工作机制。
master进程主要负责管理自身和下属的worker进程,worker负责处理请求。
master(master进程会先建立好需要listen的socket)---fork生成子进程,继承socket(每个进程监控同一ip和端口)---当一个连接进入,产生惊群现象,所有进程都会收到通知,但只有一个进程能够抢到互斥锁,accept这个连接,其他进程则失败。
惊群现象:指一个fd事件被触发后,等候这个fd的所有进程、线程都被唤醒,但是只有一个会去响应。
worker进程工作:
当一个worker在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,一个完整的请求。一个请求,完全由worker进程来处理,而且只在一个worker中处理
为什么Nginx支持高并发?
1个worker进程只有一个主线程,采用异步非阻塞的工作方式实现高并发。即每进来一个请求,会有一个worker去处理,但不是全程处理,处理到可能发生阻塞的地方(比如向后端FPM转发请求,并等待请求返回),这个worker不会这个傻等,它会在发送请求后,注册一个事件:如果有返回了,通知我。于是worker就去休息(继续监听连接),再有请求进来同样处理。一旦FPM返回了,就会触发事件,worker接手,请求才会往下走
worker_processes 工作进程数,一般设置为CPU核心数
worker_connections 单个工作进程可以允许同时建立外部连接的数量
17、elasticsearch优化
- 选择合适的硬件,尽量选择SSD硬盘
- es服务配置合适的jvm内存,建议配置为机器的一半内存,不超过32G
- 规模较大集群,配置专门主节点、数据节点,避免脑裂情况发生
主节点:node.master:true node.data: false node.ingest:false
数据节点:node.master:false node.data:true node.ingest:true
- linux系统调优
- 调大refresh_interval间隔
18、CDN加速原理?