一、计算机基础
1.讲一下OSI七层协议
OSI是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互联成为网络的标准框架,划分为七层,分别为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
应用层
应用层位于第七层,作用是通过应用程序间的交互来完成特定的网络应用。
表示层
作用是使通信的应用程序能够解释交换数据的含义,该层提供的服务主要包括数据压缩,数据加密以及数据描述。
会话层
负责建立、管理和终止表示层实体之间的通信会话,该层提供了数据交换的定界和同步功能,包括了检查点和恢复方案的方法。
传输层
主要是为两台主机进程之间的通信提供服务。
网络层
主要作用是选择合适的网间路由和交换结点,确保数据按时成功传送。
数据链路层
在两个相邻节点之间传送数据是,数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。
物理层
作用是实现计算机节点之间比特流的透明传送。
2.讲一下TCP/IP参考模型
包括应用层、传输层、网际互连层、网络访问层
应用层
将osi中会话层、表示层、应用层的功能合并到一个应用层实现。
传输层
为上层实体提供源端到对端主机的通信功能,传输层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP)。其中面向连接的TCP协议保证了数据的传输可靠性,面向无连接的UDP协议能够实现数据表简单、快速地传输。
网际互联层
对应osi的网络层,主要负责相同或不同网络计算机之间的通信。
网络接入层
对应osi数据链路层和物理层,负责监视数据在主机和网络之间的交换。
3.讲一下HTTPS和HTTP的区别(属于应用层)
1.HTTP协议以明文方式发送内容,数据未加密,安全性较差;而HTTPS数据传输过程是加密的。 2.HTTP和HTTPS使用的连接方式不一样,用的端口也不一样,HTTP使用80端口,HTTPS使用443端口。 3.HTTPS协议需要到数字机构申请证书,要钱。 4.HTTP页面响应比HTTPS快,主要HTTP使用三次握手建立连接,而HTTPS除了三次握手,还需要经历一个SSL协商过程。
4.URI和URL的区别(应用层)
URL(统一资源定位符),就是平时上网输入的网址,它标识了一个互联网资源,并指定对其进行操作或获取该资源的方法; URI(统一资源标识符)是一种抽象概念,URL是URI的子集 简而言之就是,只要能唯一标识资源的就是URI,在URI基础上给出其资源的访问方式的就是URL。
5.讲一下三次握手(传输层)
三次握手是TCP连接的建立过程,在握手之前,主动打开连接的客户端结束CLOSE阶段,被动打开的服务器也结束CLOSE阶段,并进入LISTEN阶段,随后进入三次握手阶段:
- 首先客户端向服务器发送一个SYN包,等待服务器确认,其中:
·标志位为SYN,表示请求建立连接; ·序号为Seq = x ·随后客服端进入SYN-SENT阶段 - 服务器接受到客服端发来的SYN包后,对该包进行确认后结束LISTEN阶段,并返回一段TCP报文,其中:
·标志位为SYN和ACK,表示确认客户端的报文Seq序号有效,服务器能够正常接收客户端的数据,并同意创建新连接; ·序号为Seq = y; ·确认号为Ack = x + 1,表示收到客户端的序号Seq并将其值加1,作为自己的确认号Ack的值,随后服务器进入SYN-RECV阶段 - 客户端接收到发送的SYN+ACK包后,明确了从客户端到服务器的数据传输是正常的,从而结束SYN-SENT阶段,并返回最后一段报文,其中:
·标志位为ACK,表示确认收到服务器端同意连接的信号; ·序号为Seq = x + 1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值; ·确认号为Ack = y + 1,表示收到服务器端序号seq,并将其值加1作为自己的确认号Ack 的值; ·随后客户端进入ESTABLISHED - 当服务器收到来自客户端的报文后,得知从服务器到客户端的数据传输是正常的,从而结束SYN-RECV阶段,进入ESTABLISHED阶段,完成三次握手。
6.讲一下四次挥手(传输层)
四次挥手即TCP连接的释放,假设客户端主动释放连接,在挥手之前主动释放连接的客户端结束 ESTABLISHED 阶段,随后开始四次挥手:
-
首先客户端向服务器发送一段 TCP 报文表明其想要释放 TCP 连接,其中: ·标记位为 FIN,表示请求释放连接; ·序号为 Seq = u; ·随后客户端进入 FIN-WAIT-1 阶段(半关闭阶段),并且停止向服务端发送通信数据。 -
服务器接收到客户端请求断开连接的 FIN 报文后,结束 ESTABLISHED 阶段,进入 CLOSE-WAIT 阶段并返回一段 TCP 报文,其中: ·标记位为 ACK,表示接收到客户端释放连接的请求; ·序号为 Seq = v; ·确认号为 Ack = u + 1,表示是在收到客户端报文的基础上,将其序号值加 1 作为本段报文确认号 Ack 的值; ·随后服务器开始准备释放服务器端到客户端方向上的连接。 -
客户端收到服务器发送过来的 TCP 报文后,确认服务器已经收到了客户端连接释放的请求,随后客户端结束 FIN-WAIT-1 阶段,进入 FIN-WAIT-2 阶段。 -
服务器端在发出 ACK 确认报文后,服务器端会将遗留的待传数据传送给客户端,待传输完成后即经过 CLOSE-WAIT 阶段,便做好了释放服务器端到客户端的连接准备,再次向客户端发出一段 TCP 报文,其中: ·标记位为 FIN 和 ACK,表示已经准备好释放连接了; ·序号为 Seq = w; ·确认号 Ack = u + 1,表示是在收到客户端报文的基础上,将其序号 Seq 的值加 1 作为本段报文确认号 Ack 的值。 ·随后服务器端结束 CLOSE-WAIT 阶段,进入 LAST-ACK 阶段。并且停止向客户端发送数据。 -
客户端收到从服务器发来的 TCP 报文,确认了服务器已经做好释放连接的准备,于是结束 FIN-WAIT-2 阶段,进入 TIME-WAIT 阶段,并向服务器发送一段报文,其中: ·标记位为 ACK,表示接收到服务器准备好释放连接的信号; ·序号为 Seq= u + 1,表示是在已收到服务器报文的基础上,将其确认号 Ack 值作为本段序号的值; ·确认号为 Ack= w + 1,表示是在收到了服务器报文的基础上,将其序号 Seq 的值作为本段报文确认号的值。 ·随后客户端开始在 TIME-WAIT 阶段等待 2 MSL。 -
服务器端收到从客户端发出的 TCP 报文之后结束 LAST-ACK 阶段,进入 CLOSED 阶段。由此正式确认关闭服务器端到客户端方向上的连接。客户端等待完 2 MSL 之后,结束 TIME-WAIT 阶段,进入 CLOSED 阶段,由此完成「四次挥手」。
7.TCP是如何保证可靠的
- 数据分块
- 序列号和确认应答
- 校验和
- 流量控制
- 拥塞协议
- ARQ协议
- 超时重传
二、操作系统
1.讲一下进程和线程的区别
进程
进程是程序的一次执行过程,如果把计算机看成一个火车站,进程就是里面的一个火车。
线程
线程是进程的一部分,是CPU调度和分派的基本单位,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。就是说线程相当于车厢里面的工作人员和每一节车厢。
区别
- 每个程序都有独立的代码和数据空间,程序之间的切换会有比较大开销;线程相当于轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己的独立运行栈和程序计数器,线程之间切换的开销小。
- 如果一个进程里面有多个线程,则是有多个线程之间共同完成的。
- 同一进程的线程共享本进程的地址空间和资源,进程之间的地址空间和资源相互独立。
- 每个进程都有程序的出入口,但是线程不能独立执行。
2.讲一下死锁
如果一组进程中的每个进程都在等待一个事件,而这个事件只能由该组的另一个进程触发,这种情况会导致死锁。可以理解为:死锁就是两个线程同时占用两个资源,但又在彼此等待对方释放锁。
三、C++基础
1.C++堆和栈的区别
- 申请方式:栈是系统自动分配,堆是程序员主动申请
- 栈是内存中连续的一块空间,向低地址扩展,最大容量是系统预定好的,堆在内存中的空间,向高地址扩展,是不连续的。
- 申请效率:栈申请效率高,但是程序员无法控制,堆效率低。
- 存放内容:栈中存放局部变量,函数的参数;堆中存放的内容由程序员控制。
|