emm,前一个部门挂了,被腾讯金融科技部门捞了,原本期待一波的,结果面完,无感了。
这个部门应该主要是c/c++的,上来问我对语言建议吗,我说都行,感觉这个面试官可能对java不熟悉,导致没怎么问java问题,很多问题都牵涉到底层c代码了,人直接麻了!
1.自我介绍三分钟
2.hashmap的实现?hashcode怎么算的?为什么一开始不用红黑树?
看到三连问,我直接人无了,问我hashcode怎么去实现的有没有看过,意思就是有没有看过c代码吧,说没具体去了解过。
3.快速排序说一下?时间复杂度。
balabala说来一下,这个问题还行,就说了一下实现思路。
4.topk问题如何解决?快排怎么解决?
我一开始说的我一般用堆排序,然后面试官说那用快排呢?
5.http状态码 502 403分别代表什么意思
6.http1.1和http2.0的区别
7.http2.0的压缩算法知道哪些,如果让你设计你会怎么设计?
8.syn攻击知道吗?syn攻击如何解决?
SYN 攻击
我们都知道 TCP 连接建⽴是需要三次握⼿,假设攻击者短时间伪造不同 IP 地址的 SYN 报⽂,服务端每接收到
⼀个 SYN 报⽂,就进⼊ SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报⽂,⽆法得到未知 IP 主机的
ACK 应答,久⽽久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常⽤户服务。
避免 SYN 攻击⽅式⼀
其中⼀种解决⽅式是通过修改 Linux 内核参数,控制队列⼤⼩和当队列满时应做什么处理。
当⽹卡接收数据包的速度⼤于内核处理的速度时,会有⼀个队列保存这些数据包。控制该队列的最⼤值如下
参数:
net.core.netdev_max_backlog
SYN_RCVD 状态连接的最⼤个数:
net.ipv4.tcp_max_syn_backlog
超出处理能时,对新的 SYN 直接回报 RST,丢弃连接:
net.ipv4.tcp_abort_on_overflow
避免 SYN 攻击⽅式⼆
正常流程:
当服务端接收到客户端的 SYN 报⽂时,会将其加⼊到内核的「 SYN 队列」;
接着发送 SYN + ACK 给客户端,等待客户端回应 ACK 报⽂;
服务端接收到 ACK 报⽂后,从「 SYN 队列」移除放⼊到「 Accept 队列」;
应⽤通过调⽤ accpet() socket 接⼝,从「 Accept 队列」取出连接。应⽤程序过慢:
如果应⽤程序过慢时,就会导致「 Accept 队列」被占满。
受到 SYN 攻击:
如果不断受到 SYN 攻击,就会导致「 SYN 队列」被占满。
tcp_syncookies 的⽅式可以应对 SYN 攻击的⽅法:
net.ipv4.tcp_syncookies = 1当 「 SYN 队列」满之后,后续服务器收到 SYN 包,不进⼊「 SYN 队列」;
计算出⼀个 cookie 值,再以 SYN + ACK 中的「序列号」返回客户端,
服务端接收到客户端的应答报⽂时,服务器会检查这个 ACK 包的合法性。如果合法,直接放⼊到「 Accept
队列」。
最后应⽤通过调⽤ accpet() socket 接⼝,从「 Accept 队列」取出的连接。
9.time_waith过多如何解决?
主动发起断开连接的一方,如果出现大量的time_wait状态的一个解决方案就是把修改net.ipv4.tcp_max_tw_buckets 调小。这样当出现大量的time_wait状态的时候如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。同时,大量的time_wait占用着tcp端口,所以在设置了tcp端口范围后,net.ipv4.tcp_max_tw_buckets参数要比端口范围小些。
10.说一下操作系统内部的内存(代码块,程序块这些)
直接人傻了,完全不记得了!
11.那你说一下java中的吧?那你们怎么控制堆大小的,堆的最大值多少?
emm,自己没设置过,这个难道不是要结合实际业务场景吗?
12.问项目,数据过多会涉及到分库分表,该如何解决?
13.字符串反转?
我说可以根据空格分割,然后使用stringbuilder,面试官貌似不清楚这个类吧,写完后,还让我试一下有多个空格,他可能不清楚split已经都优化完了吧。 总结:可能是岗位匹配度不高,整体体验一般,可能kpi吧。
全部评论
(3) 回帖