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

下载本文档

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

文档简介

Java网络编程高频面试题及详细答案(真实面试版)一、基础概念类1.说说你对网络七层模型和四层模型的理解?工作中最常用的是哪几层?参考答案:七层是OSI标准模型,四层是TCP/IP实际落地的模型,我们开发基本只用TCP/IP四层,不用死记七层,重点用得到的就四层:1.网络接口层:对应网卡、数据帧,负责物理传输,开发基本不碰;2.网络层:核心是IP协议,负责寻址、路由转发,确定数据要发到哪台机器;3.传输层:核心TCP、UDP,负责端口通信、数据传输,Java网络编程核心层;4.应用层:HTTP、HTTPS、FTP、自定义协议,我们业务开发直接接触的层。工作中日常开发主要接触传输层和应用层,Socket编程就是操作传输层,HTTP接口调用、网关交互都是应用层。2.IP地址和端口的作用分别是什么?为什么需要端口?参考答案:IP地址的作用是定位网络中的唯一一台主机,相当于小区的楼栋号。端口的作用是定位一台主机中的唯一一个应用进程,相当于楼栋里的房间号。一台服务器可以跑多个程序,比如Tomcat、Redis、MySQL,只有IP的话系统不知道数据要交给哪个程序,所以必须靠端口区分。端口范围0-65535,其中0-1023是系统保留端口,我们开发一般用1024以上的端口。3.什么是Socket?Socket和TCP/IP是什么关系?参考答案:Socket不是协议,它是操作系统提供的网络通信接口(一套API),是应用层和传输层之间的桥梁。简单说:TCP/IP是网络传输的规则,Socket是Java程序用来调用这个规则的工具。网络通信的两端就是两个Socket,本质是IP+端口的组合,操作系统会为每个Socket维护读写缓冲区,所有的数据收发都是操作缓冲区数据。二、TCP与UDP核心面试题(重中之重)4.TCP和UDP的核心区别?项目中分别用在什么场景?参考答案:我从日常开发角度总结核心区别,不背书面废话:1.连接性:TCP是面向连接的,三次握手建立连接、四次挥手断开;UDP是无连接的,不用建立连接,直接发数据。2.可靠性:TCP可靠,有确认应答、重传、有序校验,数据不丢、不乱序;UDP不可靠,不保证送达、不保证有序、可能丢包。3.效率:TCP开销大、速度稍慢;UDP开销极小、传输速度快。4.传输方式:TCP是字节流传输,无边界;UDP是数据报传输,一次发一个完整包。场景划分:TCP:对数据完整性要求高,不能丢数据的场景,比如HTTP接口、文件传输、数据库连接、Socket长连接通信。UDP:对速度要求高、允许少量丢包的场景,比如直播、视频通话、游戏对战、DNS解析。5.详细说一下TCP三次握手?为什么不能两次握手?参考答案:三次握手的核心目的:双向确认双方的发送和接收能力都正常,同步序列号,建立可靠连接。流程:1.第一次握手:客户端向服务端发送SYN报文,客户端请求建立连接,客户端发送能力正常;2.第二次握手:服务端收到SYN,回复SYN+ACK报文,告知客户端:服务端收发能力正常,收到你的请求;3.第三次握手:客户端收到确认,再发送ACK报文,告知服务端:我收到了你的确认,连接正式建立。为什么不能两次握手?两次握手只能保证客户端发、服务端收正常,无法确认客户端的接收能力。如果网络延迟,客户端失效的请求报文到达服务端,两次握手会让服务端直接建立连接、占用资源,造成资源浪费,三次握手可以彻底避免这个问题。6.TCP四次挥手的流程?为什么挥手需要四次,握手只要三次?参考答案:四次挥手核心:TCP连接是全双工的,收发通道独立关闭,不能一次性关完。流程:1.第一次挥手:主动关闭方(客户端)发送FIN,告知对方自己没有数据要发了,请求关闭发送通道;2.第二次挥手:被动关闭方(服务端)回复ACK,确认收到关闭请求,此时客户端只能收不能发,连接半关闭;3.第三次挥手:服务端处理完剩余数据后,发送FIN报文,告知客户端自己也没有数据要发了;4.第四次挥手:客户端回复ACK,服务端收到后正式关闭连接。为什么握手三次、挥手四次?握手时服务端的确认报文和连接请求报文可以合并,所以两次报文搞定双向确认;挥手时,服务端收到关闭请求后,可能还有业务数据没处理完,不能立刻关闭,必须先确认、处理数据、再主动关闭,两个动作不能合并,所以需要四次。7.TCP粘包、拆包是什么原因?怎么解决?参考答案:TCP是字节流协议,没有数据边界,操作系统会根据缓冲区大小、网络情况自动合并或拆分数据,就会出现粘包拆包。粘包:多条数据被合并成一条读取;拆包:一条完整数据被拆分成多次读取。产生原因:1.发送方缓冲区满了,批量发送数据,造成粘包;2.接收方读取速度慢,缓冲区堆积数据,下次一次性读出多条;3.网络传输的MTU限制,大数据包会被拆分。解决方案(工作常用):1.固定长度:每条数据长度固定,读取时按固定长度读取;2.分隔符:每条数据结尾加自定义分隔符,读到分隔符即认为一条数据结束;3.长度头(最常用):报文头部携带数据长度,先读长度,再根据长度读取完整数据,Netty框架默认就是这种方案。8.TCP的滑动窗口、拥塞控制简单说一下参考答案:滑动窗口核心是流量控制,解决收发双方速率不匹配的问题。接收方通过窗口大小,告诉发送方自己当前能接收多少数据,发送方不能超过这个量,避免接收方缓冲区溢出丢包。拥塞控制是解决网络链路拥堵的问题,不是两端的问题。TCP会动态调整发送速率,慢启动、拥塞避免、快重传、快恢复,避免一次性发送大量数据导致网络拥堵、丢包,保证传输稳定。三、JavaSocket编程实战面试题参考答案:这三种是Java的IO模型,核心差异是阻塞方式、线程模型、并发能力。1.BIO(同步阻塞)传统Socket就是BIO,一个连接对应一个线程,客户端连接过来,服务端新开线程处理。线程会一直阻塞等待读写操作。优点:代码简单、好写;缺点:并发极低,连接多了线程暴涨,CPU上下文切换严重,上万连接直接宕机。2.NIO(同步非阻塞)JDK1.4推出,核心是缓冲区、通道、选择器Selector。一个线程可以管理多个连接,线程不会阻塞,通过轮询检测就绪的连接,只处理有数据的连接。优点:并发能力强、线程资源少;缺点:代码繁琐,需要自己处理粘包拆包、轮询逻辑,原生NIO开发效率极低,所以生产基本用Netty封装好的NIO。JDK1.7推出,真正的异步IO,由操作系统完成读写操作,完成后回调Java程序。不需要轮询,效率最高。缺点:Windows支持好,Linux支持不完善,生产几乎没人用。10.BIO服务端为什么并发差?多线程BIO的瓶颈在哪?参考答案:BIO的accept()、read()、write()都是阻塞方法。单线程BIO一次只能处理一个连接,所以必须多线程。多线程BIO的核心瓶颈:1.每一个客户端连接独占一个线程,闲置连接也会占用线程资源;2.Java线程是重量级资源,线程数量有上限,一般几千个就是极限;3.大量线程会导致CPU频繁上下文切换,吞吐量急剧下降,极易卡死。11.JavaNIO的三大核心组件及作用参考答案:NIO三大核心:Channel、Buffer、Selector。1.Channel(通道):数据传输的通道,双向读写,区别于BIO单向流,支持非阻塞操作。常见:FileChannel、SocketChannel、ServerSocketChannel。2.Buffer(缓冲区):所有数据读写必须经过缓冲区,本质是数组。Channel不直接操作数据,只负责传输,数据存放在Buffer中。3.Selector(选择器):NIO的核心,多路复用器。一个Selector线程可以注册多个Channel,轮询监听通道的连接、读、写事件,只处理就绪的通道,实现单线程管理多连接。12.NIO的ByteBuffer几个核心指针是什么?区别是什么?参考答案:四个核心指针:capacity、limit、position、mark。1.capacity:缓冲区总容量,创建后固定不变;2.position:当前读写位置,读写数据后会后移;3.limit:读写上限,写模式下等于capacity,读模式下等于写入数据的长度;4.mark:标记位置,用于回溯position。核心切换逻辑:写模式下position不断后移,写完调用flip()切换读模式,limit=position、position归零,从头读取数据;读完调用clear()清空,切换回写模式。四、高频疑难面试题13.什么是半关闭状态?TCP为什么支持半关闭?参考答案:半关闭就是一方关闭了写入通道,但是还可以继续读取数据。对应JavaSocket的shutdownOutput()方法。适用场景:客户端发送完所有请求数据,告诉服务端我不会再发数据了,但是还等着接收服务端的响应结果。如果直接关闭连接,会导致无法接收返回数据,半关闭可以完美解决这个问题。14.为什么HTTP是基于TCP的,但是是无状态的?参考答案:这是两个维度的概念,不冲突。TCP是传输层协议,是有连接、有状态的,保证传输可靠;HTTP是应用层协议,本身不记录客户端的任何请求信息,每次请求都是独立的,服务端不会保存上一次的请求状态,所以是无状态的。为了解决无状态问题,才有了Cookie、Session、Token这些会话保持技术。15.长连接和短连接的区别?适用场景?参考答案:短连接:一次请求响应后,立刻断开TCP连接。HTTP1.0默认短连接。优点:不用维护连接资源,简单;缺点:频繁建立断开连接,三次握手四次挥手开销大。场景:一次性接口调用、访问量零散的业务。长连接:连接建立后,持续复用,多次请求共用一个连接,长时间不通信才断开。HTTP1.1、Socket、Redis、MySQL都是长连接。优点:省去握手挥手开销,响应速度快;缺点:需要维护连接、心跳保活,占用服务端资源。场景:高频通信、即时通讯、推送、数据库连接、中间件交互。16.什么是心跳机制?网络编程中为什么要做心跳检测?参考答案:心跳机制就是长连接场景下,客户端和服务端定时互相发送极小的检测包,证明连接存活。必要性:1.网络突然断开、客户端异常崩溃,不会触发四次挥手,服务端无法感知失效连接,会一直占用资源;2.防火墙会自动清理长时间无数据的空闲连接,导致连接假死;通过心跳检测,可以及时清理无效连接、重连断开的连接,保证长连接稳定。五、Netty基础高频面试题(进阶必问)17.为什么不用原生NIO,而用Netty?参考答案:原生JDKNIO坑非常多,生产绝对不能直接用:1.原生NIO代码极其繁琐,需要手动处理事件、缓冲区、粘包拆包;2.JDKNIO的Selector存在空轮询BUG,会导致CPU100%;3.没有成熟的线程模型、编解码、异常重连、心跳机制,全部需要自己手写;4.不支持优雅关闭、流量控制,稳定性极差。Netty封装了JDK

温馨提示

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

评论

0/150

提交评论