9.15 面试问题总结(一面挂)

1.你为什么要来我们公司?

我认可贵公司的平台实力,看重技术岗位的发展空间。我有 C++ 和 Linux 相关开发实践,项目经历和岗位需求匹配,希望在这里发挥软件开发能力,持续学习成长,长期稳定深耕。

2.你在项目开发中会用到ai吗?

在项目开发中,我会把 AI 作为辅助工具,核心业务代码和底层逻辑都是自己独立编写、调试和理解的。我主要使用 AI 来写一些 Shell 测试脚本、查询语法、排查 bug 思路,用来提升开发效率。像高并发服务器、Qt 上位机的核心逻辑、数据接收与缓冲区处理这些关键模块,从需求设计到代码实现都是我亲手完成,每一行核心代码我都理解原理,并且在 Gitee 上提交了完整代码。我会对 AI 生成的内容仔细审核、修改验证,不会直接复制粘贴使用。

3.目前有拿到offer吗?

暂时没有正式 offer,现阶段在参加秋招面试。贵司岗位和我的技术背景契合,是我很看重的机会。

4.你的学校在成都为什么没有考虑在成都发展

我在成都就读,也投递过成都的岗位。杭州的技术生态成熟,有不少 Linux、网络开发方向岗位,和我 C++ 开发的技术栈匹配,我希望在这个领域持续成长,所以选择来杭州寻找机会。

5.为什么不打算考研

我认真思考过考研,结合自身情况最终决定直接就业。我个人更偏向工程实践,自学 C++、Linux 计算机相关知识,独立完成了高并发服务器、Qt 上位机这些项目,在动手写代码、调试的过程中收获更大。 我的目标是从事 C++ 开发方向,现阶段希望尽快进入行业,在真实业务场景里积累工程经验。后续如果工作中有需要,我再针对性去补充学习。

6.你是宁夏人,为什么考虑来杭州,之后会不会回老家?

未来五年的职业规划是在杭州积累技术经验,深耕 C++ 开发;长期会结合个人发展再规划,现阶段专注在岗位上做好开发工作。

7.为什么不考六级?

之前我把主要精力投入 C++、Linux 等技术学习和项目开发,没有报考六级。不过我具备基础英文阅读能力,可以看懂英文开发文档、开源代码注释,能够满足岗位开发需求。

8.你的专业主要上什么课?

本专业课程以环境工程、化学相关内容为主。我基于职业规划自学计算机核心知识,包括 C/C++、数据结构、操作系统、计算机网络,并落地到项目实践。跨专业学习锻炼了我的自学和问题排查能力。

9.你们是有专门开设linux的相关课程吗

学校本专业没有开设 Linux 相关课程。是我确定想做 C++ 开发之后,自主学习的。我系统学习了 Linux 命令、进程线程、IPC 通信、Socket 网络编程,并且在我的高并发服务器、Qt 上位机项目里,全部在 Linux 环境下开发调试,实操练习。遇到问题查阅文档、使用 gdb 调试,把 Linux 相关知识落地到项目中。

10.你了解我们公司吗?

潮流网络 Grandstream 是全球统一通信方案厂商,杭州是核心研发中心,主打 VoIP、音视频、网关、企业网络设备。主要使用 C++ 和 Linux 做通信软件开发,和我 C++、网络编程的项目背景契合,我希望在这里深耕网络通信方向。

11.说一说你参加的杭州其他公司一般都在招聘什么

杭州这边大量招聘 C++、Linux 开发岗位,分为互联网后端、音视频通信、嵌入式和工业上位机几类。不少岗位偏向业务开发,潮流网络聚焦通信设备底层网络开发,和我的 UDP 高并发项目经验契合,是我优先选择的方向。

12.说一说你为什么想参加这个行业的工作?

我对网络设备底层开发感兴趣,交换机作为网络核心转发设备,正是我想深耕的方向。我自学 C/C++、Linux,做过 UDP 高并发报文处理项目,熟悉 TCP/IP 协议。这个岗位在 Linux 下做交换机功能开发,和我的技术背景匹配,希望在这里持续积累网络设备开发经验。

