当前位置: 首页 > news >正文

计算机网络面试集合

Java工程师面试计算机网络八股文面试题集合

1. OSI七层模型

理论标准,指导协议设计

层名核心作用功能典型协议/设备
物理层传输原始比特流(0/1)定义物理介质特性(电压、光信号、接口形状等);控制数据传输速率、同步、信号衰减补偿双绞线、光纤、WI-FI无线电波、集线器(Hub)、中继器(Repeater)
数据链路层确保同一局域网(LAN)内节点之间的可靠传输成帧(封装比特为帧,添加MAC地址头尾标识);差错控制(CRC校验);流量控制(滑动窗口)MAC地址、以太网、交换机、PPP协议
网络层跨网络(如互联网)的端到端数据路由逻辑寻址(IP地址);路由选择(路由器);分片与重组(适应不同网络MTU)IP协议、ICMP(ping)、路由器、OSPF/BGP路由协议
传输层确保端到端(应用程序之间)的可靠/不可靠传输端寻址(端口标识应用,如HTTP=80);流量控制(TCP滑动窗口);可靠性保障(重传、确认、排序)TCP(可靠)、UDP(不可靠)、滑动窗口协议
会话层管理通信会话(建立、维护、终止)会话控制(全双工/半双工模式,如RPC);断点恢复(断点续传,如文件下载工具)NetBIOS、RPC(远程过程调用)、PPTP(VPN)
表示层数据格式转换与安全处理数据编码(ASCII/Unicode、JPEG);加密/解密(SSL/TLS);压缩/解压(GZIP)SSL/TLS、MIME(邮件编码)、ASCII/JSON/XML
应用层为应用程序提供网络服务接口定义用户可见协议(HTTP访问网页、SMTP发邮件);用户身份验证(OAuth);服务请求/响应HTTP、FTP、DNS、SMTP、SSH、MQTT

2. TCP/IP四层模型

工程实践,驱动互联网发展

TCP/IP层名功能描述对应OSI层
应用层为应用程序提供网络服务(如HTTP、FTP、SMTP)会话层、表示层、应用层
传输层端到端可靠/不可靠传输(TCP/UDP)传输层
互联网层跨网络路由与逻辑寻址(IP协议、路由选择)网络层
网络接口层物理介质传输与数据链路控制(以太网、WiFi、MAC地址)物理层、数据链路层

3. TCP与UDP的区别及使用场景

特性TCPUDP
连接性面向连接(三次握手)无连接
可靠性可靠(校验和、重传、拥塞控制)不可靠(无重传机制)
头部开销20字节(固定首部)8字节(仅基础字段)
典型应用HTTP/HTTPS、FTP、SMTPDNS、视频流、实时游戏

4. TCP三次握手与四次挥手流程

  • 三次握手: 可靠传输,同步双方序列号,避免旧连接干扰。

    1. 客户端发送SYN(seq=x)。
    2. 服务器回复SYN+ACK(seq=y, ack=x+1)。
    3. 客户端发送ACK(seq=x+1, ack=y+1)。
  • 四次挥手: TCP半关闭特性,允许一方发送完数据后继续接收。

    1. 客户端发送FIN
    2. 服务器回复ACK
    3. 服务器发送FIN

    服务端启动重传定时器(初始超时时间通常为 RTO,Retransmission Timeout,默认值约为 1~3 秒,具体取决于系统实现)一般远小于1MSL。

    如果服务端在 RTO 时间内收到客户端的 ACKACK=1, ack=y+1),则立即进入 CLOSED 状态,连接释放。

    如果未收到 ACK**(即 ACK 丢失或延迟),服务端会 **重传 FIN,并重新启动定时器(超时时间通常按指数退避策略递增,如 2×RTO、4×RTO 等)。

    4.客户端回复ACK

    回复ACK后客户端连接依旧保留两个周期(2MSL,Maximum Segment Lifetime),原因如下

    (1) 确保最后一个 ACK 到达服务器
    • 网络中可能存在丢包或乱序问题。如果客户端的最后一个 ACK 丢失,服务器会因未收到确认而重传 FIN
    • 客户端在 TIME_WAIT 期间保持连接状态,可以重新发送 ACK,确保服务器最终能收到确认并关闭连接。
    • MSL 是报文在网络中的最大生存时间,2MSL 覆盖了 ACK 和可能的 FIN 重传的往返时间(RTT)。
    (2) 防止旧连接的报文干扰新连接
    • TCP 连接由四元组(源 IP、源端口、目标 IP、目标端口)唯一标识。如果客户端立即关闭并复用端口,新连接可能与旧连接的残留报文冲突。
    • 例如:
      • 客户端在 TIME_WAIT 前发送的某个数据段(如 seq=z)因网络延迟滞留,在 2MSL 后才到达服务器。
      • 如果此时客户端已用相同端口建立新连接,旧数据段可能被误认为新连接的数据,导致协议错误。
    • 2MSL 确保所有旧报文在网络中过期,避免干扰后续连接。

    为什么是 2MSL 而不是 1MSL?

    • 1MSL:报文从客户端到服务器(或反向)的最大生存时间。
    • 2MSL:覆盖报文的往返时间(RTT),包括:
      1. 客户端的最后一个 ACK 到达服务器(1MSL)。
      2. 如果 ACK 丢失,服务器的 FIN 重传到达客户端(再 1MSL)。
    • 因此,2MSL 是理论上的最小安全时间,确保所有可能的重传和延迟报文都能被处理。

