🌐 网络协议完全指南:从HTTP长短连接到TCP-UDP的深度对话

本文采用对话形式,通过小李和小王的问答,深入浅出地讲解网络协议、长短连接等核心概念,帮助读者建立完整的网络知识体系。

引言

在Java后端开发中,网络通信是绕不开的话题。无论是HTTP接口调用、数据库连接,还是微服务间的通信,都离不开网络协议的支持。今天,让我们跟随小李和小王的对话,一起深入理解网络协议的核心概念。


一、HTTP是长连接还是短连接?

小李:今天有个同事说HTTP是长连接,但是我印象中HTTP是短连接,每次HTTP接口从请求到响应完就算完事了,下一次请求又是一次连接,难道我理解的不对么?

小王:哈哈,这个问题问得很好!你的理解基本是正确的,但需要补充一些细节。

HTTP/1.0 确实是短连接,每次请求都会建立新的TCP连接,请求完成后立即关闭连接。这就像每次打电话都是重新拨号一样。

但是到了 HTTP/1.1,引入了 Connection: keep-alive 机制,可以在一个TCP连接上发送多个HTTP请求,这就是所谓的"HTTP长连接"。

不过要注意的是,这里的"长连接"是相对的概念:

  • HTTP的长连接是基于TCP连接的复用
  • 连接的生命周期仍然由HTTP协议控制
  • 服务器可能会设置超时时间,超时后关闭连接

小李:那HTTP/2呢?

小王:HTTP/2更进一步,引入了 多路复用(Multiplexing) 机制,可以在一个TCP连接上同时处理多个HTTP请求和响应,大大提高了效率。

所以总结一下:

  • HTTP/1.0:短连接
  • HTTP/1.1:支持长连接(keep-alive)
  • HTTP/2:真正的长连接 + 多路复用

二、JDBC、CMPP、WebSocket与HTTP的区别

小李:我知道JDBC连接、CMPP连接、WebSocket等是长连接,这个很直观,他们与HTTP有啥区别呢?

小王:很好的问题!这些确实都是长连接,但它们的应用场景和实现机制不同:

1. JDBC连接

// JDBC连接池示例
@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource() {HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/test");config.setUsername("root");config.setPassword("password");config.setMaximumPoolSize(20); // 连接池大小config.setMinimumIdle(5);      // 最小空闲连接return new HikariDataSource(config);}
}

特点

  • 基于TCP连接
  • 连接池管理,复用连接
  • 支持事务处理
  • 连接生命周期较长(分钟到小时级别)

2. CMPP连接(短信网关协议)

// CMPP连接示例
public class CMPPClient {private Socket socket;private DataInputStream in;private DataOutputStream out;public void connect() throws IOException {socket = new Socket("sms.gateway.com", 7890);in = new DataInputStream(socket.getInputStream());out = new DataOutputStream(socket.getOutputStream());// 发送登录请求sendLoginRequest();}
}

特点

  • 基于TCP长连接
  • 专门用于短信业务
  • 需要心跳保活
  • 连接稳定性要求高

3. WebSocket连接

// WebSocket客户端示例
const ws = new WebSocket('ws://localhost:8080/websocket');
ws.onopen = function() {console.log('连接已建立');
};
ws.onmessage = function(event) {console.log('收到消息:', event.data);
};

特点