13.你在做心理委员的生涯中有哪些收获

担任心理委员,锻炼了我的沟通倾听能力与责任心。我需要耐心倾听同学诉求,做好情绪疏导和信息同步。这让我在团队协作中,能够更好地和同事沟通需求、交流问题,适配开发岗位的团队合作要求。

14.你是独生子女吗

不是,家里有兄弟姐妹,家庭方面不会影响我在杭州的工作。

15.你更倾向于哪个部门的工作

我更倾向交换机开发部门,我的技术栈和项目经历和交换机开发的工作比较契合。同时我也服从公司岗位调配,交给我的任务我都会认真完成。

16.期望薪资?

结合岗位 JD、杭州同类型应届生 C++ 开发行情,我的期望薪资是12k 左右。当然薪资方面可以沟通,我更看重这个交换机开发岗位,希望能在网络设备方向长期成长。

17.面试问到比较基础的问题但是忘记了怎么回复(模板)

这个知识点我之前学过,短时间内没办法完整复述,我记得它主要是做 XXX。面试结束后我会立刻重新复习这块内容。

18.面试问到比较难的问题不会怎么回复(模板)

这个问题我目前没有深入学习过,暂时答不上。如果工作里遇到这类问题,我会先查阅内核文档 / 相关技术手册,写小 demo 验证,动手调试把原理搞明白。后续我会主动学习这块知识。

19.多态有哪几种?

20.什么是timewait?

21.什么是会话?

在 Linux 系统里,会话是进程的一种分组管理单元,一个会话里可以包含多个进程组,最开始由第一个创建会话的进程做会话首进程;我们打开一个终端窗口,这个终端本身就是一个独立会话,你在终端里敲命令运行的程序、启动的服务进程,默认都归属于这个终端会话,一旦关闭终端,会话销毁,里面所有进程都会被系统杀掉。

22.会话和守护进程的关系是什么?

守护进程想要不被终端关闭杀死,关键就是脱离原来的终端会话:创建守护进程时,会主动新建一个独立会话,让自己成为新会话的首进程,脱离原先绑定的终端会话、脱离终端进程组,既不占用终端窗口,也不受终端关闭、会话退出的影响,从此脱离前台终端束缚,永久后台运行;简单说:脱离旧会话、自建新会话,是进程变成守护进程的核心步骤,会话机制就是 Linux 用来帮守护进程脱离终端、实现后台常驻的底层基础。

23.什么是守护进程?

守护进程就是脱离终端、后台静默运行的服务进程,像服务器、日志进程都是它,它不需要依赖终端输入输出,就算关掉终端也不会退出,一直后台跑。

24. 什么是序列化与反序列化?

序列化:内存中的结构体 / 对象,转为可以网络传输、落地保存的数据格式。 反序列化:收到的数据流,还原成程序内存里的结构体。

25.列举常见序列化格式,对比优缺点(核心必考)

26.JSON 和 Protobuf 怎么选?什么时候用哪个

SON:配置文件、Web 接口,需要人直接查看、调试的场景

