C++研发106面试题总结(四)
TCP三次握手和四次挥手及各自的状态?
三次握手:
CLOSE LISTEN
SYN_SENT
SYN_RCVD
ESTABLISHED
ESTABLISHED
四次挥手:
FIN_WAIT1
CLOSE_WAIT
FIN_WAIT2
LAST_ACK
TIME_WAIT
CLOSE
CLOSE
TCP如果两次握手会出什么问题?那三次握手又会造成什么问题?有什么好的解决方法没?
两次握手:客户端发送的连接请求可能在网络中滞留了,如果没有三次握手,可能会再次创建一个连接。
三次握手:引起SYN flood
不断发送同步报文段会因为传输控制模块TCB【处于半连接状态】从而消耗服务器资源
(1)【处理连接和半连接】定时释放监控系中无效的连接
(2)Syn cache技术【处理半连接状态】,接受到的SYN先不创建TCB,而是用一个hash表来表示,当前连接,如果接收到ACK然后再创建TCB
(3)Syn cookie技术【处理连接】通过一个cookie值来确定当前连接是否合法,合法就连接,一般的验证方法是,服务器接受到一个syn包,服务器通过syn产生一个cookie数据作为初始化序列,接收到ACK包时,序列-1就是得到的cookie,然后进行相应的验证。
TCP四次挥手为什么要有TIME_WAIT状态?为什么?
有两个原因:
(1)保证TCP协议全双工连接能够可靠关闭,直接关闭的话,如果服务器没有收到ACK,会重复发FIN。
(2)保证这次连接的重复数据从网络中消失,如果上次的socket和这次的socket处理的程序一样,就会导致这次连接把上次的数据加进来了。
死锁的原因?条件?如何预防?又如何避免?如何解除?
原因:系统资源不足;进程运行推进顺序不合适;资源分配不当
条件:互斥;不剥夺;循环等待;请求与保持
预防:破坏任意一个条件
避免:银行家算法
检测:资源分配图简化法
TCP的nagle算法和延迟ack,还有CORK呢?他们有什么好处?一起用会有什么效果?你觉得可以有什么改进?
nagle算法:防止网络中存在太多小包而造成网络拥塞
延迟ack:减少ACK包的频繁发送
CORK:将多个包变成一个包发送,提高网络利用率,使载荷率更大
不可一起使用
栈上分配内存和堆上分配内存有什么区别?
栈上:分配简单,只需要移动栈顶指针,不需要其他的处理
堆上:分配复杂,需要进行一定程度清理工作,同时是调用函数处理的。
变量的存储方式有哪些?
Auto,extern,register,static
线程私有和共享那些资源?进程私有和共享那些资源?
线程私有:线程栈,寄存器,程序寄存器
共享:堆,地址空间,全局变量,静态变量
进程私有:地址空间,堆,全局变量,栈,寄存器
共享:代码段,公共数据,进程目录,进程ID
什么是守护进程?如何查看守护进程?什么是僵尸进程?如何查看僵尸进程?
守护进程:一个生命周期长,并且控制终端,然后周期性执行某种任务的进程
查看守护进程:ps a敏感词>
僵尸进程:进程退出,但是占用资源没有被回收
查看僵尸进程:ps -ef|grep defunct
进程同步机制?
信号量;管程;
什么是信号?
进程间通信机制中唯一的异步通信机制
kill函数的每一个参数的作用?
Pid>0:发给ID为pid的进程
Pid=0:发给进程组所有的进程
Pid=-1:发给所有的进程
Pid<-1:发给指定进程组的进程
什么是协程?
用户态的轻量级线程,有自己的寄存器和栈
虚拟内存实现有哪几种方式?有什么意义?
三种:请求分页存储管理;请求分段存储管理;请求段页式存储管理
什么是类型安全?能举例吗?
两个类型直接进行转换,必须是显式的,string和STL模板是类型安全的
确保线程安全的几种方式?
(1)原子操作(2)同步与锁(3)可重入(4)阻止过度优化volatile
OSI七层模型?
应用层;表示层;会话层;传输层;网络层;数据链路层;物理层;
TCP/IP五层模型?
应用层;传输层;网络层【路由器】;数据链路层【交换机、网桥、网卡】;物理层【中继器、集线器】;
DHCP协议是什么?使用什么端口?他的优劣?
DHCP协议:动态主机配置协议
客户端端口:68;服务端端口:67
说说DHCP协议执行的过程?
DHCP discover广播-》
《-DHCP offer广播
DHCP request-》
《-DHCP ack
在0.5T和0.875T会尝试新的租用,服务器不同意则返回nack否则是ack;
如果发生IP冲突则返回DHCP decline。
网络序是大端还是小端?为什么要这样?
大端,历史遗留问题
ping命令使用的是什么协议?
ICMP协议
路由表一般包含什么?
(1)网络地址(2)网络掩码(3)网关【下一跳服务器】(4)跃点数【距离】
停止等待协议的缺点?为什么?
信道利用率太低,每次都需要等上一次ACK包接收到了才能再次发送
拥塞控制的方式?具体怎么做的?快重传的时机是什么?
(1)慢开始(2)拥塞避免(3)快重传【收到3个失序分组确认】(4)快恢复
DNS协议如何实现将域名解析为IP地址的?
(1)客户机的应用程序调用解析程序将域名已UDP数据报的形式发给本地DNS服务器
(2)本地DNS服务器找到对应IP以UDP形式放松回来
(3)弱本地DNS服务器找不到,则需要将域名发送到根域名服务器,根域名服务器返回下一个要访问的域名服务器,则访问下一个域名服务器。