15号接到阿里通知,18号上午去面试,研究生期间第一次面试,颇为激动,准备了一番,18号去了大望路那里。前台签到后,在大厅等了一会,面试官拿着我的简历叫我跟他走,到了一个会议室,里面人很多,面试官的花名叫易统,阿里每个人都有花名,武侠风浓烈,马云的花名叫风清扬。。。易统说欢迎来面试,让我自我介绍,期间点开了我的blog- -

后来主要是围绕简历上写得项目的技能,做了一些提问,主要是我在说,面试官如果感兴趣会深入问下去。时间在一个小时左右,易统十分友好,没有什么压力,问的问题待会详细记录。最后易统说今天的面试就到这里,让我回去了,我想完蛋了,因为之前得知如果面的好会直接二面的,看来是面挂了,而我自我感觉还不错,后来细想想,可能某些问题回答的不够深入,要反思了。问题总结如下:

tcp/ip三次握手

这个基本是滥问题了,答得还不错
####tcp有哪些机制保证了他的可靠性
这个答得不够好,这里总结下:

可靠性包括以下几个方面:

1.能够处理数据传输过程中被破坏问题。

2.能够处理重复数据接收问题。

3.能够发现数据丢失以及对此进行有效解决。

4.能够处理接收端数据乱序到达问题。

怎么保证解决上述问题?

TCP协议规范和当前绝大多数TCP 协议实现代码均采用数据重传和数据确认应答机制来完成TCP 协议的可靠性数据传输。数据超时重传和数据应答机制的基本前提是对每个传输的字节进行编号,即我们通常所说的序列号。数据超时重传是发送端在某个数据包发送出去,在一段固定时间后如果没有收到对该数据包的确认应答,则(假定该数据包在传输过程中丢失)重新发送该数据包。而数据确认应答是指接收端在成功接收到一个有效数据包后,发送一个确认应答数据包给发送端主机,该确认应答数据包中所包含的应答序列号即指已接收到的数据中最后一个字节的序列号加1,加1 的目的在于指出此时接收端期望接收的下一个数据包中第一个字节的序列号。数据超时重传、数据确认应答以及对每个传输的字节分配序列号是TCP 协议提供可靠性数据传输的核心本质。

1.解决数据传输中被破坏的问题

首先通过对所接收数据包的CRC校验,确认该数据包中数据是否存在错误。如果有,则简单丢弃或者发送一个应答数据包重新对这些数据进行请求。发送端在等待一段时间后,则会重新发送这些数据。本质上,数据传输错误的解决是通过数据重传机制完成的。

2.解决重复数据接收问题
接到数据包之后,查看序列号,如果数据包已经接收过,则丢弃该数据包,返回确认信息,主要是通过序列号解决这个问题

3.解决数据丢失问题
主要依靠tcp的重传机制来解决。TCP通过在发送数据报文时设置一个超时定时器来解决这种问题,如果在定时器溢出时还没有收到来自对端对发送报文的确认,它就重传该数据报文。

4.解决乱序问题
如果通信双方存在多条传输路径, 则有可能出现数据乱序问题,即序列号较大的数据先于序列号较小的数据到达,而发送端确实是按序列号由小到大的顺序发送的。数据乱序的本质是数据都成功到达了,但到达的顺序不尽如人意。对于收到的乱序报文并不丢弃,而是缓存下来(这样做是为了减少更多的重传),立即发送希望接受的报文确认。对这个问题的解决相对比较简单,只需对这些数据进行重新排序即可。本质上,对数据乱序问题的解决是通过排序数据序列号完成的。

syn flood 攻击

由于是安全专业的,面试官又问了我这个问题,答得一般,总结如下:

什么是synflood?

在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源—-数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃—即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。

怎么检测Syn flood?

1、服务端无法提供正常的TCP服务。连接请求被拒绝或超时;

2、通过 netstat -an 命令检查系统,发现有大量的SYN_RECV连接状态。

如何防范?

1.缩短SYN- Timeout时间

2.设置每秒最多3个syn封包进入

查看Linux CPU使用率命令

top

查看进程信息

ps -aux

vim从100到200行替换字符串

:100,200s/vivian/sky/g

总结:简历上写的尽量往深处了解,面试官可能追问具体的机制,例如我用到的几个工具,fluentd,mongodb,我只是简单的使用,不清楚里面的实现机制,往往不能令面试官满意。面试失败的还有一个原因是简历上写的一定是自己非常了解的,不是很懂的还是不要往上写了,或者写了赶紧去补功课,路漫漫其修远兮,找工作是一个虐心的过程,相信经过不断的积攒经验,一定能够拿到满意的offer,下一站:创新工场23号面试,加油!



blog comments powered by Disqus