C++ 计算机网络 常考面试题总结

1. 简述 TCP 滑动窗口以及重传机制

滑动窗口机制

TCP滑动窗口是流量控制的核心机制,基于发送窗口和接收窗口实现:

  1. 核心原理:接收方通过报文首部的窗口大小字段,告知发送方自己的接收缓冲区剩余空间,发送方以此控制发送数据量,避免接收方缓冲区溢出;
  2. 窗口分类:发送窗口:分为已发送未确认、未发送但可发送、超出窗口不可发送三部分,窗口随ACK确认报文向右滑动;接收窗口:仅接收窗口内的数据,超出部分丢弃或暂存,接收后向发送方回传ACK并滑动窗口。

重传机制

TCP通过超时重传和快速重传解决数据丢失问题:

  1. 超时重传:发送方为每个报文段设置定时器,超时未收到ACK则重传该报文段,超时时间随网络状况动态调整(RTO算法);
  2. 快速重传:接收方收到失序报文段时,立即发送重复ACK(针对已收到的最后一个有序报文段),发送方收到3个重复ACK,无需等待超时,直接重传丢失的报文段。

2. 滑动窗口过小怎么办?

滑动窗口过小会导致发送方发送数据量受限,大幅降低传输效率,核心解决方式分为接收方优化和发送方优化:

  1. 接收方优化:及时清理接收缓冲区,释放空间后立即通过ACK报文更新窗口大小,避免窗口长期处于极小值;
  2. 发送方优化:启用窗口扩大因子(TCP选项),将窗口大小字段的有效范围从16位扩展到32位,支持更大的窗口尺寸;
  3. 协议层面:配合慢启动和拥塞避免算法,在网络拥塞解除后,逐步增大拥塞窗口,间接提升实际发送窗口的可用大小。

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时间,之后才完全关闭。

核心作用

  1. 保证最后的ACK报文到达服务器:主动关闭方发送的最后一个ACK可能丢失,服务器会重传FIN报文,主动关闭方在TIME_WAIT状态下可接收并重传ACK,避免服务器因未收到ACK一直处于CLOSE_WAIT状态;
  2. 避免旧连接的报文干扰新连接:网络中可能存在延迟的旧连接报文,TIME_WAIT等待2MSL(报文最大生存时间),确保旧报文完全从网络中消失,防止其被新的同端口连接接收,造成数据混乱。

5. 简述什么是 MSL,为什么客户端连接要等待 2MSL 的时间才能完全关闭?

MSL 定义

MSL(Maximum Segment Lifetime,报文最大生存时间)是TCP报文在网络中的最大存活时间,超过该时间的报文会被路由器丢弃,Linux下默认MSL为30秒。

等待 2MSL 的原因

  1. 保证双向报文均失效:主动关闭方等待1个MSL,确保自己发送的最后一个ACK报文到达服务器;再等待1个MSL,确保服务器重传的FIN报文(若ACK丢失)到达自己,同时让网络中所有旧连接的报文完全失效;
  2. 避免连接复用冲突:TIME_WAIT结束后,端口才能被重新使用,2MSL的等待时间确保新连接不会接收到旧连接的延迟报文,保证连接的可靠性。

6. 说说什么是 SYN flood,如何防止这类攻击?

SYN flood 定义

SYN flood是一种DDOS攻击,攻击者向服务器发送大量伪造的SYN报文,使服务器处于SYN_RECV半连接状态,耗尽服务器的半连接队列资源,导致合法客户端无法建立连接。

防护措施

  1. 增大半连接队列:调整内核参数(如Linux的tcp_max_syn_backlog),扩大半连接队列容量,提升抗攻击能力;
  2. 启用SYN Cookie:服务器不存储半连接信息,而是通过SYN报文的参数生成Cookie,在第三次握手时验证Cookie有效性,避免半连接队列耗尽;
  3. 限流与过滤:通过防火墙、CDN对异常IP进行限流,过滤伪造的SYN报文;
  4. 缩短半连接超时时间:减少服务器在SYN_RECV状态的停留时间,快速释放无效半连接资源。

7. 说说什么是 TCP 粘包和拆包?

核心定义

TCP是面向字节流的协议,无消息边界,粘包和拆包是数据传输中因底层机制导致的报文合并/拆分现象:

  • 粘包:发送方连续发送的多个小报文,被内核合并成一个报文发送,接收方一次性收到多个报文的数据;
  • 拆包:发送方发送的大数据报文,超过MSS(最大报文段长度)或TCP缓冲区大小,被内核拆分成多个报文发送,接收方分多次接收。