  • 基于HTTP升级协议
  • 全双工通信
  • 实时性好
  • 适合聊天、推送等场景

4. 与HTTP的区别对比

特性HTTPJDBCCMPPWebSocket
协议层应用层应用层应用层应用层
底层传输TCPTCPTCPTCP
连接方式请求-响应长连接长连接长连接
通信模式单向双向双向全双工
适用场景Web服务数据库操作短信服务实时通信

三、HTTP请求的完整生命周期

小李:在Web开发中,HTTP接口开发很常见,平时我可能只关注业务逻辑了,你能给我详细说说,从发起请求到得到响应的详细过程么,客户端和服务端在此过程都做了什么?

小王:好的!让我用一个具体的例子来说明HTTP请求的完整生命周期。

场景:用户访问 http://www.example.com/api/users

1. DNS解析阶段
客户端 → DNS服务器:查询 www.example.com 的IP地址
DNS服务器 → 客户端:返回 192.168.1.100
2. TCP连接建立(三次握手)
客户端 → 服务器:SYN=1, seq=x
服务器 → 客户端:SYN=1, ACK=1, seq=y, ack=x+1
客户端 → 服务器:ACK=1, seq=x+1, ack=y+1
3. HTTP请求发送
GET /api/users HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Connection: keep-alive
4. 服务器处理流程
@RestController
public class UserController {@GetMapping("/api/users")public ResponseEntity<List<User>> getUsers() {// 1. 接收HTTP请求// 2. 解析请求参数// 3. 业务逻辑处理List<User> users = userService.findAll();// 4. 构建响应return ResponseEntity.ok(users);}
}
5. HTTP响应返回
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1234
Connection: keep-alive[{"id": 1, "name": "张三", "email": "zhangsan@example.com"},{"id": 2, "name": "李四", "email": "lisi@example.com"}
]
6. 连接处理
  • HTTP/1.0:立即关闭TCP连接
  • HTTP/1.1:保持连接(keep-alive),等待下一个请求
  • HTTP/2:复用连接,可以同时处理多个请求

完整的时序图

客户端 DNS服务器 Web服务器 应用服务器 数据库 1. 查询域名IP 2. 返回IP地址 3. TCP三次握手 4. 握手完成 5. 发送HTTP请求 6. 转发请求到应用 7. 查询数据库 8. 返回数据 9. 返回处理结果 10. 发送HTTP响应 11. 根据协议决定是否关闭连接 客户端 DNS服务器 Web服务器 应用服务器 数据库

四、超时时间的区别

小李:还有我了解到一个超时时间概念,长连接的超时时间和接口超时时间有啥关系?

小王:这是个很实用的问题!超时时间确实有多个层次,容易混淆。

1. 不同层次的超时时间

HTTP接口超时时间
// RestTemplate配置超时
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();factory.setConnectTimeout(5000);    // 连接超时:5秒factory.setReadTimeout(10000);      // 读取超时:10秒return new RestTemplate(factory);}
}
TCP连接超时时间
// JDBC连接池超时配置
@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource() {HikariConfig config = new HikariConfig();config.setConnectionTimeout(30000);     // 连接超时:30秒config.setIdleTimeout(600000);          // 空闲超时:10分钟config.setMaxLifetime(1800000);         // 最大生命周期:30分钟return new HikariDataSource(config);}
}

2. 超时时间的层次关系

应用层超时(HTTP接口超时)↓
传输层超时(TCP连接超时)↓
网络层超时(IP包超时)

3. 实际案例分析

场景:调用一个HTTP接口,设置超时时间为10秒

// 可能的情况分析
try {ResponseEntity<String> response = restTemplate.getForEntity("http://api.example.com/data", String.class);// 成功处理
} catch (ResourceAccessException e) {// 可能的超时原因:// 1. DNS解析超时// 2. TCP连接建立超时// 3. HTTP请求发送超时// 4. 服务器处理超时// 5. HTTP响应接收超时
}

4. 超时时间的最佳实践

// 不同场景的超时配置建议
public class TimeoutConfig {// 内部服务调用(局域网)public static final int INTERNAL_SERVICE_TIMEOUT = 5000;  // 5秒// 外部API调用(互联网)public static final int EXTERNAL_API_TIMEOUT = 15000;     // 15秒// 数据库操作public static final int DATABASE_TIMEOUT = 30000;         // 30秒// 文件上传下载public static final int FILE_TRANSFER_TIMEOUT = 300000;   // 5分钟
}

五、网络协议体系详解

小李:我觉得不论是HTTP,还是JDBC、CMPP,都属于网络协议中的一些吧,给我详细说说网络协议吧,网络分层,HTTP、TCP、UDP的关系啥的。

小王:非常好的问题!网络协议确实是一个完整的体系,让我用一张图来帮你理解。

1. OSI七层模型 vs TCP/IP四层模型

OSI七层模型                    TCP/IP四层模型
┌─────────────────┐           ┌─────────────────┐
│   应用层        │           │   应用层        │ ← HTTP、FTP、SMTP、JDBC
├─────────────────┤           ├─────────────────┤
│   表示层        │           │   传输层        │ ← TCP、UDP
├─────────────────┤           ├─────────────────┤
│   会话层        │           │   网络层        │ ← IP、ICMP
├─────────────────┤           ├─────────────────┤
│   传输层        │           │   网络接口层    │ ← 以太网、WiFi
├─────────────────┤           └─────────────────┘
│   网络层        │
├─────────────────┤
│   数据链路层    │
├─────────────────┤
│   物理层        │
└─────────────────┘

2. 各层协议详解

应用层协议
// HTTP协议示例
@RestController
public class ApiController {@GetMapping("/api/data")public ResponseEntity<Map<String, Object>> getData() {Map<String, Object> response = new HashMap<>();response.put("status", "success");response.put("data", "Hello World");return ResponseEntity.ok(response);}
}
传输层协议对比
特性TCPUDP
连接方式面向连接无连接
可靠性可靠传输不可靠传输
顺序性保证顺序不保证顺序
流量控制
拥塞控制
应用场景HTTP、FTP、SMTPDNS、DHCP、视频流
网络层协议
// IP地址处理示例
public class NetworkUtils {public static boolean isValidIP(String ip) {try {InetAddress.getByName(ip);return true;} catch (UnknownHostException e) {return false;}}public static String getLocalIP() {try {return InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {return "127.0.0.1";}}
}

3. 协议栈中的数据封装

应用数据↓
HTTP头部 + 应用数据↓
TCP头部 + HTTP头部 + 应用数据↓
IP头部 + TCP头部 + HTTP头部 + 应用数据↓
以太网头部 + IP头部 + TCP头部 + HTTP头部 + 应用数据

4. 实际网络抓包分析

# 使用Wireshark或tcpdump抓包
tcpdump -i eth0 -w capture.pcap port 80

抓包结果示例:

Frame 1: 74 bytes on wire (592 bits)
Ethernet II, Src: 00:11:22:33:44:55, Dst: aa:bb:cc:dd:ee:ff
Internet Protocol Version 4, Src: 192.168.1.100, Dst: 93.184.216.34
Transmission Control Protocol, Src Port: 54321, Dst Port: 80
Hypertext Transfer ProtocolGET /api/users HTTP/1.1\r\nHost: example.com\r\nUser-Agent: Mozilla/5.0\r\n\r\n

5. 网络协议在Java中的应用

// 使用Socket进行TCP通信
public class TCPServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);System.out.println("服务器启动,监听端口8080");while (true) {Socket clientSocket = serverSocket.accept();new Thread(() -> handleClient(clientSocket)).start();}}private static void handleClient(Socket clientSocket) {try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("收到: " + inputLine);out.println("服务器回复: " + inputLine);}} catch (IOException e) {e.printStackTrace();}}
}