5. HTTP与HTTPS

  • 安全性:HTTPS通过SSL/TLS加密传输,防止数据窃听。
  • 端口:HTTP(80),HTTPS(443)。
  • 性能:HTTPS有额外握手开销,但HTTP/2优化后性能接近HTTP。

HTTP请求方法及状态码

  • 常见方法
    • GET:获取资源(幂等)。
    • POST:提交数据(非幂等)。
    • PUT:更新资源(幂等)。
    • DELETE:删除资源。
  • 状态码
    • 200 OK:请求成功。
    • 301 Moved Permanently:永久重定向。
    • 404 Not Found:资源不存在。
    • 500 Internal Server Error:服务器内部错误。

6. websocket代码实现

服务端

const WebSocket = require("ws");
const fs = require("fs");
const path = require("path");const wss = new WebSocket.Server({ port: 8080 });// 模拟流式数据(如视频帧、传感器数据)
let counter = 0;
setInterval(() => {const data = `数据块 ${counter++} - ${new Date().toISOString()}\n`;wss.clients.forEach((client) => {if (client.readyState === WebSocket.OPEN) {client.send(data);}});
}, 1000); // 每秒发送一次console.log("WebSocket 服务器运行在 ws://localhost:8080");

客户端

<body><h1>实时数据流</h1><pre id="output"></pre><script>const output = document.getElementById("output");const ws = new WebSocket("ws://localhost:8080");ws.onmessage = (event) => {output.textContent += event.data;};ws.onclose = () => {console.log("WebSocket 连接关闭");};</script>
</body>

7. DNS解析过程

  1. 本地缓存查询:浏览器→操作系统→本地DNS服务器。
  2. 递归查询:本地DNS服务器向根服务器、顶级域名服务器、权威服务器逐级查询。
  3. 迭代查询:服务器返回下一级地址,客户端自行查询。
    最终:获取IP地址并缓存。

8. Java Socket编程步骤

  • 服务器端
    ServerSocket serverSocket = new ServerSocket(8080);
    Socket clientSocket = serverSocket.accept();
    // 读写数据
    clientSocket.close();
    
  • 客户端
    Socket socket = new Socket("localhost", 8080);
    // 读写数据
    socket.close();
    

9. TCP粘包/拆包问题及解决方案

**粘包(Sticky Packet):**一个消息被拆分为多个数据包接收。如发送方发送 "HelloWorld"(10字节),接收方可能先收到 "Hello",再收到 "World"

**拆包(Fragmented Packet):**一个消息被拆分为多个数据包接收。发送方发送 "HelloWorld"(10字节),接收方可能先收到 "Hello",再收到 "World"

触发场景:

  • Nagle算法:TCP默认启用Nagle算法,合并小数据包以减少网络拥塞。
  • MSS(最大分段大小):TCP分段时可能将大消息拆分为多个段。
  • 接收缓冲区:接收方未及时读取数据,导致缓冲区堆积,后续数据覆盖前序数据边界。

解决方案:

分隔符(Delimiter)

  • 原理
    在消息末尾添加特殊分隔符(如\n\0或自定义符号),接收方通过分隔符拆分消息。
  • 实现步骤:
    1. 发送方:
      • 在每条消息末尾追加分隔符(如"Hello\n")。
    2. 接收方:
      • 读取数据直到遇到分隔符,将分隔符前的部分作为完整消息。
      • 需处理缓冲区中可能存在的部分消息(如上一次读取到"Hel",本次读取到"lo\nWorld",需合并后拆分)。
  • 优点:
    • 无需记录消息长度,适合文本协议(如HTTP头部以\r\n分隔)。
  • 缺点:
    • 分隔符不能出现在消息内容中(需转义,如将\n替换为\\n)。
    • 二进制数据需额外编码(如Base64),增加复杂度。

