版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Socket高频面试题及详细答案(真实面试版)一、基础概念类1、什么是Socket?Socket的本质是什么?Socket俗称套接字,是操作系统提供给应用程序的网络通信接口,也是应用层与传输层之间的桥梁。本质上Socket不是协议,而是一套编程接口(API)。操作系统把TCP、UDP复杂的网络协议封装好,应用程序只需要调用Socket接口,就能实现跨主机的数据传输,不用手动处理底层报文封装、路由转发、校验等逻辑。简单来说:网络通信的两端进程,就是通过Socket建立连接、收发数据的。2、Socket、TCP、HTTP三者的关系和区别?层级区别:Socket:是编程接口,属于操作系统提供的开发工具,无网络层级,是通信的载体。TCP:是传输层协议,负责可靠的端到端数据传输,定义了数据传输规则。HTTP:是应用层协议,基于TCP实现,定义了客户端和服务端的数据交互格式(请求头、响应体、状态码等)。通俗总结:Socket是通道工具,TCP是通道传输规则,HTTP是通道里的数据格式规范。HTTP通信底层完全依赖TCP+Socket实现。3、Socket的组成部分是什么?一个完整的Socket通信端点,由IP地址+端口号唯一确定。四元组可以唯一确定一条网络连接:源IP、源端口、目的IP、目的端口。只要四元组任意一个参数不同,就是不同的连接。端口的作用:区分同一台服务器上的不同进程,比如80端口对应HTTP服务、22端口对应SSH服务。二、TCPSocket核心原理类4、TCPSocket建立连接的三次握手,详细过程?三次握手的核心目的:确认双方的发送和接收能力都正常,同步序列号,建立可靠连接。1、第一次握手(客户端→服务端):客户端发送SYN报文,携带客户端初始序列号,请求建立连接,客户端进入SYN_SENT状态。2、第二次握手(服务端→客户端):服务端收到SYN报文,确认客户端正常,返回SYN+ACK报文,携带服务端初始序列号,同时确认客户端序列号+1,服务端进入SYN_RCVD状态。3、第三次握手(客户端→服务端):客户端收到SYN+ACK报文,确认服务端收发正常,发送ACK确认报文,客户端进入ESTABLISHED状态;服务端收到该ACK后,也进入ESTABLISHED状态,连接正式建立。面试关键点:三次握手不能改成两次,两次握手无法保证服务端的发送能力正常,会造成无效连接占用资源。5、TCPSocket断开连接的四次挥手,详细过程?为什么需要四次?四次挥手核心:TCP是全双工通信,读写通道相互独立,需要分别关闭两端的读写通道。3、第三次挥手(被动方→主动方):被动方处理完剩余数据后,发送FIN报文,关闭己方写通道,进入LAST_ACK状态。为什么是四次:握手时SYN和ACK可以合并发送,挥手时被动方可能还有残留数据需要处理,无法直接关闭,必须分两步确认,所以需要四次。1、保证被动方正常关闭连接:防止最后一次的ACK报文丢失,若丢失,被动方会重发FIN报文,主动方可以再次补发ACK。如果直接关闭,被动方会一直处于LAST_ACK状态,造成资源泄露。2、防止残留报文干扰新连接:网络中可能存在延迟的失效报文,2MSL是报文在网络中最大的存活时间,等待该时长可以确保所有旧连接报文全部失效,不会被新连接误接收。三、TCP粘包拆包高频面试题7、什么是TCP粘包、拆包?为什么会出现?核心前提:TCP是面向字节流的协议,没有数据包边界,只保证数据有序可靠,不区分业务报文。拆包:单次发送的业务数据较大,超过了TCP缓冲区最大限制,系统会自动拆分成多个小包发送,接收方会分多次收到完整数据。粘包:多次发送的小包数据,被TCP合并成一个数据包发送。分为两种情况:发送方粘包:发送频率高、数据量小,TCP缓冲区未满,系统会合并数据统一发送(Nagle算法)。接收方粘包:接收方读取不及时,缓冲区堆积多个报文,一次性读取出来。8、TCP粘包拆包的解决方案?(面试必问)所有方案的核心:手动给业务数据添加报文边界,让接收方可以精准拆分完整报文,常用四种方案:1、固定报文长度:所有业务数据统一固定长度,不足补空位。接收方每次读取固定长度数据,简单高效,但灵活性差,容易浪费带宽。2、首尾分隔符:在每个报文开头和结尾添加自定义分隔符(如换行符、特殊符号)。接收方根据分隔符拆分报文,适合文本数据,缺点是数据内容不能包含分隔符,否则会解析异常。3、长度头+数据体(最常用):报文结构=4字节长度头+业务数据体。读取时先读取固定长度的头部,解析出数据体长度,再读取对应长度的内容,精准拆分,适配所有场景,项目中主流方案。4、关闭Nagle算法:设置TCP_NODELAY,禁止系统合并小包,实时发送数据。适合实时性要求高的场景(游戏、直播),缺点是会增加网络IO开销。四、UDPSocket相关问题9、TCP和UDPSocket的核心区别?各自适用场景?对比维度TCPUDP连接特性面向连接,需要三次握手建立连接无连接,无需建立连接,直接发包可靠性可靠传输,重传、校验、有序、无丢失不可靠,无重传机制,可能丢包、乱序传输方式字节流,无报文边界,存在粘包拆包数据报,有独立报文边界,无粘包只有丢包速度开销速度慢,头部开销大,握手挥手损耗资源速度快,开销小,实时性高适用场景:TCP:文件传输、接口请求、登录注册、支付数据,要求数据绝对完整可靠的场景。UDP:直播、短视频、游戏、语音通话,容忍少量丢包、追求高实时性的场景。10、UDP为什么不会粘包?UDP是面向数据报的协议,应用层发送的每个数据包都是独立的,操作系统会单独封装报文,保留完整的报文边界。发送10次数据,就会生成10个独立UDP报文,接收方每次读取只能获取一个完整报文,不会出现合并粘连的情况。唯一问题是可能丢包、乱序,不存在粘包拆包问题。五、Socket实战与异常问题11、Socket服务端为什么要bind、listen、accept?各自作用?1、bind(绑定):将创建好的Socket文件与指定的IP和端口绑定,让服务器固定监听该端口,客户端可以通过这个地址找到服务端。不绑定的话,系统会随机分配端口,无法对外提供稳定服务。2、listen(监听):将Socket从默认的主动连接模式,转为被动监听模式,同时设置半连接队列和全连接队列的长度,开始等待客户端连接请求。3、accept(接收连接):阻塞等待全连接队列中的客户端连接,一旦有连接就绪,就会返回一个新的Socket,专门用于和该客户端通信,原监听Socket继续等待新连接。12、Socket编程中,close和shutdown的区别?1、close:直接关闭整个Socket连接,同时释放读写通道和资源。如果有多个进程共享该Socket,引用计数归0才会真正关闭。调用后无法再收发任何数据。2、shutdown:可以选择性关闭单向通道,支持三种模式:只关读、只关写、读写全关。只关闭写通道时,依然可以接收对方剩余数据,灵活性更高,适合需要处理完残留数据再断开的场景。13、什么是Socket半关闭状态?TCP全双工通信中,一方关闭了写通道,但保留读通道,这种状态就是半关闭。场景:客户端发送完所有数据后,调用shutdown关闭写端,告知服务端数据发送完毕,但依然可以接收服务端的返回数据。服务端处理完数据后,再主动关闭连接,保证数据传输完整。14、Socket连接断开的几种异常场景怎么判断?1、正常断开:对方主动close,我方recv读取数据会返回0,可以直接判定连接断开。2、异常断开(断网、进程崩溃):不会发送FIN报文,recv不会返回0,程序无法主动感知,会一直阻塞等待。解决方案:开启TCP心跳机制,设置固定间隔发送心跳包,超时未收到响应,判定连接失效,主动断开释放资源。六、IO模型与Socket并发15、Socket常见的IO模型有哪些?区别是什么?1、阻塞IO(BIO):默认模式,accept、recv都会阻塞线程。一个连接对应一个线程,并发量低,连接多了会线程溢出、资源耗尽,适合小并发场景。2、非阻塞IO:Socket设置非阻塞,调用recv无数据时直接返回错误,不会阻塞。需要循环轮询,CPU占用率极高,一般不单独使用。3、IO多路复用(NIO核心):单线程监听多个Socket文件描述符,有事件(连接、读写)触发时再处理。支持高并发,是服务器主流模型,select、poll、epoll都属于这类。16、select、poll、epoll的核心区别?1、select:最大文件描述符数量有限制,每次需要遍历所有fd,效率低,仅适合低并发。2、poll:解除了文件描述符数量限制,但依然需要遍历所有fd,高并发下性能依旧较差。3、epoll(Linux最优):基于事件通知机制,只返回就绪的fd,无需遍历,无最大数量限制,高并发、长连接场景性能最优,Nginx、Redis底层均基于epoll。七、高频压轴题17、一条Socket连接可以发送无限数据吗?为什么?不可以。核心限制是TCP滑动窗口和系统缓冲区。两端都有读写缓冲区,如果接收方处理数据速度慢,缓冲区会被填满,滑动窗口会变为0,发送方会停止发送数据,进入阻塞状态。如果持续发送,会造成数据积压、连接阻塞,最终导致超时断开。18、端口可以重复使用吗?Socket端口复用原理?正常情况下,同一台机器同一端口同一时刻只能被一个进程占用。通过设置SO_REUSEADDR端口复用参数,可以实现端口复用,主要作用:2、同一端口可以绑定多个不同IP的连接,提升服务可用性。生产环境服务端基本都会开启端口复用,避免重启服务端口占用报错。19、什么是TCP半连接队列、全连接队列?溢出会有什么问题?1、半连接队列:存放三次握手第一次完成的连接(SYN已接收,未完成握手),对应SYN_RCVD状态。队列溢出会导致新连接握手失败,出现SYN丢包。2、全连接队列:存放三次握手完全完成、等待accept读取的连接。队列溢出会导致连接被丢弃,客户端连接超时、连接失败。生产中并发过高、业务处理过慢,容易出现队列溢出,需要调大内核
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年航道工程考试题库及答案
- 2026年物体打击事故预防与处理培训考核试卷及答案
- 2026年事业单位联考《综合应用能力》A类真题及答案解析
- 2026年飞机维修人员培训要求题目及答案
- 2026年事业单位《公共管理》知识培训试题及答案
- 供应商交货逾期问题处理通知(7篇范文)
- 2026年公务员面试技巧模拟试题及答案
- 化妆品研发师产品研发成果绩效衡量表
- 关于客户投诉处理结果的回复函8篇
- 网络钓鱼攻击应对响应预案
- 超危大模板及支撑体系专项施工方案(专家论证修改后)2022
- 卫生间抽纸管理制度
- Unit3FamilymattersDevelopingideasJustabrother课件-高中英语外研版
- 贵州省公路占道作业安全技术指南(试行)
- 头发移植课件
- 《深度学习与神经网络》全套教学课件
- GB/T 9535.2-2025地面用光伏组件设计鉴定和定型第2部分:试验程序
- 煤矿安全生产风险分级管控和隐患排查治理双重预防体系建设培训课件
- 全国民用爆炸物品信息管理系统领用发放手持机用户手册
- 委托检测服务合同协议书
- 长期总代理协议书范本
评论
0/150
提交评论