6. 各种协议的网络分层归属

小李:HTTP、JDBC、CMPP、Dubbo、WebSocket、WebService等调用属于网络哪一层呢?

小王:很好的问题!这些协议确实都属于应用层,但它们在实现细节上有所不同。让我详细解释一下:

应用层协议分类
应用层协议栈
┌─────────────────────────────────────────────────────────┐
│                    应用层 (Application Layer)            │
├─────────────────────────────────────────────────────────┤
│ HTTP/HTTPS    │ WebSocket │ WebService │ Dubbo │ JDBC   │
│ REST API      │           │ SOAP       │ RPC   │ CMPP   │
│ JSON/XML      │           │ WSDL       │       │        │
└─────────────────────────────────────────────────────────┘
各协议详细分析

1. HTTP/HTTPS

// HTTP属于应用层,基于TCP传输
@RestController
public class HttpController {@GetMapping("/api/data")public ResponseEntity<String> getData() {return ResponseEntity.ok("HTTP响应");}
}
  • 网络层:应用层
  • 传输层:TCP(端口80/443)
  • 特点:请求-响应模式,无状态

2. WebSocket

// WebSocket基于HTTP升级,但建立后是独立的协议
@ServerEndpoint("/websocket")
public class WebSocketServer {@OnOpenpublic void onOpen(Session session) {System.out.println("WebSocket连接建立");}@OnMessagepublic void onMessage(String message, Session session) {// 全双工通信session.getAsyncRemote().sendText("收到消息: " + message);}
}
  • 网络层:应用层
  • 传输层:TCP(端口80/443,通过HTTP升级)
  • 特点:全双工通信,有状态

3. WebService (SOAP)

// WebService使用SOAP协议,基于XML
@WebService
public class UserService {@WebMethodpublic User getUserById(int id) {return new User(id, "张三", "zhangsan@example.com");}
}
  • 网络层:应用层
  • 传输层:HTTP/TCP 或 SMTP/TCP
  • 特点:基于XML的RPC,跨平台

4. Dubbo

// Dubbo是阿里巴巴的RPC框架
@Service
public class UserServiceImpl implements UserService {@Overridepublic User getUserById(int id) {return new User(id, "李四", "lisi@example.com");}
}
  • 网络层:应用层
  • 传输层:TCP(默认端口20880)
  • 特点:高性能RPC,支持多种序列化

5. JDBC

// JDBC是数据库连接标准
public class DatabaseConnection {public Connection getConnection() throws SQLException {return DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root", "password");}
}
  • 网络层:应用层
  • 传输层:TCP(MySQL默认3306)
  • 特点:数据库访问标准,支持事务

6. CMPP

// CMPP是短信网关协议
public class CMPPClient {private Socket socket;public void connect() throws IOException {socket = new Socket("sms.gateway.com", 7890);// 发送CMPP登录请求sendLoginRequest();}
}
  • 网络层:应用层
  • 传输层:TCP(端口7890)
  • 特点:短信业务专用协议
协议对比总结
协议网络层传输层端口特点应用场景
HTTP应用层TCP80/443请求-响应,无状态Web服务
WebSocket应用层TCP80/443全双工,有状态实时通信
WebService应用层HTTP/TCP80/443XML-RPC,跨平台企业集成
Dubbo应用层TCP20880高性能RPC微服务
JDBC应用层TCP3306/5432数据库访问数据持久化
CMPP应用层TCP7890短信网关短信服务
实际开发中的选择
// 不同场景的协议选择
public class ProtocolSelector {// Web前端调用后端APIpublic void webApiCall() {// 选择:HTTP REST APIRestTemplate restTemplate = new RestTemplate();ResponseEntity<String> response = restTemplate.getForEntity("http://api.example.com/users", String.class);}// 微服务间调用public void microserviceCall() {// 选择:Dubbo RPC@Referenceprivate UserService userService;User user = userService.getUserById(1);}// 实时通信public void realtimeCommunication() {// 选择:WebSocketWebSocket webSocket = new WebSocket("ws://localhost:8080/ws");}// 数据库操作public void databaseOperation() {// 选择:JDBCConnection conn = DriverManager.getConnection(url, user, password);}
}

小李:那这些协议都是应用层的,它们之间有什么区别呢?

小王:虽然都在应用层,但它们的设计目标和实现方式不同:

