一轮笔试+三个技术官的一面+技术总监的一面,麻了麻了
笔试题+面试题
1.在公司局域网使用ping命令时,使用到的协议是(D)
A.ARP B.DNS C.TCP D.ICMP
答案是D这个不难,然后面试的时候每个协议都需要解释一遍
2.解释一下第一题当中的各个协议
ARP全称是(Address Resolution Protocol)是一种地址解析协议,目的是实现IP地址到MAC地址的转换;
DNS是域名系统,是域名和IP地址相互映射的一个分布式数据库;
TCP(Transmission Control Protocol)是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议;
ICMP(Internet Control Message Protocol)是控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。
3.谈谈洪泛攻击
SYN洪泛攻击主要是利用三次握手的缺陷,发送完第一次握手的数据后,然后就"消失"了,那么服务器就会不断的发送第二次握手的数据,可是攻击的人找不到了。于是,服务器的资源大量被消耗,直到死机为止。
4.谈谈DDos攻击
DDoS攻击是一种分布式拒绝服务攻击,这个的攻击借助于客户/服务器技术,将多个计算机联合起来作为一个攻击平台,对一个或者是多个目标发动攻击,从而成倍的提高就裁决服务攻击的威力。
5.如果需要对磁盘上1000W条记录构建索引,你认为下面哪种数据结构来存储索引最合适?(C)
A.Hash Table B.AVL-Tree C.B-Tree D.List
这题选C也是毋庸置疑,不过多解释了
6.为什么Mongodb索引用B树,而Mysql用B+树?
B树跟B+树的区别主要在于树的每个节点存不存储数据,B树的节点是存储数据的,而B+树的节点是不存储数据的,只有叶子节点才会存储数据,Mongobd选择B树而不是B+树主要是从设计的角度考虑,它并不是传统的关系型数据库,而是以JSON格式作为存储的NoSQL,且数据量往往不会像MySQL那么高,Mongodb选择B树也就是代表每个节点都有Data域,这样做的好处就是只要找到指定的索引就可以找到数据了,单次查询的平均快于MySQL。
7.表达式(11+3*8)/4%5(E)
A.31 B.0 C.1 D.2 E.3 D.8
8.一个栈的入栈序列是A、B、C、D、E,则栈的不可能的序列是(C、D)
A.ADCBE B.DECBA C.DCEAB D.CEBAD E.ABEDC
9.有两个线程,最初n=0,一个线程执行n++;n++;另一个执行n+=2;最后可能的n值?(A、B、C、D)
A.1 B.2 C.3 D.4 E.5
这题本身有点毛病,选了四个之后面试官反问我为啥选四个,最后的解释也是把这题掰回来我的答案没问题,面试官自己程序出题不严谨。
10.关于http状态码描述错误的是(B)
A.301为永久重定向,可以被浏览器缓存
B.302该状态码表示请求的资源已被分配了,以后应使用资源现在所指的URI
C.500表示服务器在执行请求时发生了错误,也有可能是Web应用存在Bug或者某些临时的故障
D.200表示从客户端发来的请求在服务器被正常处理了
这道题选B主要是后面这个以后应使用有点玩文字游戏,302是临时重定向
11.你对二进制安全的认识
二进制安全指的传输数据,保证二进制数据的信息安全,也就是不被篡改、破译等等,如果被攻击,能够及时检测出来。
检测二进制是否正确的有:CRC
能够纠错的有:海明校验码
加密二进制的算法:AES、DES
12.谈谈你对CDN的认识
CDN (Content Delivery Network):中文名是 内容分发网络
CDN是一个经策略性部署的整体系统,主要包含四个部分:分布式存储、负载均衡、网络请求和内容管理
用户用浏览器访问一个域名(例如 www.waibizi.com),然后浏览器就会调用域名解析函数库,来解析域名,在没有部署 CDN 的情况下,域名解析出来的是 域名对应的 IP 地址,但是部署 CDN ,会对域名解析过程做出一些改动,域名解析出来的不是对应的 IP 地址,而是对应的 CNAME(可以理解为对域名设置的一个别名),然后浏览器通过全局负载均衡DNS解析CNAME,按地理位置解析离用户最近的代理服务器IP,得到代理服务器的IP后,发起请求,代理服务器接收到请求后,会判断客户的请求,本地是否有缓存,如果有,直接抛给客户端,如果没有,根据本地DNS,解析出客户要访问的域名所对应的后端服务器IP,并发起请求;后端服务器将数据抛给代理服务器,代理服务器将数据保存于本地,再抛给用户。
13.数据库(设计范式、MongoDB/MySQL、Redis)
MySQL:MySQL是一个关系型数据库,设计范式主要有第一范式、第二范式、第三范式、反三范式;
第一范式:符合1NF的关系中的每个属性都不可再分
第二范式:每个属性都要完全依赖于主键
第三范式:第三范式就是属性不依赖于其它非主属性。 也就是说, 如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求
反三范式:反三范式简而言之就是需要冗余字段,为了提高程序的查询效率,减少表的关联查询
MongoDB是一个文档类型数据库,存储的数据格式是JSON,MongoDB可以将模式设计划分为内嵌模式(Embedded)和 引用模式(References)
内嵌模式
简单来讲,内嵌模式就是将关联数据,放在一个文档中。
引用模式
引用模式是将数据存储在不同集合的文档中,而通过关系数据进行关联。(类似关系数据库的方式关联数据)
Redis是一个分布式的内存数据库,主要的数据结构有:String 字符串、Hash (哈希)、List、Set、ZSet(有序)
Redis使用的时候需要注意:缓存雪崩、缓存穿透、缓存击穿
缓存雪崩:大量的缓存数据在同一个时间过期
解决方案:设置随机的过期时间
缓存穿透:缓存跟数据库都没有的数据,用户不断发起请求,导致大量请求都穿透到DB当中。
解决方案:使用布隆过滤器
缓存击穿:在某个时间,有个缓存数据库有数据,但是缓存刚好过期了,此时恰好有大量的请求进来,全部击穿了缓存层到了数据库当中
解决方案:使用互斥锁或者热点数据永不过期
14.API设计(Restful)
EST并不是什么新鲜的技术,而是在HTTP在的一种规范,首先HTTP的操作主要有GET、POST、DELETE、PUT;
我们对于后端的操作最最最最常见的,也就是这四个,GET是获取数据的操作,POST是提交数据的,DELETE是删除资源的,PUT是对于资源的更新操作;
我们回想一下:前端与后端的交互当中,不就是通过URL与参数的交互与响应,URL含义是“统一资源定位符”,全称是Uniform Resource Locator,我们重新读一遍这几个字“统一资源定位符”,也就是对于URL来说,只需要关心这个链接是一个资源,而操作应该是停留在HTTP的操作当中:
GET : URL 获取这个资源
DELETE : URL 删除这个资源
POST : URL 对这个资源进行数据的提交
PUT : URL 更新资源
如上的语义就可以很清晰地表达你所要表达的意思了,而不应该在你的URL当中添加对于操作的动词,我见过太多太多的例子是直接getPeople(当然我之前也是这么干的)。对于同一个资源的操作,换了N多的URL。
下面简单举几个简单的示范案例
GET https://www.waibizi.com/apple/list 获取苹果列表
GET https://www.waibizi.com/apple/1 获取编号是1的苹果
PUT https://www.waibizi.com/apple/1 对于编号是1的苹果进行数据的更新
POST https://www.waibizi.com/apple 新增一个苹果
POST https://www.waibizi.com/apple/list 新增几个苹果(当然你的数据应该放在body当中)
DELETE https://www.waibizi.com/apple/list 删除几个苹果
15.谈谈对ETag、Last-Modified、If-Modified-Since、Cache-Control的认识
Etag是 Entity tag的缩写,可以理解为“被请求变量的实体值”,Etag是服务端的一个资源的标识,在 HTTP 响应头中将其传送到客户端。所谓的服务端资源可以是一个Web页面,也可以是JSON或XML等。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。比如,浏览器第一次请求一个资源的时候,服务端给予返回,并且返回了ETag: "50b1c1d4f775c61:df3" 这样的字样给浏览器,当浏览器再次请求这个资源的时候,浏览器会将If-None-Match: W/"50b1c1d4f775c61:df3" 传输给服务端,服务端拿到该ETAG,对比资源是否发生变化,如果资源未发生改变,则返回304HTTP状态码,不返回具体的资源。
Last-Modified:在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是客户端请求的资源,同时有一个Last-Modified的属性标记此文件在服务器端最后被修改的时间;如果服务器端的资源没有变化,则自动返回 HTTP 304(Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。
If-Modified-Since是标准的HTTP请求头标签,在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端接到之后,就直接把本地缓存文件显示到浏览器中。如果时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。
Cache-Control 是一个 HTTP 协议中关于缓存的响应头,它由一些能够允许你定义一个响应资源应该何时、如何被缓存以及缓存多长时间的指令组成。当浏览器保存了资源的副本从而达到快速访问的目的的时候也就是 HTTP 发生了缓存。
其他的题忘了一些了,想起来再继续补补吧