C语言网络编程面试题及详细答案(实战版)_第1页
C语言网络编程面试题及详细答案(实战版)_第2页
C语言网络编程面试题及详细答案(实战版)_第3页
C语言网络编程面试题及详细答案(实战版)_第4页
C语言网络编程面试题及详细答案(实战版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言网络编程面试题及详细答案(实战版)一、网络编程基础面试题1.简述TCP/IP四层模型,每一层的作用及对应协议参考答案:日常开发中常用TCP/IP四层模型,从上到下依次为应用层、传输层、网络层、网络接口层,各层职责和核心协议如下:1.应用层:直接面向用户和应用程序,负责定义应用的通信规则、数据格式和交互逻辑,是程序开发直接接触的层级。核心协议:HTTP、HTTPS、FTP、SSH、DNS。2.传输层:负责端到端的进程通信,在两台主机的应用程序之间建立数据传输通道,提供可靠/不可靠传输、流量控制等能力。核心协议:TCP(可靠面向连接)、UDP(不可靠无连接)。3.网络层:负责主机之间的寻址和路由转发,确定数据从源主机到目标主机的传输路径。核心协议:IP、ICMP、ARP。4.网络接口层:负责将网络层数据包封装成帧,通过物理网络传输,处理硬件寻址、数据校验。核心协议:以太网协议、PPP协议。2.字节序是什么?网络字节序和主机字节序的区别,为什么需要转换参考答案:字节序是多字节数据在内存中的存储顺序,主要分为两种:-大端序:高字节存低内存地址,低字节存高内存地址;-小端序:低字节存低内存地址,高字节存高内存地址。主流电脑、服务器的CPU(x86、x64)默认是小端序,也就是主机字节序不统一;而网络字节序统一规定为大端序。网络通信中,不同设备的主机字节序可能不同,如果直接传输多字节数据(端口号、IP地址),会出现数据解析错乱。因此必须统一转换为网络大端序传输,接收方再转回本地主机字节序。常用转换函数:htons()、htonl()、ntohs()、ntohl()。3.socket是什么?简述socket通信的本质参考答案:socket本质是操作系统提供的网络通信文件描述符,是应用层与内核网络协议栈的接口。操作系统把网络通信抽象成文件操作,程序可以通过读写socket文件,实现跨主机的数据传输。socket通信的核心本质:通过「IP地址+端口号」唯一标识网络中的一个进程,两台主机通过各自的socket端点建立连接、收发数据,完成进程间的网络通信。二、TCP核心面试题(高频)1.简述TCP三次握手的过程,为什么是三次而不是两次参考答案:TCP是面向连接的协议,传输数据前必须通过三次握手建立可靠连接:1.第一次握手:客户端向服务端发送SYN报文,携带客户端初始序列号,请求建立连接;此时客户端进入SYN_SENT状态。2.第二次握手:服务端收到SYN报文后,回复SYN+ACK报文,确认客户端请求,同时向客户端发起连接请求;此时服务端进入SYN_RCVD状态。3.第三次握手:客户端收到SYN+ACK报文后,发送ACK报文确认服务端请求,客户端、服务端同时进入ESTABLISHED连接状态,连接建立完成。为什么不能两次握手:两次握手只能保证「客户端发、服务端收」的链路通畅,无法验证「服务端发、客户端收」的链路。如果网络延迟,客户端失效的连接请求到达服务端,两次握手会让服务端直接建立无效连接,占用服务器资源;三次握手可以彻底规避半连接问题,保证双向通信链路完全可靠。参考答案:TCP连接是全双工的,断开连接需要双向分别关闭,因此需要四次挥手:3.第三次挥手:被动方数据传输完毕后,发送FIN报文,请求关闭己方连接,进入LAST_ACK状态。一是确保最后一次ACK报文能被对方收到,避免对方重发FIN报文;二是等待网络中残留的延迟报文失效,避免新连接收到旧连接的无效数据。3.TCP粘包问题是什么?产生原因及解决方案参考答案:粘包现象:TCP是流式协议,无数据边界,发送方连续发送的多段数据,接收方可能一次性读取到一起,或者一段数据被拆分多次读取,分为粘包和拆包。产生原因:1.操作系统TCP缓冲区机制:发送方缓冲区未满、接收方缓冲区未及时读取,数据会堆积合并;2.TCP自适应优化:Nagle算法会合并小数据包统一发送,减少网络开销,直接导致粘包。工程解决方案:1.固定数据包长度:每次收发固定字节数据,不足补零,简单高效,适合固定格式场景;2.报文头+数据体:最常用方案,报文头部预留2-4字节存储数据长度,接收方先读头部获取长度,再精准读取对应长度数据;3.特殊分隔符:数据包末尾添加唯一分隔符(如\r\n),接收方按分隔符拆分数据包,适合文本协议。4.TCP的Nagle算法和延迟ACK,以及带来的问题参考答案:Nagle算法:为减少网络小包数量、降低带宽损耗,TCP默认开启该算法。当发送小包数据且未收到上一个报文的ACK时,内核会缓存当前数据,等待数据攒够或收到ACK后再统一发送。延迟ACK:接收方收到数据后,不会立即回复ACK,会短暂延迟(几十毫秒),等待合并多个ACK回复,减少报文数量,提升效率。组合带来的问题:实时性极差。比如客户端发小包、服务端延迟ACK,客户端等待ACK无法发送新数据,双方互相等待,造成数据传输卡顿。游戏、即时通信场景必须关闭Nagle算法。关闭方式:通过setsockopt()设置TCP_NODELAY选项。三、UDP核心面试题1.UDP和TCP的核心区别,各自适用场景参考答案:对比维度TCPUDP连接特性面向连接,需三次握手建立连接无连接,无需建立连接,直接收发数据可靠性可靠传输,重传、校验、有序、无丢失不可靠,无重传机制,可能丢包、乱序边界特性流式无边界,存在粘包问题数据报有边界,无粘包问题速度开销速度慢,头部开销大,资源占用高速度快,头部极简,开销极小适用场景:-TCP:文件传输、网页访问、登录通信等要求数据绝对可靠、不允许丢包的场景;-UDP:直播、视频通话、游戏、DNS查询等追求实时性,少量丢包可接受的场景。2.UDP无连接、不可靠,为什么工程中还大量使用?如何实现UDP可靠传输参考答案:UDP优势:开销极低、无需维护连接状态、传输延迟极小、支持一对多广播/组播,在实时性场景中优势远超TCP。TCP的重传、拥塞控制机制会导致严重延迟,不适合实时业务。UDP上层实现可靠传输的方案:1.序列号+ACK确认机制,保证数据有序、确认送达;2.超时重传机制,丢失报文自动重发;3.校验和校验,剔除错误数据;4.滑动窗口机制,实现流量控制。主流的QUIC协议、游戏自定义通信协议,都是基于UDP实现的可靠传输协议。四、Socket编程函数与实战问题1.简述TCP服务端、客户端完整编程流程参考答案:服务端流程:1.socket():创建监听套接字,返回文件描述符;2.bind():绑定固定IP和端口,让客户端可以定位服务端;3.listen():开启监听,设置内核半连接队列和全连接队列大小;4.accept():阻塞等待客户端连接,成功后返回新的通信套接字;5.read()/write()/recv()/send():和客户端收发数据;6.close():关闭通信套接字和监听套接字。客户端流程:1.socket():创建客户端套接字;2.connect():主动连接服务端指定IP和端口;3.收发数据、关闭套接字,流程简单无绑定、监听、接受步骤。2.bind函数为什么有时候必须绑定参考答案:是本机所有网卡地址。服务器通常有多张网卡(内网、外网),绑定后,服务端可以接收所有网卡、所有IP地址的客户端连接。如果绑定具体网卡IP,只能接收该网卡对应IP的连接,其他网卡的访问会直接拒绝,服务器无法对外提供全网访问能力。日常开发中,服务器端口绑定统一使用。3.accept、recv、connect阻塞和非阻塞的区别,非阻塞socket如何处理参考答案:阻塞socket:调用accept无连接、recv无数据、connect未完成时,线程会卡死等待,直到条件满足才返回,简单但无法处理多并发。非阻塞处理方案:不能死循环轮询(CPU占用100%),必须搭配IO多路复用(select/poll/epoll),只监听就绪的socket事件,高效处理并发。五、IO多路复用高频面试题1.select、poll、epoll的区别,epoll高效的原因参考答案:select缺点:最大监听文件描述符有限制;每次调用需要重新拷贝fd集合、遍历所有fd检测就绪状态;效率随fd数量增加急剧下降。poll优化:解除fd数量限制,但仍需要遍历所有fd判断就绪,高并发场景效率依旧低下。epoll核心优势(Linux专属):1.事件驱动机制:内核主动记录就绪的fd,用户态只需读取就绪列表,无需全局遍历;2.内存映射:通过mmap减少用户态和内核态的数据拷贝开销;3.水平触发/边缘触发:边缘触发仅在状态变化时通知,极大减少通知次数,适合高并发;4.无fd数量限制,支持十万、百万级并发连接。2.水平触发LT和边缘触发ET的区别,ET模式的注意事项参考答案:水平触发LT(默认):只要socket缓冲区有未读完的数据,epoll会一直触发可读事件,直到数据全部读取完毕。优点是容错高、编程简单,缺点是事件重复触发,效率偏低。边缘触发ET:仅在数据第一次到达、缓冲区状态发生变化的瞬间触发一次事件,后续残留数据不会再次触发。效率极高,是高并发服务器首选模式。ET模式强制要求:1.socket必须设置为非阻塞模式;六、网络故障与服务器优化面试题1.什么是半连接队列、全连接队列?队列溢出会出现什么问题参考答案:服务端listen之后,内核会维护两个队列:1.半连接队列:存放SYN已到达、未完成三次握手的连接(SYN_RCVD状态);2.全连接队列:存放三次握手完成、等待accept函数取走的连接(ESTABLISHED状态)。队列溢出问题:-半连接队列满:丢弃客户端SYN报文,客户端连接超时失败;-全连接队列满:丢弃已完成握手的连接,客户端显示连接被拒绝或超时,服务器出现大量连接失败、业务卡顿。参考答案:原因:短连接频繁创建、关闭,主动断开连接的一方大量处于等待状态,占用端口和资源。优化:开启端口复用、调整2MSL超时时间、改用长连接减少频繁建连断连。解决方案:检查代码,确保所有socket读写异常、连接断开时,都主动close释放资源

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论