  1. HTTP:通用Web协议,适合浏览器-服务器通信
  2. WebSocket:实时双向通信,适合聊天、推送
  3. WebService:企业级集成,适合异构系统
  4. Dubbo:高性能RPC,适合微服务架构
  5. JDBC:数据库访问标准,专注数据操作
  6. CMPP:行业专用协议,专注短信业务

选择哪个协议,主要看你的具体需求和应用场景!


六、实际开发中的最佳实践

1. HTTP客户端配置

@Configuration
public class HttpClientConfig {@Beanpublic HttpClient httpClient() {return HttpClients.custom().setConnectionManager(createConnectionManager()).setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)).build();}private PoolingHttpClientConnectionManager createConnectionManager() {PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager();manager.setMaxTotal(200);                    // 最大连接数manager.setDefaultMaxPerRoute(20);           // 每个路由最大连接数manager.setValidateAfterInactivity(30000);   // 空闲连接验证间隔return manager;}
}

2. 数据库连接池配置

@Configuration
public class DatabaseConfig {@Bean@Primarypublic DataSource primaryDataSource() {HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/primary");config.setUsername("root");config.setPassword("password");// 连接池配置config.setMaximumPoolSize(20);config.setMinimumIdle(5);config.setConnectionTimeout(30000);config.setIdleTimeout(600000);config.setMaxLifetime(1800000);// 连接测试config.setConnectionTestQuery("SELECT 1");config.setValidationTimeout(5000);return new HikariDataSource(config);}
}

3. 网络监控和诊断

@Component
public class NetworkMonitor {private static final Logger logger = LoggerFactory.getLogger(NetworkMonitor.class);public void monitorConnection(String host, int port) {try (Socket socket = new Socket()) {long startTime = System.currentTimeMillis();socket.connect(new InetSocketAddress(host, port), 5000);long endTime = System.currentTimeMillis();logger.info("连接 {}:{} 成功,耗时: {}ms", host, port, endTime - startTime);} catch (IOException e) {logger.error("连接 {}:{} 失败: {}", host, port, e.getMessage());}}public void pingHost(String host) {try {InetAddress address = InetAddress.getByName(host);boolean reachable = address.isReachable(5000);logger.info("主机 {} 可达性: {}", host, reachable);} catch (IOException e) {logger.error("ping主机 {} 失败: {}", host, e.getMessage());}}
}

总结

通过今天的对话,我们深入了解了:

