面了一家网络工程师,感觉明天要拿Offer了,但这不是我从事的职位,这只是保底Offer,唉,好希望有点底气哦!这几周劳资花了太多钱了,我又有了新的目标,明天不过一场小考验,检验我这几天的复习成果,其实我真正的目标,是下周的互联网金融。我太容易堕落了,必须找到目标
1、linux系统中如何获取pid为100的进程的所有TCP连接,请给出详细命令?(不看操作界面是做不出来的,当然有思路就行,就说awk条件判断)
答:[[email protected] 1dir]# netstat -tnlp|awk ‘{print $7}‘|awk -F "/" ‘$1==100{print $0}‘
2、Squid如何查看缓存命中率和清理缓存信息。
答:安装squid时自带的squidclient工具,suqid命中率很低的原因可能是请求的动态内容太多,而squid主要缓存静态内容。Web缓存典型的cache命中率在30%到60%之间,在这里端口是可以是3128也可以是80、
squidclient -p 3128 mgr:info
squidclient -p 3128 -m PURGE http://www.361way.com #强制更新某个url,即清理某连接的squid
参考文档:http://www.361way.com/squid-percentage/1951.html
3、主机A需要给主机B传输一份10GB的数据,从应用层上可以做哪些传输优化?从TCP上可以做哪些传输优化?请分别列举优化措施。
答:(1)应用层上经过压缩再进行传输。
(2)把10个GB大小的数据分成一个一个小段进行传输,这是为了流量控制,避免发送方发的太快了。
(3)TCP层上,首部控制信息上能不能加少点,比如不加填充选项,另外能把TCP改为UDP吗,因为UDP系统开销要小点,数据本来就大,不然传输太浪费时间了。
4、说一下linux 的启动流程(我特么多希望能考这个题啊!)
答:(1)BIOS 加电自检,决定从网络、硬盘或者USB、光盘等方式启动
(2)读取MBR,加载bootloader,出现grub 菜单,加载内核
(3)启动第一个进程即init 进程,读取/etc/inittab,决定从哪个运行级别启动
(4)侦测硬件,加载驱动程序,执行/etc/rc.sysint 系统初始化,比如网络、时区等
(5)运行一些某个级别下开机自启服务,启动内核模块
(6)读取/etc/rc.local,执行开机运行脚本
(7)miggety 程序运行/bin/login,出现用户登录界面,经过身份认证后,用户方可使用操作系统
5、尽可能多的列出你知道的安装linux操作系统的方法。(妈蛋,这特么啥垃圾问题)
答:(1)PXE kickstart无人值守自动安装
(2)在光盘放入镜像,分区格式化等等。
(3)在虚拟机中克隆其他的操作系统
6、简述下传统机械硬盘和SSD的性能差异,并列举几种。(没见过固态硬盘、衡量一个硬盘主要是存储容量、读写能力、以及稳定性)
答:区别(1)机械硬盘的磁盘读写能力不如固态硬盘
(2)抗震性和稳定性,固态硬盘优于机械硬盘
(3)外观上,机械硬盘是用磁盘转的,磁头、扇区、柱面等寻道比较消耗系统资源,而固态硬盘就是个芯片似的
举例:机械:SAS、SCSI、IDE硬盘、SATA 固态硬盘:SSD
7、简述DHCP的获取IP地址的过程。(这我要好好整理下了)
答:四次报文的交互过程。服务器端UDP 67端口,客户端68端口。
(1)客户端广播发送一个DHCP discover报文,询问该网段中有谁能给我提供IP地址。
(2)所有本网段的DHCP服务器都能收到该offer报文,给客户端返回一个DHCP offer报文,依然是广播,因为客户端没有IP地址
(3)客户端选择第一个到达的DHCP offer报文,作为他的服务器,然后广播发送DHCP request报文,表示我选中这台服务器给我发IP了。
(4)被选中的那台服务器收到后,给客户端发送DHCP ACK报文,该报文中含有租约、主机所需IP、网关、子网掩码、以及DNS
8、ftp的主动模式和被动模式,各有什么使用场景,并简述两种模式下,ftp的连接建立过程?(使用场景有点新颖)
答:场景:主动模式用于下载,被动模式用于上传。因为下载必须由服务器主动传过来,而上传是客户端主动(服务端被动)传过来的。
注意:建立控制连接前都要建立TCP连接,随机端口N大于1024
(2)主动模式:客户端打开一个控制端口N,同时开启一个数据端口N+1,控制端口N 与服务端的21 端口建立连接;然后客户端发送Port命令告知对方服务端
我的数据端口是N+1,于是服务端用20 端口和客户端的数据端口N+1 建立通道,从而开始传输数据
(3)被动模式:也是客户端打开一个控制端口N,同时开启另一个数据端口N+1,和服务端的21端口初始化建立控制连接。客户端发送PASV命令,询问对方数据端口P是否可用,如果可用,服务端打开P端口,返回ACK确认信息,然后客户端就去主动连服务端的数据通道端口了。
9、linux系统中如何获取pid为100的进程所监听的tcp端口,请给出详细命令。(问题很新颖呀)
答:netstat -antup |grep 100
10、需要抓取eth1网卡上从127.10.32.5发到本机8080端口的数据包,请列举你能想到的工具或者方法?并给出一个具体的方法的实现(详细命令或者代码)?
答:tcpdump tcp port 8080 -i eth1 and src host 127.10.32.5 ##tcpdump -i eth1 src net 127.0.0.0
11、服务器交付业务方使用后,使用netstat命令发现有大量的time_wait连接,请简述time_wait连接存在的原因?如何解决。(注意,原因不是作用)
答:(1)原因:一般线上出现大量time_wait的重要背景是业务使用了nginx代理。由于nginx使用短连接的方式和客户端大量交互,
(2)危害:如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket,甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务。另外,如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。
(3)解决方法:发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
vi /etc/sysctl.conf 编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 #修改系統默认的 TIMEOUT 时间,
然后执行 /sbin/sysctl -p 让参数生效
12、短连接和长连接有什么区别?什么场景下用短连接?什么时候用长连接?
答:(1)区别:短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接;连接→数据传输→关闭连接;所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接维持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)。
(2)优点:短连接:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段,长连接减少系统开销,避免频繁三次握手。
(3)场景:银行或者电子商务使用短连接,使用完毕就断开。长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况,例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
参考文档:http://www.cnblogs.com/onlysun/p/4520553.html
13、http的keepalive的作用是什么,有什么优缺点?它和tcp的keepalive有何区别?
答:(1)TCP的keep alive是检查当前TCP连接是否活着;HTTP的Keep-alive是要让一个TCP连接活久点。它们是不同层次的概念。
(2)
14、LVS的持久连接机制是什么?session绑定和session共享有何区别?如何理解会话保持时间Persistence?
答:(1)当一个客户端发起请求时,不管TCP连接有没有断开,只要这个客户访问过,我们的LVS就会在内存缓冲区当中,将来自客户端第一次发起请求的连接IP地址和给他所选定的real server绑定映射关系,无论使用何种算法。当客户端再次访问时,直接查看这个会话表,若持久连接模板没有超时,则交给同一个real server处理。
(2)区别:session绑定就是在一台机器上,一般是调度器,映射客户端IP和服务端IP的关系,只要是你这个客户端,那么只要不超时,你客户端的请求都是后端某台固定的机器来处理的,session绑定就是持久连接。而sesion共享是针对多台服务器共享一个会话信息,同时也能避免session复制的开销。session绑定一般用在lvs的场景下,而session共享一般用在数据库服务器中,专门搭建一台Memcached来进行存储session。
(3)persistence:这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作,那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制。(起初我还以为每台服务器处理的固定时间呢,看来是由客户端影响的)
参考文档:http://wenku.baidu.com/view/f5ec0c65ee06eff9aef80779.html?from=search
15、keepalived的工作原理机制是什么,并说明LVS+keepalived如何测试?
答:keepalived使用D类组播地址224.0.0.18进行心跳检测,keepalived使用vrrp协议进行通信,在keepalived配置文件中生成两个VRRP实例,将两台物理服务器虚拟成一个逻辑服务器,并使用同一个虚拟IP(这里没有虚拟MAC,因为在Internet中的网关不是LVS调度器),在网络和系统正常情况下,主控调度器将客户端发往虚拟IP的请求进行分组转发,而备份调度器不做什么事,当主控调度器挂掉之后,备份调度器能够检测到,并进行故障的切换,备份机器开始替代成为主控机器,从而不影响客户端的访问,从而实现系统的高可用性。
测试:(1)停掉主控机器的keepalived或者直接把主控机器直接关机,在备份机器上查看系统日志/var/log/message,以及tcpdump vrrp,检测到VIP漂移到备份
机器上,并且成为Master角色。
(2)在浏览器访问VIP 80端口的时候,检测是否页面交替出现,则证明负载均衡的效果。然后停掉后端某一台真实web服务器,检测客户端是否依然能正常访问
某一个页面。
16、Memcached工作原理,有何特点,作用、应用场景、端口号以及常用命令有哪些?(握草,这就难了,可是简历已经写了,本想凑个字数,如今添麻烦啊)
答:(1)内存管理机制中,SlabAllocator的基本原理是按照预先规定的数据块大小,将已分配的内存分割成特定长度的块(chunk),这里有一个增长因子的说法,并把尺寸相同的块分成一个组(class),当用户发来key-value存储请求时,memcached会计算key+value的大小,看看属于哪个slab。确定slab后看里面的是否有空闲chunk放置key+value,如果不够就再向系统申请一个内存页面page,如果已经到达了申请上限,则使用LRU算法移除已有的一些数据。
(2)特点:它是内存缓存服务器,本身无法决定缓存任何数据,一半依赖于客户端,一半依赖于服务端,惰性机制(过期了也不清理),基于LRU最近最少使用算法移除数据(有种说法是不删除数据,只是不显示给客户端),影响业务本身,但不影响元数据本身。缓存对象大小各不一样,内存碎片问题是主要问题,无法根治。分布式缓存服务器(即多台Memcached服务器)彼此是不通信的。
(3)作用:对查询频繁的数据进行缓存,从而减小后端数据库服务器的处理查询压力。
(4)场景:在Mysql一主多从架构中,对从服务器集群的查询缓存。
(5)端口号:11211 ,通过telnet localhost 11211进行测试
(6)六个常用命令:get set stats add delelte append等
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当memcached的内存空间不足时(无法从slab
class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想
参考文档:http://blog.163.com/czg_e/blog/static/4610456120114755125970/
17、Memcached如何优化?
答:以最大可能解决内存碎片问题。
1,-n 参数的设置,注意将此参数设置为1024可以整除的数(还要考虑48B的差值),否则余下来的部分就浪费了。
2,不要存储超过1m的数据。因为要拆成多个chunk,计算和时间成本都成倍增加。
3,善用stats命令查看memcached状态。
4,消灭eviction(被删除的数据)。造成eviction是因为内存不够,有三个思路:一是在CPU有余力的情况下开启压缩(PHP扩展);二是增加内存;三是调整 -f 参数,减少内存浪费。
5,调整业务代码,提高命中率。
6,缓存小数据。省带宽,省网络I/O时间,省内存。
7,根据业务特点,为数据尺寸区间小的业务分配专用的memcached实例。这样可以调小 -f 参数,使数据集中存在少数几个slab上,内存浪费较少。
参考文档:https://my.oschina.net/liuxd/blog/63129
18、rsync的工作原理?工作方式,有何特点?
答:(1)rsync基于C/S客户服务器模式,rsync服务器打开873端口通道,等待客户端连接过来,如果口令认证通过,则允许同步到远程客户机,第一次同步的时候,把要同步的文件全部通过TCP/IP网络发送过去,第二次同步的时候,会通过某种算法比较已经存在的文件和将要同步的文件之间的差异,再把差异部分传输过去,从而提高传输的效率。
(2)本地模式:通过rsync命令进行推、拉操作。 daemon模式:结合inotify内核监控机制,写入一个rsync脚本进行触发式同步操作 crond模式:定时周期性的进行远程同步。
(3)特点:①增量备份②保持文件的属性不变③支持删除目的机器有而源机器没有有④可以指定某些文件不进行同步⑤支持传输前进行压缩,从而节省带宽。
19、exec、source以及bash的区别。(真的不好理解)
答:(1)exec:在原进程中执行,但是同时会终止原进程。
(2)source:在原进程中执行,但是不产生子进程。
(3)bash:父进程会用fork方法创建一个子进程,shell script在子进程中执行。
20、磁盘分区的实质是什么?什么是主分区、扩展分区、逻辑分区,那它与/root分区,swap分区这些有什么联系吗?(说实话,这个是真难理解啊!磁道、扇区啥的更不好描述)
答:(1)分区实质:对磁盘的格式化。分区的好处或者说原因:提高其可管理性,不同的分区有不同的作用。
(2)主分区:可以写入操作系统相关信息的分区,进行引导系统启动,相当于windows的C盘。扩展分区:扩展分区也是一个主分区,但不能直接使用,目的是容纳逻辑分区,可以说没有扩展分区就没有逻辑分区,逻辑分区的存在必须有扩展分区。用“我们的面不能吃,但是面做成了饺子或者饼就能吃”来比喻。逻辑分区:类似于windows中的D/E/F盘,几块逻辑上独立的存储介质。
(3)最多4个主分区,最多1个扩展分区,可以。即1主、1扩、多逻辑;或者2主1扩、多逻辑;再或者3主、1扩、多逻辑;如果是4主,那么不可能有逻辑分区。
(4)硬盘的容量=主分区的容量+扩展分区的容量,扩展分区的容量=各个逻辑分区的容量之和。即硬盘=主分区+各个逻辑分区。
/ 根目录 ext3 hda1
/home 用户目录 ext3 hda2
/boot 引导分区 ext4 hda3
Swap 交换分区 swap hda5 ##逻辑分区的设备名称号码由5开始,比如还有/var,/usr等
21、格式化有何目的,是先格式化还是先挂载?MBR有何作用?
答:(1)格式化的目的是写入文件系统。先格式化(mkfs命令)后挂载(mount),使用完毕后要卸载(umount)。
(2)磁道:就是磁盘上面的很多个同心圆;而每一个磁道按512个字节为单位划分的弧段叫做扇区;柱面:从立体空间来看,相同编号的磁道称为柱面;簇:相邻磁道之间的扇区的空隙之处,
(3)MBR:主引导记录,位于第0柱面、第0磁道、第1个扇区,加载BootLoader,引导系统启动。
22、简述https原理,建立通信的过程。(貌似以前整理过,也记不住)
答:(1)客户端发送一个client hello报文,携带了客户端所支持的算法和随机数,以及SSL版本号。
(2)服务端收到client hello报文后,会返回给客户端Server hello报文,该Server hello报文中携带协商好的算法,以及公钥和CA证书。
(3)客户端验证证书的合法性,并使用服务端的公钥对报文进行加密,将加密后的报文发过去。
(4)服务端使用它自己的私钥进行解密,握手阶段基本完成。
参考文档:http://hittyt.iteye.com/blog/1618497
23、说说一致性哈希算法。(这个不看视频完全不懂)
答:(1)先构造一个长度为0~2^32(2的32次幂)个的整数环(又称:一致性Hash环),根据节点名称的Hash值将缓存服务器节点防置在这个Hash环中,如上图中的node1,node2等;
(2)根据需要缓存的数据的KEY计算得到其Hash值,如上图中右半部分的“键”,计算其Hash值后离node2很近;
(3)在Hash环上顺时针查找距离这个KEY的Hash值最近的缓存服务器节点,完成KEY到服务器的Hash映射查找,如上图中离右边这个键的Hash值最近的顺时针方向的服务器节点是node2,因此这个KEY会到node2中读取数据;
当缓存服务器集群需要扩容的时候,只需要将新加入的节点名称(如node5)的Hash值放入一致性Hash环中,由于KEY总是顺时针查找距离其最近的节点,因此新加入的节点只影响整个环中的一部分。如下图中所示,添加node5后,只影响右边逆时针方向的三个Key/Value对数据,只占整个Hash环中的一小部分。
参考文档:http://www.wtoutiao.com/p/231Kcfk.html
24、http中301和302区别
答:(1)302重定向是暂时的重定向,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。302可能是URL劫持的一种表现。
(2)301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。
参考文档:http://blog.csdn.net/xlinsist/article/details/41987973
25、加密算法怎么实现,公钥私钥有什么区别,加密解密流程?(考到这些安全问题,真心不好回答,不过确实很重要)
答:(1)公钥和私钥区别:公钥即公开的密钥,大家都知道的密钥,私钥即私有的密钥,只有他自己知道。
(2)第一种加密流程:Bob将他的公开密钥传送给Alice。Alice用Bob的公开密钥加密她的消息,然后传送给Bob。Bob用他的私人密钥解密Alice的消息。
第二种加密流程:Alice用她的私人密钥对文件加密,从而对文件签名。Alice将签名的文件传送给Bob。Bob用Alice的公钥解密文件,从而验证签名。
(3)加密算法的实现:使用加密密钥对原始明文进行一系列置换或者移位操作,最后得到密文的过程。这样即使非法用户获得加密过的资料,也无法理解其真实含义。
参考文档:http://blog.sina.com.cn/s/blog_45497dfa0100y0k5.html
26、http和https有何区别?
答:(1) HTTP协议 的URL以http://开头,而HTTPS协议的URL以https:// 开头。
(2)HTTP 是不安全的,而 HTTPS 是安全的。
(3)HTTP 标准端口是80 ,而 HTTPS 的标准端口是443。
(4)在OSI 网络模型中,HTTP工作于应用层,而SSL工作在应用层和传输层之间的抽象层。
(5) HTTP 无法对传输数据进行加密,而HTTPS 对传输的数据进行加密。
(6)HTTP无需证书,而HTTPS 需要CA机构的颁发的SSL证书。
27、linux系统下如何查看CPU的总核数?(核数就是一块CPU上面能处理数据的芯片组的数量.)
答:总核数=物理CPU的个数*每颗CPU的核数
查看物理CPU的个数:cat /proc/cpuinfo|grep "physical id"
查看每颗物理CPU的核数:cat /proc/cpuinfo|grep "cpu cores"
逻辑CPU的个数=总核心数*超线程数:即cat /proc/cpuinfo|grep "processor"
查看CPU的型号:cat /proc/cpuinfo|grep name
28、假如现在有个文本,即左边是随机字母,右边是随机数字。(难,awk最TM难用了)
a 1
b 3
c 2
d 7
b 5
a 3
g 2
f 6
d 9
现要求写个脚本使其输出格式为,即将相同的字母后面的数字累加在一起,按字母的顺序输出。
a 4
b 8
c 2
d 16
f 6
g 2
答:awk ‘{a[$1]+=$2}END{for(i in a){print i,a[i]}}‘ file.txt
29、有哪些因素可能导致mysql主从不同步,如果主从不同步,报错了,怎么恢复?
答:(1)版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数据库上面不支持该功能。
(2)本身就是异步复制,网络延迟造成的
(3)主从两台机器的负载不一致,当中任何一台机器的负载很高,忙不过来,导致其中的任何一个线程出现资源不足,都将出现主从不一致的情况。
(4)主库重启导致从库数据不同步,而且主键冲突
(5)Binlog日志格式设置的不好。
解决:锁住Master表,(主库一般不能停啊,TMD注意了,别SB了),停掉slave,然后重新change master_to进行同步,最后启动slave,如果报错,就执行
命令set global sql_slave_skip_counter=1用来跳过错误进行同步。
参考文档:http://storysky.blog.51cto.com/628458/259280/
30、生产场景,一主多从环境,某一台从库宕机,现在又修好了,请问你如何恢复主从同步?如果主库宕机又修好了,那又怎么恢复主从同步过程?(没让说原理我就不哭了,这个问题必须思考)
答:从库宕机:如果只是某一台从机器宕机了,那么查询的压力就分配在其他机器上,等这台机器修复好了,在其他从库或者主库mysqldump备份,在scp远程同步过来数据,重新导入.sql文件,然后stop slave,change master to,start slave 等
主库宕机:重新提升slave1作为主控机器,其他salve从slave1中复制数据,如果原来的主库修好了,那么把他加入从库集群队列中。
参考文档:http://ucode.blog.51cto.com/10837891/1747078/