一、tcp/ip 三次握手与四次挥手如何从专业角度去说明它们之间的关系
https://blog.51cto.com/silencezone/1882436
二、redis 之主观下线与客观下线
答:
主观下线: 节点之间会定期的执行ping/pong消息来证明节点之间的连通性,若节点一向节点二发送ping消息之后收到pong消息,那么节点一将会更新最后一次与节点二的通信时间,若没有收到pong消息,那么节点一与节点二之间的链接将会断开,之后节点一再次执行ping消息,若与节点二之间的最后通信时间超过指定的时间,那么节点二将被节点一标记为主观下线。
客观下线:
答: 节点之间通信会携带一些必要的消息,其中就包含标记某节点为客观下线状态,节点中都包含了相关节点状态的链表信息,若节点的客观下线的记录超过半数,那么尝试执行客观下线
尝试客观下线流程:
下线主节点之后,进行故障恢复:
首先是判断该主节点的slave节点是否具有当主节点的资格,若该节点与主节点断开连接超过一定的时间那么就没有资格
之后根据从节点与主节点之间的偏移量进行延迟选举,保证偏移量最小的slave节点获得更多的票
选出节点之后,从节点执行slave none one 变成主节点,从节点将主节点的槽移交给自己完成故障恢复。
三:nginx 主动检查与被动检查
主动健康检查(需使用第三方模块)
答:主动地健康检查,nignx定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中。淘宝有一个开源的实现nginx_upstream_check_module模块
被动检查
答: Nginx只有当有访问时后,才发起对后端节点探测。如果本次请求中,节点正好出现故障,Nginx依然将请求转交给故障的节点,然后再转交给健康的节点处理。所以不会影响到这次请求的正常进行。但是会影响效率,因为多了一次转发,而且自带模块无法做到预警。
四、Nginx知识讲解——location匹配模式详细讲解 (一般匹配优先级:精准匹配 > 一般匹配 > 正则匹配)
1 location = patt {} 精准匹配
精准匹配优先级比一般匹配大
2 location patt {} 一般匹配
nginx会采用匹配长度较长的一般匹配的规则来使用
3 location ~ patt {} 正则匹配
五、rewrite 指令
rewrite 指令 最后一项参数为flag标记,支持的flag 标记主要有以下几种
last: 相当于apache里的[l]标记,表示完成rewrite; 使用alias指定源:必须使用last
break: 本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect:返回302 临时重定向,浏览器地址会显示跳转后的url地址, 爬虫不会更新url(因为是临时)
permanent:返回301 永久重定向,浏览器地址会显示跳转后的url地址,爬虫更新url
last和break 用来实现url重写,浏览器地址url地址不变,
redirect和permanent 用来实现url 跳转
服务器配置好redirect后,打开浏览器会重定向你需要的网站,这个时候关闭网站是会直接报出无法连接的错误
但是permanent永久重定向定义以后,关闭nginx服务器,这个时候在访问同样会成功
这就是redirect跟permanent的区别
六、网络传输 为啥要进行encode编码
答:url转义其实也只是为了符合url的规范而已。因为在标准的url规范中中文和很多的字符是不允许出现在url中的
七:如何批量修改docker images 的tag
docker images | grep haproxy | sed 's/haproxy/192.168.61.121\/haproxy/g'| awk '{print "docker tag"" " $3" "$1":"$2}'|sh
八、tcp/ip 头部包含哪些
1、源端口号 目标端口号
2、信息长度
3、序列号
九、k8s 组件
Apiserver:所有服务的总入口。可以同时多个存在运行
etcd :存储。如果etcd 放在集群内部,将会自动满足etcd高可用集群。(1.15版本以后)
controller-manager:控制器,
scheduler:调度服务。当scheduler决定在哪个node上面运行pod后,将pod的配置发送给kubelet
controller-manager 与scheduler 一样,若是多个节点在一个集群中,那么运行的节点只会是一个,其他节点将自动进去休眠状态。
以下两个不需要高可用,因为这两个是工作在每个节点之上运行的
kubelet:维持容器的生命周期,跟ci去交互(部署,维护)
Proxy:去实现负载的方式
十、k8s 中的pod 如何将业务对外访问
NodePort
十一、docker 镜像 分层,分层的好处
Dockerfile 中的每一行都产生一个新层
下列代码每一行都又一个独立的id,而且下面产生的三层是只读的,一旦Image被运行时,会产生一个新层 container 层,这一层是可读可写的;
分层的优势在于,两个image可以共享一些层,降低了存储的压力。
1、复用,节省磁盘空间,相同的内容只需加载一份到内存。
2、修改dockerfile之后,再次构建速度快
十二、COPY指令和ADD指令有哪些区别
COPY指令和ADD指令功能和使用方式类似。只是COPY指令不会做自动解压工作,而且也不支持从网络获取文件
十三、k8s 控制器有哪些 (6种) 与Service类型
控制器
Deployment 声明式更新控制器,用于发布无状态应用
ReplicaSet 副本集控制器,用于对Pod进行副本规模扩大或剪裁
StatefulSet 有状态副本集,用于发布有状态应用
DaemonSet 在k8s集群每一个Node上运行一个副本,用于发布监控或日志收集类等应用
Job 运行一次性作业任务
CronJob 运行周期性作业任务
Service类型
ClusterIP默认,分配一个集群内部可以访问的虚拟IP
NodePort在每个Node上分配一个端口作为外部访问入口
LoadBalancer工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
ExternalName表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信
十四、http协议原理
HTTP协议的作用原理包括四个步骤:
(1) 连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。
(2) 请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为: GET 路径/文件名 HTTP/1.0 文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。
(3) 应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。
例:假设客户机与www.mycompany.com:8080/mydir/index.html建立了连接,就会发送GET命令:GET /mydir/index.html HTTP/1.0。主机名为www.mycompany.com的Web服务器从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。为了告知 Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。
常用的HTTP头信息有:
① HTTP 1.0 200 OK 这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。代码"200 OK"表示请求完成。
② MIME_Version:1.0 它指示MIME类型的版本。
③ content_type:类型 这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html指示传送的数据是HTML文档。
④ content_length:长度值 它指示HTTP体信息的长度(字节)。
(4) 关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接
十五、tcp/ip 信息 头部包含哪些
typedef struct _TCP_HEADER
{
short m_sSourPort; // 源端口号16bit
short m_sDestPort; // 目的端口号16bit
unsigned int m_uiSequNum; // 序列号32bit
unsigned int m_uiAcknowledgeNum; // 确认号32bit
short m_sHeaderLenAndFlag; // 前4位:TCP头长度;中6位:保留;后6位:标志位
short m_sWindowSize; // 窗口大小16bit
short m_sCheckSum; // 检验和16bit
short m_surgentPointer; // 紧急数据偏移量16bit
}attribute((packed))TCP_HEADER, *PTCP_HEADER;
源端口号以及目的端口号:各占2个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程,通过这两个端口号和IP头部的ip发送和接收号,可以唯一的确定一个连接。一般来讲,通过端口号和IP地址,可以唯一确定一个TCP连接,在网络编程中,通常被称为一个socket接口。
序号:占4字节,用来标识从TCP发送端向TCP接收端发送的数据字节流。
确认序号:占4字节,包含发送确认的一端所期望收到的下一个序号,因此,确认序号应该是上次已经成功收到另一端数据字节序号加1。
数据偏移:占4位,最大为1111即15个数字,一个代表4个字节,用于指出TCP首部长度,若不存在选项,则这个值为20字节,数据偏移的最大值为60字节。
保留字段:占6位,值是确定的,暂时可忽略,值全为0
标志位:
URG(紧急): 为1时表明紧急指针字段有效
ACK(确认):为1时表明确认号字段有效
PSH(推送):为1时接收方应尽快将这个报文段交给应用层
RST(复位):为1时表明TCP连接出现故障必须重建连接
SYN(同步):在连接建立时用来同步序号
FIN(终止):为1时表明发送端数据发送完毕要求释放连接
接收窗口:占2个字节,用于流量控制和拥塞控制,表示当前接收缓冲区的大小。在计算机网络中,通常是用接收方的接收能力的大小来控制发送方的数据发送量,这样可以避免快主机致使较慢主机的缓冲区溢出。TCP连接的一端根据缓冲区大小确定自己的接收窗口值,告诉对方,使对方可以确定发送数据的字节数。
校验和:占2个字节,范围包括首部和数据两部分。检查当前的TCP包是否有问题,有没有损坏丢失
十六、什么是事务
事务是一个最小的工作单元,不论成功与否都作为一个整体进行工作。
当事务失败时,系统返回到事务开始时的状态。这个取消所有变化的过程称为“回滚”( rollback )。例如,如果一个事务成功更新了两个表,在更新第三个表时失败,则系统将两次更新恢复原状,并返回到原始的状态。
保持应用程序的完整性
十七、装饰器运行过程
# 装饰器
# 函数当参数传,是为了给里面的函数增加新功能(或者说加判断)
# 从outer往里走
# x 从当前层 开始寻找a, 找不到就往外寻找(从外不可以往里找)
# 1、从 outter 开始先定义了a=1 | 执行的条件outer(foo)
# 2、返回了一个inner的内存地址
# 3、inner加括号运行内层函数 inner加括号等于outer(foo)()
# 4 定义了x=a,print(x),运行函数foo(),最后返回foo()函数的执行结果=print('foo')
def foo(): print('foo') def outer(foo): a=1 def inner(*args,**kwargs): x=a print(x) res=foo() return res return inner foo=outer(foo) foo()
十八、dns
说说UDP协议是在哪里实用,tcp协议是在哪里实用?
DNS中也有一个地方用到了TCP协议。那就是区域传送!
DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)。 这种情况下,使用TCP协议。
为什么域名解析用UDP协议?
因为UDP快啊!UDP的DNS协议只要一个请求、一个应答就好了。而使用基于TCP的DNS协议要三次握手、发送数据以及应答、四次挥手。但是UDP协议传输内容不能超过512字节。不过客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。
针对第二问,为什么区域传送用TCP协议?
因为TCP协议可靠性好啊!你要从主DNS上复制内容啊,你用不可靠的UDP? 因为TCP协议传输的内容大啊,你用最大只能传512字节的UDP协议?万一同步的数据大于512字节,你怎么办?