  1. HTTP协议的发展:从HTTP/1.0的短连接到HTTP/2的多路复用
  2. 不同类型的长连接:JDBC、CMPP、WebSocket各有特点
  3. HTTP请求的完整生命周期:从DNS解析到响应返回的全过程
  4. 超时时间的层次关系:应用层、传输层、网络层的超时机制
  5. 网络协议体系:OSI七层模型和TCP/IP四层模型的关系

在实际开发中,理解这些网络概念对于:

  • 性能优化
  • 问题排查
  • 架构设计
  • 系统监控

都非常重要。希望今天的对话能帮助你建立完整的网络知识体系!


小李:谢谢小王,今天学到了很多!网络协议确实是一个很深的领域,但通过你的讲解,我感觉清晰多了。

小王:不客气!网络协议确实是后端开发的基础,理解好这些概念,对日常开发和技术选型都很有帮助。如果以后遇到网络相关的问题,随时可以找我讨论!


本文采用对话形式,通过实际案例和代码示例,帮助读者深入理解网络协议的核心概念。在实际开发中,建议结合具体场景,选择合适的连接方式和超时配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86330.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86330.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86330.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04-StarRocks集群运维FAQ

StarRocks集群运维FAQ 概述 本文档整理了StarRocks集群运维过程中常见的问题和解决方案,涵盖了集群管理、节点维护、监控告警、故障处理等各个方面,帮助运维人员高效管理StarRocks集群。 集群管理FAQ Q1: 如何查看集群状态? A: 集群状态查看方法: 1. 查看FE节点状态 …

通过Prompt提示构建思维链

《DEEPSEEK原生应用与智能体开发实践 王晓华 书籍 图书》【摘要 书评 试读】- 京东图书 思维链技术开启了人工智能通向人类智能的崭新路径。它让模型不再仅仅是机械地执行指令&#xff0c;而是开始具备类似人类的思考方式&#xff0c;能够理解问题的本质&#xff0c;进行深层次…

OpenCV边缘填充方式详解

一、边缘填充概述 在图像处理中&#xff0c;边缘填充&#xff08;Border Padding&#xff09;是一项基础而重要的技术&#xff0c;特别是在进行卷积操作&#xff08;如滤波、边缘检测等&#xff09;时&#xff0c;处理图像边缘像素需要用到周围的像素值。由于图像边缘的像素没…

如何评估RAG系统?全面指标体系

构建一个可靠的 检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统&#xff0c;不仅要关注模型的构建&#xff0c;更重要的是对系统性能进行科学、系统的评估。评估不仅衡量系统的效果&#xff0c;也为迭代优化提供依据。 本文将围绕 RAG 系统的评…

力扣-合并区间

题目 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 解析: 先按开始维度排序&#xff0c;之后依次合并&#xff0c;如果开头 < 当前区间的最后就合并&#xff0c;> 就开辟新区间 代码: class Solution {public int[][] merge(int[][] intervals) {int n in…

【软考高级系统架构论文】论基于构件的软件开发方法及其应用

论文真题 基于构作的 软件开发 (Component-Based Software Development,CBSD) 是一种基于分布对象技术、强调通过可复用构件设计与构造软件系统的软件复用途径。基于构件的软件系统中的构件可以是COTS (Commercial-Off-the-Shelf) 构件,也可以是通过其它途径获得的构件(如自…

recipes的版本比较老如何更新到新版本?

在 Yocto 项目中,当你发现 “meta-openembedded” 层中的某些 recipe 版本太旧,而你想使用更新版本时,最佳实践是在你自己项目的自定义层 (custom layer) 中使用 “bbappend” 文件进行覆盖或升级。 核心思路: 不要直接修改 “meta-openembedded” 层的 recipe ( “*.bb”…

【软件系统架构】系列四:嵌入式软件-NPU(神经网络处理器)系统及模板

目录 一、什么是 NPU? 二、NPU 与 CPU/GPU/DSP 对比 三、NPU 的工作原理 核心结构: 数据流架构: 四、NPU 芯片架构(简化图) 五、NPU 的优势 六、NPU 应用场景 视觉识别 语音识别 自动驾驶 智能监控 AIoT 设备 七、主流 NPU 芯片/架构实例 八、开发者工具生…

【NLP】使用 LangGraph 构建 RAG 的Research Multi-Agent

本文中&#xff0c;我们介绍了一个使用LangGraph开发的RAG的Research Multi-Agent工具的实际项目。该工具旨在解决需要多个来源和迭代步骤才能得出最终答案的复杂问题。它使用混合搜索和rerank步骤来检索文档&#xff0c;还结合了自我纠正机制&#xff0c;包括幻觉检查过程&…

【Docker基础】Docker容器管理:docker restart详解

目录 1 docker restart命令概述 1.1 命令作用 1.2 与相关命令对比 2 命令语法详解 2.1 基础语法 2.2 核心参数说明 3 核心原理深度解析 3.1 信号传递机制 3.2 状态转换 4 典型应用场景 4.1 服务配置更新 4.2 故障恢复流程 5 进阶使用技巧 5.1 组合命令应用 5.2 …

mongoDB服务本地化部署

mongoDB服务本地化部署 前言mongoDB下载选择版本安装 前言 mongoDB数据库解释 MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统&#xff1b;在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能&#xff1b;MongoDB 旨在…

YOLOv10tensorRT推理代码C++

最近实现了YOLOv10的tensorRT推理代码除了后处理部分只适合YOLOv10之外&#xff0c;其余部分基本可以在yolo系列通用~学习记录~。 #include <fstream> #include <iostream> #include <vector> #include <opencv2/opencv.hpp> #include "NvInfer.…

软件定时器详解:RTOS 中的“软时钟”机制与源码解析

在嵌入式实时系统开发中&#xff0c;定时器是不可或缺的工具。软件定时器&#xff08;Software Timer&#xff09; 提供了一种无需创建独立任务、便可在特定延时后执行回调函数的机制。它适用于那些不要求高精度、但需要周期性或一次性延时执行操作的场景。 一、什么是软件定时…

从Yocto中获取源码用传统的方式单独编译

要获取 Yocto 构建后的 Linux 内核和 U-Boot 源码,并进行独立编译,需获取完整的源码树(包含所有应用补丁和配置)及原始配置信息。以下是具体步骤: 获取最终源码路径确定构建目录位置: 内核工作目录 KERNEL_WORKDIR=$(bitbake -e virtual/kernel | grep ^WORKDIR= | cut…

【记录】服务器|常见的八种硬盘接口的简介和清晰的接口图片(2025年6月)

硬盘接口很多&#xff0c;在管服务器的时候总是要买&#xff0c;但是偶尔会忘记自己的服务器支持什么接口&#xff0c;此时就需要看引脚。 如果没插满&#xff0c;就可以直接拍接口的图片&#xff0c;与下面这些图片对照一下【文字介绍是AI直接生成的&#xff0c;图片是我到处…

在一个成熟产品中,如何设计数据库架构以应对客户字段多样化,确保系统的可维护性、可扩展性和高性能。

在SaaS系统、平台型应用或高度可配置的企业级软件中&#xff0c;我们常常会遇到一个现实问题&#xff1a;不同客户对同一个业务表存在差异化字段需求。例如&#xff0c;A客户需要一个“业务员等级”字段&#xff0c;B客户不需要&#xff1b;C客户希望订单表中增加“海外仓编码”…

社群营销应该怎么玩

现在做营销&#xff0c;光靠打广告可不行了。大家都喜欢扎堆儿&#xff0c;找志同道合的人一起玩&#xff0c;这就是社群的力量。那怎么用好这股力量呢&#xff1f;咱们慢慢聊。 首先得明白&#xff0c;社群不是拉个群就完事了。关键是要让大家觉得这里有意思&#xff0c;有收…

【论文阅读笔记】TransparentGS:当高斯溅射学会“看穿”玻璃,如何攻克透明物体重建难题?

文章目录 TransparentGS: Fast Inverse Rendering of Transparent Objects with GaussiansInfoAbstractIntroductionMethod预备知识3D GS的概念不再赘述渲染方程透明高斯Gaussian Light Field Probes多阶段重建实验结果和评估消融实验应用讨论和限制结论TransparentGS: Fast In…

某视频网站运维工程师面试题

某视频网站运维工程师面试题 1、 简单写下Xeon和Itanium这两个产品的本质区别&#xff1f; 2、 ECC内存每Bank的颗粒数是单数还是双数的&#xff1f; 3、 假如有5块1T的硬盘&#xff0c;要求组合成尽量多的实际使用空间并至少容忍坏2盘而不影响raid组工作。请问有几种模式来组…

Java底层原理:深入理解JVM性能调优与监控

一、JVM性能调优概述 JVM性能调优是Java应用优化的重要环节&#xff0c;通过合理配置JVM参数&#xff0c;可以提高Java应用的性能和稳定性。JVM性能调优的主要目标是减少垃圾回收的频率和时间&#xff0c;提高线程的运行效率&#xff0c;优化内存的使用。 &#xff08;一&…