Protobuf:服务器之间高性能网络通信,大量数据传输,追求小包、低 CPU 开销(交换机 / 网络设备通信很爱考这个

它们都是数据序列化的 "通用语言",让不同程序 / 不同语言之间能看懂、传输和解析数据,只是 XML 和 JSON 是文本格式,Protobuf 是二进制格式,适用场景不同。

27.为什么Tcp是全双工?

因为TCP连接两端,两端分别都有各自的发送缓冲区和接收缓冲区,可以同时接收数据和发送数据,所以认为Tcp是全双工的。

28.TCP 面向字节流是什么意思?会带来什么问题?

TCP不保留应用层的消息边界,把数据当作一连串的字节流进行输出,带来的问题就是粘包,多个多个数据包在缓冲区合并在一起,应用层无法区分原始消息边界,需要我们在应用层自己做分包处理(加长度头 / 分隔符)。

29.TCP的write/send 的时候,是直接把数据发给对端吗?

不是。调用write/send只是把用户态 buffer 的数据拷贝到内核 TCP 发送缓冲区,系统调用返回不代表数据已经发到对方主机。什么时候真正发出去,由操作系统内核 TCP 协议栈控制。这也是为什么TCP叫做传输控制协议的原因。

30.read/recv 的过程,如果接收缓冲区为空会发生什么?

调用 read,本质是把内核接收缓冲区的数据拷贝到用户提供的 buffer 。 如果内核接收缓冲区没有数据,默认会阻塞等待,直到收到数据才返回。

31.TCP 缓冲区是什么结构?TCP 靠什么做流量控制?

TCP 收发缓冲区内核用链表管理。 流量控制:依靠对端的接收缓冲区剩余容量(滑动窗口),发送方根据接收方的窗口大小,控制发送速率,避免发送太快把对方缓冲区打爆

32.全双工和半双工的区别

全双工:双方可以同时收发(TCP); 半双工:同一时间只能一方发,另一方收,不能同时双向传输。

33.粘包怎么解决?

一般在应用层解决,①在报文头部加数据长度 ②设置特殊分割符 ③固定长度报文

34.TCP 的滑动窗口和流量控制是什么关系?

滑动窗口机制用来实现流量控制,窗口大小就是接收缓冲区剩余容量,告诉发送方最多还能发多少字节。

35.简单介绍一下 TCP 协议(最直接原题)

TCP 全称传输控制协议,是传输层可靠协议。特点是面向连接、面向字节流、可靠传输。通信前三次握手建立连接;传输过程依靠确认应答、超时重传、流量控制、拥塞控制,保证有序无差错,丢包会重传、重复报文会去重;通信结束用四次挥手断开连接。适合文件传输、网页这类对数据完整性要求高的场景。

36.TCP 流量控制 和 拥塞控制有什么区别(超级高频)

流量控制 :控制发送方不要把接收方缓冲区打爆,解决收发双方能力不匹配,依靠滑动窗口(接收方告知剩余缓冲区大小)。

拥塞控制 :控制不要把中间网络链路打爆,解决网络拥堵,维护拥塞窗口。

37.什么是面向连接?

通信双方必须先建立连接(三次握手),之后才能传输数据;通信结束正常断开(四次挥手)。UDP 是无连接,不用提前建立。

38.为什么 TCP 需要四次挥手,不是三次?

因为 TCP 是全双工,两个方向独立关闭。一方关闭写通道,另一方还可以继续发数据;等双方都不再发送数据,连接才完全释放。

39.UDP和TCP的区别是什么?

TCP:面向连接、可靠、字节流、有重传 / 流量 / 拥塞控制;开销大。 UDP:无连接、不可靠、数据报;开销小,适合音视频、实时报文传输。

40.什么场景适合 TCP?什么场景用 UDP?

TCP:文件传输、网页、数据库访问,要求数据不能丢。 UDP:视频通话、游戏、实时网络报文,允许少量丢包,优先保证低延迟。

41.TCP报文结构

42.确认应答发的究竟是什么?

发送方发送的是报头+有效载荷,而接收端发送的确认应答则是一裸的TCP报头,并非我们想的只有一个1或者0,这很重要;

43.如果网络很好,还需要拥塞控制吗?

需要。网络状态随时变化,拥塞控制是为了防止发送方发包太多,导致路由器缓存占满、网络大面积丢包,引发网络风暴。

44.4位首部长度的作用是什么?

4 位首部长度,又叫数据偏移,单位是 4 字节。用来标识 TCP 头部的总长度。TCP 头部最小 20 字节,最大 60 字节。接收端通过这个字段跳过 TCP 头部,找到后面携带的数据。

45.TCP 头部为什么不是固定长度?

因为支持可选字段,比如时间戳、MSS 等选项,所以头部变长,需要这个字段标记头部结束位置。

46.32 位序号(Sequence Number)作用

序号对 TCP 每个字节编号,用于接收端完成报文排序,同时识别重复报文,实现去重。

47.32 位确认序号(Ack Number)作用

确认序号代表接收方期望收到的下一字节编号,用来告诉发送方,这个编号之前的数据已经全部接收完毕。

48.为什么同时需要序号和确认序号两个字段?

TCP 是全双工通信,两端可以同时收发数据。

①序号 :标记我方发给对方的数据字节编号;

②确认序号 :标记对方发给我 的数据,我确认收到到哪了。 两个方向的数据独立。同时还有捎带应答机制:接收方在回复业务数据的时候,把 ACK 确认信息 "捎带" 放在同一个报文头部,不用单独发一个纯 ACK 包,减少报文数量,提升传输效率。所以头部必须同时携带序号和确认序号。

49.什么是捎带应答(捎带 ACK,本页重点)

当接收方需要回复业务数据给发送方时,TCP 会把确认 ACK 信息,合并到要发送的业务报文头部一起传回,不再单独发送一个只用来确认的 ACK 报文。 好处:减少网络报文数量,降低开销,提升传输效率。

50.TCP 头部 16 位窗口字段是什么?(基础题)

16 位窗口大小,代表接收端接收缓冲区剩余容量 。接收方在 ACK 报文中把这个值发给发送方,用来做流量控制。发送方不能发送超过窗口大小的数据,防止把对方接收缓冲区打满、造成丢包。 16bit 最多只能表示 65535 字节。如果需要更大窗口,可以在 TCP 选项中启用窗口扩大因子 M,实际窗口 = 窗口字段的值 << M。

51.什么是 TCP 流量控制?流量控制是不是单纯降低发送速度?(红框重点!高频)

流量控制目的:控制发送方速率,不要超过接收方的接收能力,避免接收缓冲区溢出 。 流量控制≠一味减少发送。窗口大的时候,说明对方缓冲区空闲多,可以提高发送量;窗口变小才降低发送量。是动态匹配接收方能力,不是无脑降速。

52.建立连接初期,发送方怎么知道对方接收窗口大小?

三次握手阶段协商窗口信息。SYN 报文里就携带自身的初始窗口大小、窗口扩大因子等选项。握手完成后,双方就知道对方初始接收能力。后续每次 ACK 报文持续更新窗口。

53.如果接收方窗口变成 0 会发生什么?

接收方返回窗口 = 0,告诉发送方:接收缓冲区满了,请停止发数据。 发送方会停止发送,同时启动零窗口探测 定时器,定期发探测报文(不携带数据的一个裸的报头就叫做窗口探测),查询窗口有没有恢复,避免死锁。

54.流量控制窗口 rwnd 和拥塞窗口 cwnd,哪个由接收方提供,哪个是发送方自己维护?

rwnd(接收窗口)是接收方在 ACK 报文中带给发送方;cwnd 拥塞窗口,是发送端自己估算、维护的

55.什么时候会触发拥塞窗口减小?

检测到超时重传,或者收到重复 ACK,认为网络发生拥塞,就缩小拥塞窗口。

56.什么是超时重传?

发送方发送 TCP 报文后,操作系统会为这个报文设置超时计时器。 如果在超时时间内,没有收到对应的 ACK 确认应答,发送方就认为报文丢失,会重新发送这份数据,这个机制就是超时重传。 丢包分两种情况:①业务数据报文丢了;②数据到了对方,但是 ACK 应答报文在路上丢了。发送方无法区分这两种情况,超时了都会重传。接收端依靠序号,自动处理重复报文,完成去重。

57.超时时间为什么不能固定?太长、太短会有什么问题

超时设置过长:丢包之后,要等很久才重传,降低整体传输效率。

超时设置过短:网络稍微延迟波动,就误判丢包,触发不必要的重复发包,浪费带宽。 所以 TCP动态计算超时时间,根据网络往返时间 RTT 实时调整,不是固定值。

58.Linux 超时重传等待时间规则(考点)

以 500ms 为基础单位,指数退避

①第一次超时没收到 ACK:等待 2 × 500ms 后重传

②再次超时:等待 4 ×500ms,以此类推,等待时间指数增长

③重传次数到达上限,TCP 判定网络 / 对端故障,强制关闭连接。

指数退避含义:每次重传失败,翻倍延长等待时间,避免持续大量发包冲击已经拥堵的网络

59.超时重传和快速重传的区别

  • 超时重传:等待计时器到期才重传,被动触发,等待时间长。
  • 快速重传:收到 3 个重复 ACK,不等超时定时器到期,立刻重传,更快恢复。

60.请介绍 TCP 的 6 个标志位分别是什么,作用?

61.简述三次握手过程(必问)

①客户端发送SYN 报文 ,请求建立连接,客户端状态变为 SYN_SENT

②服务端收到,回复SYN+ACK 报文 :SYN 代表服务端也同意建立连接;ACK 确认客户端的 SYN。服务端状态变为 SYN_RCVD

③客户端收到 SYN+ACK,回复ACK 报文 。双方状态都变成ESTABLISHED,连接建立完成。

原理:第二次报文把 SYN 和 ACK 合并在一个包,这个就叫捎带应答,所以原本四次交互合并成三次握手。

62.为什么是三次握手,不是两次?

核心要验证双方收发能力都正常 。 两次握手只能证明:客户端能发、服务端能收。但是服务端无法确认,服务端发给客户端的报文,客户端能不能收到。 三次握手可以验证:客户端、服务端收发双向通路都正常

63.connect、accept 和三次握手的关系(很爱问)

①connect:客户端系统调用,触发内核发送 SYN,内核完成握手,握手成功 connect 函数才返回;connect 本身不参与握手报文组装,只是触发。

②listen:提前准备,内核维护半连接队列、全连接队列。

③accept:不参与三次握手。三次握手全部由内核完成;accept 只是从内核全连接队列取出已经握手成功的连接,返回新的套接字。

64.最后一次 ACK 丢了会怎么样?

客户端认为连接建立成功;服务端没收到 ACK,停留在SYN_RCVD,不会进入 ESTABLISHED。超时之后服务端会重传 SYN+ACK,多次失败就丢弃连接。

65.什么是半连接队列什么是全连接队列

服务端调用 listen 之后,内核维护两个队列:

①半连接队列(SYN 队列):保存收到 SYN 报文、进入 SYN_RCVD 状态,握手还没完成的连接。当收到客户端 SYN,放入这个队列,并回复 SYN+ACK。

②全连接队列:三次握手成功,连接状态变为 ESTABLISHED,连接就迁移到全连接队列。accept 就是从全连接队列拿连接。 当全连接队列满的时候,新握手完成的连接无法入队,会丢弃或者直接回复 RST,导致客户端连接失败。

66.如果全连接队列满了会发生什么?

Linux 默认情况下,新完成握手的连接无法放进队列,直接丢弃;客户端可能出现 connect 超时失败。

67.SYN 攻击是什么?

攻击者大量发送 SYN 报文,但是不回复最后一次 ACK。大量连接卡在半连接队列,把半连接队列打满。正常用户发 SYN 直接被丢弃,无法建立连接,实现拒绝服务。

68.为什么挥手是四次,握手能合并成三次?

握手阶段:SYN(建连请求)和 ACK(确认)可以捎带,合并成一个包。

挥手阶段:收到 FIN 之后,服务端可能还有业务数据没发完,不能立刻发送 FIN。ACK 和 FIN 不能打包在一起,所以必须分成两个报文,总共四次。

特殊场景:服务端没有剩余数据,ACK+FIN 可以合并,四次挥手简化成三次,但是属于特例。

69.TIME_WAIT 是什么?为什么需要等待 2MSL?

① 保证最后这个 ACK 报文能到达服务端。如果 ACK 丢包,服务端会重发 FIN,客户端还能再次回复 ACK。

② 等待网络中残留的旧报文全部消失,防止旧连接的延迟报文,被新建立的连接接收,造成脏数据。

70.如果服务端收到客户端 FIN 之后,一直不调用 close 会发生什么?

服务端停留在CLOSE_WAIT状态,对应的文件描述符不会释放。文件描述符资源泄漏,持续占用内核内存;文件描述符耗尽之后,accept会失败,新客户端无法接入服务。

71.TCP的三种丢包场景

①最左侧丢包,确认序号只有1,表示没有收到1-1001的内容;

②中间丢包,确认序号1001,表示只收到了1-1001的内容,后面的都需要重传

③最右侧丢包,和最左侧丢包的逻辑一样

72.什么是快重传

当报文段丢失之后,接收方收到后续正常报文,会持续回复同一个重复的确认 ACK 。 发送方连续收到 3 个重复 ACK ,不等超时计时器到期,立刻重传丢失的报文段,这个机制就叫快重传。 特点:不用等超时时间,更快恢复丢包,提升传输效率。

73.快重传和超时重传的区别

  • 超时重传:等待超时计时器到期才重传,被动等待,等待时间长。
  • 快重传:收到 3 个重复 ACK 就主动重传,不用等超时,丢包恢复更快。

74.为什么是 3 个重复 ACK,不是 2 个?

防止网络中 ACK 报文乱序(单纯网络延迟乱序,不是丢包)造成误触发重传。 如果只是网络乱序,一般只会产生 1~2 个重复 ACK;连续 3 个重复 ACK,大概率是报文真的丢了。

75.什么是延迟应答机制?

接收方收到数据,不马上回 ACK,短暂等待,尽量合并多个确认,减少 ACK 小包,节省网络资源;还支持捎带应答。不能无限延迟,有超时上限,防止发送方超时重传。

76.HTTP 是什么?在哪一层?HTTP 是有状态还是无状态?

HTTP 基于 TCP:HTTP 是应用层协议,本身不负责网络传输,依靠 TCP 完成可靠的数据收发,TCP 负责连接、重传、拥塞控制。

应用层协议,基于 TCP;无状态,服务器不保存上一次请求信息,靠 Cookie/Session/JWT 来维持会话。

无状态:服务器默认不会记住客户端历史请求。每一条 HTTP 请求都是独立的,服务器无法区分两次请求是不是同一个用户,不会保存上一次请求的用户信息。

Cookie 保存在浏览器客户端。登录成功后服务器下发 Cookie,后续浏览器每次请求自动带上 Cookie。Cookie 里面通常存放 sessionId。

Session 保存在服务端,根据 Cookie 携带的 sessionId,找到保存在服务器上的用户会话信息,从而识别同一个用户,维持登录状态。

77.GET 和 POST 的区别(超级高频)

  • GET:参数放在 URL,有长度限制,一般用于查询,幂等,可缓存
  • POST:数据放请求体,适合提交、上传,不幂等

78.http状态码

  • 200 成功,201 创建成功,204 无返回内容
  • 301 永久重定向(会缓存);302 临时重定向;304 协商缓存命中
  • 400 请求错误、401 未认证、403 禁止访问、404 找不到资源、405 方法不允许
  • 500 服务器内部错误,502 网关错误,503 服务不可用

79.HTTP 和 HTTPS 区别?HTTPS 握手流程

HTTP 明文,80 端口;HTTPS=HTTP+TLS,443 端口,加密、身份认证、防篡改,需要 CA 证书,握手有 RTT 开销

80.put post get三者的区别

什么是幂等?多次发起同一个请求,对服务器产生的业务效果和只执行一次完全一样,不会产生额外副作用,就是幂等。

81.PUT 和 POST 都能新增资源,怎么区分?

核心看资源位置是谁决定。PUT 是客户端知道资源唯一 id,直接操作这个地址;POST 是客户端不知道 id,提交给集合,由服务器生成 id。

82.Cookie 是服务器自动下发的吗?

是的,通过 Set-Cookie 响应头下发。

Cookie 里面的 sessionId 丢失,下次请求不带编号,服务器找不到 Session,需要重新登录。

84.UDP协议的样子

84.UDP 头部 和 TCP 头部的核心区别

①UDP首部固定 8 字节;TCP 头部是 20~60 字节,可变长,有选项字段。

②UDP:无序号、无确认 ACK 字段,不保证可靠、不做重传;TCP 有序号、确认应答,保证可靠传输。

③UDP 只有长度字段;TCP 没有长度字段,靠 IP 头部的总长度减去头部算出数据长度。

④UDP 校验和是可选(部分系统可关闭);TCP 校验和强制启用。

⑤UDP 没有窗口、紧急指针、标志位(SYN/ACK/FIN 等);TCP 全部都有。

85.什么叫做udp的无连接?

⽆连接: 知道对端的IP和端⼝号就直接进⾏传输, 不需要建⽴连接;

86.UDP 有没有发送缓冲区?接收缓冲区呢?(必考)

UDP没有真正的发送缓冲区 ,调用sendto直接交给内核,内核往下传给网络层。 UDP有接收缓冲区 ,用来缓存收到的 UDP 数据包;但是不保证包顺序和发送端一致;缓冲区满了之后新来的包直接丢弃。

87.CP 发送缓冲区和 UDP 的区别?

TCP 有发送缓冲区,没收到 ACK 前数据会留在缓冲区等待重传。UDP 不需要重传,所以不需要发送缓冲区。

88.UDP socket 是全双工吗?

是全双工,同一个 UDP socket,既能收数据,也能发数据,读写可以同时进行。

89.UDP 接收缓冲区的特点(高频)

①报文是一个个独立的数据包,不会像 TCP 字节流那样粘包;

②不保证顺序,先发的包可能后到;

③缓冲区满,新来 UDP 包直接丢包,不会阻塞发送方。

90.基于 UDP 的应用层协议(背诵)

DNS、DHCP、TFTP、NFS、BOOTP。

面试经常问:DNS 为什么选用 UDP? DNS 请求报文很小,UDP 开销小、不需要建立连接,速度快;如果返回报文太长,会走 TCP。

91.UDP 是面向数据报,TCP 面向字节流,结合缓冲区怎么理解?

UDP 一次 recvfrom,读取一个完整的 UDP 报文,不会读到半个包;TCP 是字节流,没有边界,会出现粘包拆包。

92.如果问我有没有用过 wireshark 在什么场景用的,我该怎么回答,

我用过 Wireshark 做网络抓包分析,主要是在开发频谱上位机项目的时候使用。 项目里 FPGA 通过 UDP 向上位机持续发送 IQ 原始采样数据包。遇到丢包、乱序的问题时,我用 Wireshark 抓包:

①查看 UDP 报文,检查自定义包头里的序列号、时间戳是否正常;

②观察报文到达情况,定位是 FPGA 发送侧、网络链路,还是上位机接收缓冲区满导致的丢包;

③校验数据包长度,排查数据截断、报文解析异常的问题。

Linux 环境下我也了解 tcpdump,是命令行抓包工具,适合服务器环境抓包;Wireshark 带图形界面,方便直观查看每一层协议的详细信息,调试阶段排查问题更方便。

93.不同进程的 fd 是独立的吗?

是的。fd 只在当前进程内部有效。同一个数字,在 A 进程是 socket,在 B 进程可能是普通文件。父子进程 fork 之后,子进程会拷贝父进程的文件描述符表。

94.fd 和 FILE*(fopen 返回的)区别?*

fd 是内核层面的整数(系统调用 open 返回);FILE 是 C 库的用户态文件指针,里面封装了 fd,自带用户态缓冲区。fileno()可以从 FILE * 拿到 fd。

95.什么叫做IO多路复用?

如果一个连接开一个线程,大量连接会带来巨大内存和上下文切换开销;如果单线程非阻塞轮询,会持续占用 CPU。 IO 多路复用让单个线程阻塞在内核,同时监听多个 fd。没有事件(读、写、异常事件)时线程休眠不占 CPU;只要任意 fd 就绪,内核唤醒线程处理,用少量线程管理大量连接,提升并发能力。

96.什么是select?

97.select的特点是什么?

fd_set 是传入传出参数 内核会修改这个位图:清除没有就绪的 fd,只保留就绪 fd 。 所以每一轮 select 循环之前,必须 FD_ZERO 清空 + FD_SET 重新添加所有 fd,否则下一轮部分 fd 不再被监听。

有硬上限:FD_SETSIZE 默认 1024 fd 位图固定大小,只能监听 0~1023 的文件描述符。可以改宏重编内核,但工程不推荐。

返回之后,用户代码必须遍历所有 fd,判断哪个就绪 select 只会告诉你 "有事件来了",不会直接返回就绪 fd 列表,需要循环 FD_ISSET 挨个检查。

98.select 的优缺点

①优点:跨平台兼容性最好,Windows、Linux 都支持。

②缺点:

最多监听 1024 个 fd;

每次调用,都要把整个 fd 集合从用户态拷贝到内核;

内核轮询扫描全部 fd;返回后用户态还要遍历 fd 找就绪项;

每次循环都要重新构建 fd_set 集合。

99.水平触发 LT(select/poll只支持 LT

LT 水平触发:只要缓冲区数据还在,每次 select 都会持续通知就绪。 举例:缓冲区有 1000 字节,你本次只读了 200 字节,剩下 800 还在内核缓冲区。下一次 select 依然会继续触发可读事件。

风险:如果只读一部分数据,事件反复触发,容易造成死循环,一般搭配非阻塞 IO。

100.LT 和 ET 在这里的区别?

LT:数据还在缓冲区,每次多路复用都通知;

ET 边缘触发:只有新数据到达的一瞬间通知一次 ,如果这次不全部读完,剩下的数据不会再触发事件,会造成数据滞留。所以 ET 强制要求非阻塞。机会只有一次 ,事件通知一闪而过。必须在这次回调里,循环读,一直读到缓冲区空,read 返回 EAGAIN,确保全部数据拿完,不然残留数据永远不会再有事件提醒。

101.poll和select的关系

select 有 1024 上限,位图,fd_set 会被内核修改,每次循环重建集合; poll 用 pollfd 数组,无 1024 上限,内核只修改 revents,不用重建监听集合; 二者底层都是轮询,大量连接性能都差,都是 LT。

102.poll的特点

103.epoll的特点

104.select/poll/epoll的区别

  • select/poll:每次调用拷贝全部 fd;内核轮询扫描所有 fd;返回后用户遍历全部 fd;只有 LT;有 1024 上限。
  • epoll:fd 一次性注册;内核就绪链表,只返回就绪
  • fd;LT+ET 双模式;无 1024 硬限制。连接越多,epoll 优势越明显。

105.epoll 底层数据结构?

红黑树保存所有注册的 fd;就绪链表存放已经发生事件的 fd。

106.epoll 有什么缺点?

跨平台差,只在 Linux 支持,Windows 没有 epoll。

相关推荐
顺风尿一寸1 小时前
从 ls -U 到 Tomcat libs加载jar包:ext4 目录哈希序如何影响 Java 文件排序顺序
linux·jvm
de之梦-御风2 小时前
【未来】.NET 开发在「劳动价值重估」下的定位与走向
职场和发展·.net
qeen872 小时前
【Linux】操作系统之进程介绍(一)
linux·笔记·学习·进程
邪修king2 小时前
Re:Linux系统篇(二十五):文件系统(一):磁盘硬件底层原理:从物理结构到 CHS/LBA 寻址,搞懂硬盘数据的定位逻辑
java·linux·运维·gpt
小则又沐风a2 小时前
TCP协议讲解-----了解TCP可靠性的基石
linux
刚入门的大一新生2 小时前
Linux-简单设计libc库
linux·c++
科小墨3 小时前
【Linux 开发者系列 · 第 1 节】NPM 完全指南:它是什么、为什么重要、在 Linux 上怎么用
linux
IT北辰3 小时前
Linux运维:sed命令修改配置文件IP
linux
牢姐与蒯3 小时前
Linux文件(三).Ext系列文件系统
linux·运维·服务器