产生原因

  1. 粘包:发送方Nagle算法合并小报文、接收方接收缓冲区未及时读取数据;
  2. 拆包:报文超过MSS、发送方缓冲区不足、网络MTU限制。

解决方法

在应用层定义消息边界,如固定长度、分隔符、消息头+消息体(含长度字段)。

8. 说说 TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?

协议层级

TCP和UDP均属于传输层协议,基于网络层的IP协议提供端到端的通信服务。

核心区别

9. 说说从系统层面上,UDP 如何保证尽量可靠?

UDP本身不提供可靠性保障,需在系统层和应用层结合优化,实现“尽量可靠”:

  1. 系统层优化:增大UDP发送缓冲区和接收缓冲区,避免因缓冲区溢出导致数据丢失;启用网卡多队列、大页内存,提升UDP数据包的处理效率,减少内核态到用户态的拷贝开销;避免UDP分片,控制数据包大小不超过MTU(1500字节),防止分片丢失导致整个报文失效。
  2. 应用层适配:实现序列号和ACK确认机制,对丢失的报文进行重传;加入校验和校验数据完整性,丢弃损坏的报文;采用超时重传和滑动窗口机制,控制发送速率,避免网络拥塞。

10. 说一说 TCP 的 keepalive,以及和 HTTP 的 keepalive 的区别?

TCP keepalive

TCP keepalive是传输层的保活机制,用于检测TCP连接是否存活:

  1. 核心逻辑:连接空闲超过指定时间(默认2小时),发送方发送keepalive探测报文,接收方正常则回复ACK,异常则判断连接断开;
  2. 作用:检测对端是否异常下线(如断电、崩溃),及时释放无效连接资源。

HTTP keepalive

HTTP keepalive是应用层的长连接机制,也叫持久连接:

  1. 核心逻辑:HTTP/1.1默认启用,通过Connection: keep-alive头部,让TCP连接在多次请求-响应后保持打开,避免频繁建立/关闭TCP连接;

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论
有没有一整套的链接
点赞 回复 分享
发布于 昨天 22:18 湖北
比我之前看的面试题精简多了 里面很多之前我面试的时候面试官也问到过的 之前我看的那一大堆面试题 我看了一周都没记住 东西太多了
点赞 回复 分享
发布于 昨天 22:13 黑龙江
有点难啊
点赞 回复 分享
发布于 昨天 21:26 广东

相关推荐

昨天 15:27
已编辑
广东药科大学 后端工程师
一面: 70 分钟1.实习的专项的项目规模、成员规模2.Redis 性能 QPS 有多高?为什么要用本地缓存3.同一 APP 网关下、查询业务流量过大会否影响网关、是否做了资源隔离,带宽 / 连接数占满是否会导致网关扛不住?4.容灾怎么扩容5.介绍一下 Redis 的哈希表扩容6.假如说你来设计一个哈希表、它如果这个负载因子过高要扩容的话、你会怎么扩容?7.它为什么要进行这个渐进式?这个哈希扩容的过程、它这个有什么作用?8.Redis Zset 的使用场景和作用9.跳表的查询、插入操作的时间复杂度是多少?10.像我们经常用的这种数据结构、假如说红黑树它其实也是 Ologn、那跳表跟这个红黑树这种结构比、它也两个都是 Ologn 跳表有什么优势?11.八股:AOP、Java 的 volatile 关键字、Java 的 ThreadLocal12.如何实现统计 Web 项目过去 10 分钟每个 API 的访问次数、并在看板展示前 10/100 名 API 访问量的需求?13.如何从生产者、消息队列本身、消费者三个阶段保证消息队列不丢消息?14.手撕:二叉树的层序遍历15.是否使用过双端队列(前后可 push、pop)?如何在双端队列基础上设计支持按下标随机访问的队列?能否详细介绍环形切片的实现方式?二面:四十分钟手撕:统计公平数对的数目√/*给你一个下标从 0 开始、长度为 n 的整数数组 nums 、和两个整数 lower 和 upper 、返回 公平数对的数目 。如果 (i, j) 数对满足以下情况、则认为它是一个 公平数对 :• 0 <= i < j < n,且*/问了一些实习就没了主要是因为这家面试的一面二面的面试体验很好、面试官会引导还会问一些自己的过往经历和生活、介绍业务也很详细面试体验无敌好大家可以面一下看看
查看16道真题和解析
点赞 评论 收藏
分享
评论
5
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务