C++ 计算机网络 常考面试题总结
1. 简述 TCP 滑动窗口以及重传机制
滑动窗口机制
TCP滑动窗口是流量控制的核心机制,基于发送窗口和接收窗口实现:
- 核心原理:接收方通过报文首部的窗口大小字段,告知发送方自己的接收缓冲区剩余空间,发送方以此控制发送数据量,避免接收方缓冲区溢出;
- 窗口分类:发送窗口:分为已发送未确认、未发送但可发送、超出窗口不可发送三部分,窗口随ACK确认报文向右滑动;接收窗口:仅接收窗口内的数据,超出部分丢弃或暂存,接收后向发送方回传ACK并滑动窗口。
重传机制
TCP通过超时重传和快速重传解决数据丢失问题:
- 超时重传:发送方为每个报文段设置定时器,超时未收到ACK则重传该报文段,超时时间随网络状况动态调整(RTO算法);
- 快速重传:接收方收到失序报文段时,立即发送重复ACK(针对已收到的最后一个有序报文段),发送方收到3个重复ACK,无需等待超时,直接重传丢失的报文段。
2. 滑动窗口过小怎么办?
滑动窗口过小会导致发送方发送数据量受限,大幅降低传输效率,核心解决方式分为接收方优化和发送方优化:
- 接收方优化:及时清理接收缓冲区,释放空间后立即通过ACK报文更新窗口大小,避免窗口长期处于极小值;
- 发送方优化:启用窗口扩大因子(TCP选项),将窗口大小字段的有效范围从16位扩展到32位,支持更大的窗口尺寸;
- 协议层面:配合慢启动和拥塞避免算法,在网络拥塞解除后,逐步增大拥塞窗口,间接提升实际发送窗口的可用大小。
3. 三次握手时每次握手信息没收到,分情况介绍
TCP三次握手的核心是建立可靠连接,每次握手报文丢失的处理逻辑不同,核心如下:
第一次握手(客户端发SYN)丢失
- 现象:服务器未收到SYN,不会响应;客户端未收到ACK,触发超时重传;
- 处理:客户端按超时时间重传SYN报文,重传次数达到上限则建立连接失败,终止流程。
第二次握手(服务器发SYN+ACK)丢失
- 现象:客户端未收到SYN+ACK,超时重传SYN;服务器未收到客户端的ACK,认为连接未建立,超时后释放半连接资源;
- 处理:客户端重传SYN,服务器收到后重新发送SYN+ACK;若多次重传仍无响应,双方均终止连接建立。
第三次握手(客户端发ACK)丢失
- 现象:服务器未收到ACK,处于SYN_RECV半连接状态,超时后重传SYN+ACK;客户端已进入ESTABLISHED状态,认为连接已建立;
- 处理:服务器重传SYN+ACK,客户端收到后再次发送ACK;若服务器重传次数耗尽,释放半连接;此时若客户端向服务器发数据,服务器会因未建立连接发送RST报文,客户端终止连接。
4. 简述 TCP 的 TIME_WAIT,为什么需要有这个状态?
TIME_WAIT 状态定义
TIME_WAIT是TCP连接关闭的主动关闭方(通常是客户端)进入的状态,处于该状态的连接会持续2MSL时间,之后才完全关闭。
核心作用
- 保证最后的ACK报文到达服务器:主动关闭方发送的最后一个ACK可能丢失,服务器会重传FIN报文,主动关闭方在TIME_WAIT状态下可接收并重传ACK,避免服务器因未收到ACK一直处于CLOSE_WAIT状态;
- 避免旧连接的报文干扰新连接:网络中可能存在延迟的旧连接报文,TIME_WAIT等待2MSL(报文最大生存时间),确保旧报文完全从网络中消失,防止其被新的同端口连接接收,造成数据混乱。
5. 简述什么是 MSL,为什么客户端连接要等待 2MSL 的时间才能完全关闭?
MSL 定义
MSL(Maximum Segment Lifetime,报文最大生存时间)是TCP报文在网络中的最大存活时间,超过该时间的报文会被路由器丢弃,Linux下默认MSL为30秒。
等待 2MSL 的原因
- 保证双向报文均失效:主动关闭方等待1个MSL,确保自己发送的最后一个ACK报文到达服务器;再等待1个MSL,确保服务器重传的FIN报文(若ACK丢失)到达自己,同时让网络中所有旧连接的报文完全失效;
- 避免连接复用冲突:TIME_WAIT结束后,端口才能被重新使用,2MSL的等待时间确保新连接不会接收到旧连接的延迟报文,保证连接的可靠性。
6. 说说什么是 SYN flood,如何防止这类攻击?
SYN flood 定义
SYN flood是一种DDOS攻击,攻击者向服务器发送大量伪造的SYN报文,使服务器处于SYN_RECV半连接状态,耗尽服务器的半连接队列资源,导致合法客户端无法建立连接。
防护措施
- 增大半连接队列:调整内核参数(如Linux的tcp_max_syn_backlog),扩大半连接队列容量,提升抗攻击能力;
- 启用SYN Cookie:服务器不存储半连接信息,而是通过SYN报文的参数生成Cookie,在第三次握手时验证Cookie有效性,避免半连接队列耗尽;
- 限流与过滤:通过防火墙、CDN对异常IP进行限流,过滤伪造的SYN报文;
- 缩短半连接超时时间:减少服务器在SYN_RECV状态的停留时间,快速释放无效半连接资源。
7. 说说什么是 TCP 粘包和拆包?
核心定义
TCP是面向字节流的协议,无消息边界,粘包和拆包是数据传输中因底层机制导致的报文合并/拆分现象:
- 粘包:发送方连续发送的多个小报文,被内核合并成一个报文发送,接收方一次性收到多个报文的数据;
- 拆包:发送方发送的大数据报文,超过MSS(最大报文段长度)或TCP缓冲区大小,被内核拆分成多个报文发送,接收方分多次接收。
产生原因
- 粘包:发送方Nagle算法合并小报文、接收方接收缓冲区未及时读取数据;
- 拆包:报文超过MSS、发送方缓冲区不足、网络MTU限制。
解决方法
在应用层定义消息边界,如固定长度、分隔符、消息头+消息体(含长度字段)。
8. 说说 TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?
协议层级
TCP和UDP均属于传输层协议,基于网络层的IP协议提供端到端的通信服务。
核心区别
9. 说说从系统层面上,UDP 如何保证尽量可靠?
UDP本身不提供可靠性保障,需在系统层和应用层结合优化,实现“尽量可靠”:
- 系统层优化:增大UDP发送缓冲区和接收缓冲区,避免因缓冲区溢出导致数据丢失;启用网卡多队列、大页内存,提升UDP数据包的处理效率,减少内核态到用户态的拷贝开销;避免UDP分片,控制数据包大小不超过MTU(1500字节),防止分片丢失导致整个报文失效。
- 应用层适配:实现序列号和ACK确认机制,对丢失的报文进行重传;加入校验和校验数据完整性,丢弃损坏的报文;采用超时重传和滑动窗口机制,控制发送速率,避免网络拥塞。
10. 说一说 TCP 的 keepalive,以及和 HTTP 的 keepalive 的区别?
TCP keepalive
TCP keepalive是传输层的保活机制,用于检测TCP连接是否存活:
- 核心逻辑:连接空闲超过指定时间(默认2小时),发送方发送keepalive探测报文,接收方正常则回复ACK,异常则判断连接断开;
- 作用:检测对端是否异常下线(如断电、崩溃),及时释放无效连接资源。
HTTP keepalive
HTTP keepalive是应用层的长连接机制,也叫持久连接:
- 核心逻辑:HTTP/1.1默认启用,通过Connection: keep-alive头部,让TCP连接在多次请求-响应后保持打开,避免频繁建立/关闭TCP连接;
- 作
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

查看16道真题和解析
字节跳动公司福利 1374人发布