一、专业基础
1.网络
1.1 理解TCP/IP协议
TCP/IP是一个协议族,TCP/IP协议族按照层次分为链路层、网络层、传输层、应用层四个层次。
应用层:最上面的就是应用层了,这里面有http,ftp等等我们熟悉的协议。负责直接和应用程序接口并提供常见的网络应用服务。
传输层:著名的TCP和UDP协议就在这个层次。提供应用程序间的通信。
网络层:用来处理网络上流动的数据包。
链路层:用来处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动和网络适配器,及光纤等物理可见的部分。
1.2 网络传输模型
网络传输的参考模型有两种,一种是OSI(Open System InetConnection)参考模型,其有七层,另一种是TCP/IP参考模型,被减压成四层。
OSI模型在当下以基本被TCP/IP模型所取代。OSI模型包含:物理层、链路层、网络层、传输层、会话层、表示层、应用层。
1.3 滑动窗口技术
TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。
滑动窗口协议,流量控制、拥塞控制。
1.4 建立连接的三次握手与断开连接的四次握手,连接建立与断开过程中的各种状态
建立连接的三次握手
1.客户端发送报文 SYN标识位置为1,随机生成seq=j。此时进入SYN_SENT状态。
2.服务端接收到报文 将SYN和ACK标识位置为1,ack=j+1,seq=k,发送报文。此时进入SYN_RCVD状态。
3.客户端收到报文 将ACK标识置为1,ack=k+1,发送报文。服务端收到报文后双方连接成功,进入ESTABLISHED状态。
断开连接的四次握手
1.客户端发送报文,FIN标识位置为1,seq=u,进入FIN-WAIT-1状态。
2.服务端收到报文后,将ACK标识位置为1,ack=u+1,seq=v,发送报文。
3.服务端再次发送报文,将FIN和ACK标识位置为1,ack=u+1,seq=w,发送报文,这就是比握手多一步的原因服务端也需要自己发送FIN报文。
4.客户端收到后,将ACK标识位置为1,ack=w+1,seq=u+1,断开连接。
1.5 TCP/IP协议的传输效率
1.6 请解释DOS攻击与DRDOS攻击的基本原理
DOS:中文名称是拒绝服务,一切能引起DOS行为的攻击都被称为DOS攻击。该攻击的效果是使得计算机或网络无法提供正常的服务。常见的DOS攻击有针对计算机网络带宽和连通性的攻击。 DOS是单机于单机之间的攻击。
DOS攻击的原理:首先攻击者向被攻击的服务器发送大量的虚假IP请求,被攻击者在收到请求后返回确认信息,等待攻击者进行确认,(此处需要拥有HTTP协议工作方式和TCP三次握手的基本知识)该过程需要TCP的三次握手,由于攻击者发送的请求信息是虚假的,所以服务器接收不到返回的确认信息,在一段时间内服务器会处与等待状态,而分配给这次请求的资源却被有被释放。当被攻击者等待一定的时间后,会因连接超时而断开,这时攻击者在次发送新的虚假信息请求,这样最终服务器资源被耗尽,直到瘫痪。
DDOS:中文名称是分布式拒绝服务攻击。指的是攻击者控制多台主机同时向同一主机或网络发起DOS攻击。
DRDoS:分布反射式拒绝服务攻击这是DDoS攻击的变形,它与DDoS的不同之处就是DrDoS不需要在攻击之前占领大量的“肉鸡”。
防御方法:
1。确保服务器的系统文件是最新的版本,并及时更新系统补丁。
2。关闭不必要的服务。
3。限制同时打开的SYN半连接数目。
4。缩短SYN半连接的time out 时间。
5。正确设置防火墙
禁止对主机的非开放服务的访问
限制特定IP地址的访问
启用防火墙的防DDoS的属性
严格限制对外开放的服务器的向外访问
运行端口映射程序祸端口扫描程序,要认真检查特权端口和非特权端口。
6。认真检查网络设备和主机/服务器系统的日志。只要日志出现漏洞或是时间变更,那这台机器就可 能遭到了攻击。
7。限制在防火墙外与网络文件共享。这样会给黑客截取系统文件的机会,主机的信息暴露给黑客, 无疑是给了对方入侵的机会。
8。路由器
1.7 一个100Byte数据包,精简到50Byte, 其传输效率提高了50%
数据的传输效率:发送的应用层数据除以所发送的总数据(即应用层数据加上各种首部和尾部的额外开销),是对方发送数据流量的控制,使其发送效率不致超过接受方所能承受的能力。它并不是数据链路层特有的功能,许多高层协议也提供流量控制功能。
传输过程:
应用层数据 -> 传输层(20字节的TCP头部)-> 网络层(20字节IP头部)-> 数据链路层(18字节的以太网传送头部和尾部)
答:
100/(100+20+20+18)=100/158=63.3%
50/(50+20+20+18)=1000/1058=94.5%
故头信息占用的比重增大,传输效率降低
1.8 TIMEWAIT状态怎么解释?
TIME_WAIT状态之所以存在,是为了保证网络的可靠性
有以下原因:
1.为实现TCP全双工连接的可靠释放
当服务器先关闭连接,如果不在一定时间内维护一个这样的TIME_WAIT状态,那么当被动关闭的一方的FIN到达时,服务器的TCP传输层会用RST包响应对方,这样被对方认为是有错误发生,事实上这只是正常的关闭连接工程,并没有异常
2.为使过期的数据包在网络因过期而消失
在这条连接上,客户端发送了数据给服务器,但是在服务器没有收到数据的时候服务器就断开了连接
现在数据到了,服务器无法识别这是新连接还是上一条连接要传输的数据,一个处理不当就会导致诡异的情况发生
下面讲讲大量的TIME_WAIT产生需要的条件:
1.高并发
2.服务器主动关闭连接
如果服务器不主动关闭连接,那么TIME_WAIT就是客户端的事情了
1.9 掌握常用的网络通信模型
1>Select
多路复用I/O可以提高服务器的性能。
2>Epoll,边缘触发与平台出发点区别与应用
epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。
3>Select与Epoll的区别及应用
先讲讲同步I/O的五大模型
阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型
而select/poll/epoll属于I/O复用模型
poll与select的不足点
1. 每次调用都需要做一次从用户空间到内核空间的拷贝
2. 每次poll都需要对所有设备做至少做一次加入和删除等待队列操作,这些都是低效的原因
epoll的优点
1.支持一个进程打开大数目的socket描述符(FD)
2.IO效率不随FD数目增加而线性下降
3.使用共享内存加速内核与用户空间的消息传递。
1.10 socket理解
2.存储
2.1 计算机系统存储体系
2.2 程序运行时的内存结构
2.3 计算机文件系统,页表结构
2.4 内存池与对象池的实现原理,应用场景与区别
2.5 关系数据库MySQL的使用
2.6 共享内存
2.7 栈和堆内存
栈:是一种连续储存的数据结构,具有先进后出的性质。通常的操作有入栈(圧栈)、出栈和栈顶元素。想要读取栈中的某个元素,就要将其之前的所有元素出栈才能完成。类比现实中的箱子一样。
堆:是一种非连续的树形储存数据结构,每个节点有一个值,整棵树是经过排序的。特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。常用来实现优先队列,存取随意。
程序的内存分配
栈区(stack)有编译器自动分配释放,存放函数的参数,局部变量等.
堆区(heap)一般由程序员分配和释放,否则就由OS回收。堆用于存放全局变量,静态变量,常量字符串和函数代码(函数体的二进制代码).
申请后系统的响应
栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:在记录空闲内存地址的链表中寻找一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统会在这块内存空间的首地址出记录本次分配空间的大小,这样代码中的delete 才能正确释放本内存空间。系统会将多余的那部分重新空闲链表中。
申请大小的限制
栈:在windows中,栈是向低地址扩展的数据结构,是一块连续的内存区域。也就是栈顶的地址和栈的最大容量(windows是2M)是系统规定好的。如果申请的空间超过剩余栈空间,将提示overflow,因此从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于系统中有效的虚拟内存。由此可见堆的内存获得比较灵活,空间较大。
栈和堆的存储内容
栈:在栈中,第一个进栈的是主函数下一条指令的地址,然后是函数的各个参数,在大多数编译器中,参数是由右往左入栈,然后是函数中的局部变量。注意,静态变量不入栈。出栈则刚好顺序相反。
堆:一般在堆的头部用一个字节存放堆的大小,具体内容由程序员安排。
3.程序
3.1 对C/C++语言有较深的理解
3.2 深刻理解接口,封装与多态,并且有实践经验
1>封装
即隐藏对象的属性和实现细节,仅对外公开接口。例如,我们将类的属性定义为private,只提供给用户使用属性的public方法。
作用:(1)更安全的访问 (2)提供统一的访问接口
2> 继承
继承就是子类继承父类的特征和行为。
作用:代码复用,有利于程序扩展,最重要的是能够实现多态。
3> 多态
接口的多种不同的实现方式即为多态。简单来说,即一个对象具有不同的形态。
4> 接口和抽象类的区别
(1)接口没有构造方法,而抽象类有构造方法
(2)接口可以多继承,而抽象类只能单继承
(3)接口中的方法都是抽象的,而抽象类中的部分方法是可以在抽象类中是实现的。
(4)子类实现了接口,那么子类必须实现接口中提供的所有方法。而抽象类中的方法,可以在抽象类中默认实现,也可以在子类中继续定义为抽象方法。
3.3 深刻理解常用的数据结构:数组,链表,二叉树,哈希表
数组:查找快,插入删除麻烦,用于已知的数据量;
链表:查找慢,插入删除方便,用于较少的不可预知的数据量;
哈希表:大数据量,利用散列函数结合数组和链表的优势。
二叉树:同上。
数组的搜索比较方便,可以直接用下标,但删除或者插入某些元素就比较麻烦。
链表与之相反,删除和插入元素很快,但查找很慢。
二叉排序树就既有链表的好处,也有数组的好处。
在处理大批量的动态的数据是比较有用。
前序:根左右
中序:左根右
后续:左右根
3.4 熟悉常用的算法及相关复杂度:冒泡排序,快速排序
1>冒泡排序
冒泡排序的基本思想:每次比较两个相邻的元素,如果它们的顺序错误就把他们交换过来。
冒泡排序的核心部分是双重嵌套循环,冒泡排序的时间复杂度是O(N2),这个一个非常高的时间复杂度。
//冒泡排序核心部分10
for (i = 0; i < MAX - 1; i++) //n个数排序只需要n-1趟
{
for (j = 0;j < MAX - i; j++) //每一趟比较到n-i结束
{
if (a[j] < a[j + 1])//降序排列
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t
}
}
}
2>快速排序
快速排序是基于二分的思想,对冒泡排序的一种改进。
快速排序在最坏的情况下,仍可能是相邻的两个数进行交换,因此快速排序最差时间复杂度和冒泡排序是一样的,都是O(N2),它的平均时间复杂度为O(NlogN)。
3.5 面向对象,面向过程
概念:
面向对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。三个重要特征是封装、继承、多态。
区别:
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
优缺点:
面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低
3.6 并发:
计算机术语中的"并发",指的是在单个系统里同时执行多个独立的活动,而不是顺序的一个接一个的执行。对于单核CPU来说,在某个时刻只可能处理一个任务,但它却不是完全执行完一个任务再执行一个下一任务,而是一直在任务间切换,每个任务完成一点就去执行下一个任务,看起来就像任务在并行发生,虽然不是严格的同时执行多个任务,但是我们仍然称之为并发(concurrency)。真正的并发是在在多核CPU上,能够真正的同时执行多个任务,称为硬件并发(hardware concurrency)。
3.7 多线程编程
4.其他
4.1 boost库
4.2 docker