消息头+长度字段(Header + Length Field)

  • 原理
    在消息头部定义长度字段(如4字节),接收方先读取头部获取长度,再读取完整数据。
  • 实现步骤:
    1. 消息格式:
      • [长度字段(4字节)][数据体(N字节)]
      • 示例:发送 "Hello" 时,构造消息 [0x00, 0x00, 0x00, 0x05][H,e,l,l,o]
    2. 发送方:
      • 计算数据体长度,填充到头部。
      • 发送完整消息(头部+数据体)。
    3. 接收方:
      • 读取4字节头部,解析出数据体长度。
      • 根据长度读取数据体,确保完整性。
  • 优点:
    • 灵活支持任意长度数据,带宽利用率高。
    • 广泛用于二进制协议(如Protobuf、gRPC)。
  • 缺点:
    • 实现稍复杂,需处理字节序(如网络字节序为大端)。
    • 需处理消息过长时的缓冲区分配问题(如动态扩容)。

10. BIO、NIO、AIO的区别

模式特点
BIO同步阻塞,适合连接数少的场景(如传统Web服务器)。
NIO同步非阻塞,通过Selector多路复用,适合高并发(如Netty框架)。
AIO异步非阻塞,基于事件和回调,适合I/O密集型场景(如文件处理)。

11. HTTP/1.1与HTTP/2的主要区别

  • HTTP/1.1
    • 长连接(Keep-Alive)。
    • 管线化(Pipelining,但存在队头阻塞)。
  • HTTP/2
    • 多路复用(单连接并行请求)。
    • 头部压缩(HPACK算法)。
    • 二进制分帧(提高传输效率)。

12. TCP拥塞控制算法

  • 慢启动:初始发送速率低,指数增长。
  • 拥塞避免:达到阈值后线性增长。
  • 快速重传/恢复:检测到丢包时快速重传,避免网络拥塞。
  • 算法:Reno(经典)、Cubic(Linux默认)、BBR(谷歌优化)。

13. ARP协议的作用

  • 功能:将IP地址解析为MAC地址。
  • 流程:主机发送ARP请求广播,目标主机回复ARP响应,缓存映射关系。

14. 浏览器输入URL到页面加载完成的流程

  1. DNS解析 → 2. TCP三次握手 → 3. HTTP请求 → 4. 服务器处理 → 5. 响应渲染 → 6. 四次挥手断开连接。

15. 如何设计一个高并发网络服务?

  • 连接池管理:复用TCP连接,减少握手开销。
  • 异步处理:使用NIO/AIO避免阻塞。
  • 负载均衡:分发请求到多台服务器(如Nginx)。
  • 缓存机制:Redis缓存热点数据。
  • CDN加速:静态资源就近访问。

16. 长连接与短连接的选择依据

  • 长连接:实时性要求高(如直播、游戏),减少频繁握手开销。
  • 短连接:偶发性请求(如网页浏览),避免资源占用。
http://www.dtcms.com/a/358721.html

相关文章:

  • 通过jar -jar启动jar包的yml配置logback 指定log目录
  • 2025-08-18面试题关于公司
  • 【计算机视觉】Pixel逐像素分类Mask掩码分类理解摘要
  • Git 远程仓库操作:推送到远程仓库、拉取远程仓库到本地仓库
  • C语言 - 输出参数详解:从简单示例到 alloc_chrdev_region
  • AV1编码资源可用性模式
  • DC-HRNet
  • SQL学习记录
  • 键查跑分、比配置的手机性能排行
  • ThingsBoard使用Vue3实现
  • nacos 2.5.1 心跳源码解析
  • MCP进阶指南:如何挑选最适合你的AI助手“装备“
  • 计算机毕业设计 java 在线学习系统 基于 Java 的在线教育平台 Java 开发的学习管理系统
  • Fourier 级数展开(案例:级数展开 AND 求和)
  • 仓颉编程语言青少年基础教程:程序基本结构和语言特点
  • Day31 进程间通信(IPC)多线程目录扫描
  • mysql(自写)
  • 谈物质的运动与运动的物质
  • 基于立创・庐山派 K230CanMV 开发板的视觉引导舵机追踪系统技术分析
  • kafka(自写)
  • 【MYSQL】GET_LOCK使用方法简单解析
  • C++_静态多态、运行多态和模板多态
  • 下一代 AI 交互革命:自然语言对话之外,“意念控制” 离商用还有多远?
  • AWD相关知识
  • Scikit-learn Python机器学习 - 数据集介绍
  • 矿物类型分类实战:从数据预处理到多模型对比
  • 幻觉与模仿:深入剖析当前大语言模型为何未能跨越“理解”与“推理”的鸿沟
  • TuringComplete游戏攻略(2.1算数运算)
  • 基础的汇编指令
  • 如何快速了解项目管理基础