菜单

网络与通信

相关源文件

目的与范围

本文全面概述了后端系统架构中至关重要的网络和通信技术。内容涵盖了构建可扩展和高效分布式系统所需的基础协议、编程模型、连接管理策略、序列化方法和网络框架。有关利用这些技术的具体中间件组件的信息,请参阅中间件

网络协议栈

所有网络通信的基础都依赖于分层协议栈,它通过标准化接口使各种应用程序能够相互通信。

OSI 和 TCP/IP 协议模型

OSI(开放系统互连)模型提供了七层的概念框架,而 TCP/IP 模型将其精简为四个实用层。大多数后端开发都集中在这些模型的上层。

来源: README.md1285-1286

核心互联网协议

TCP/IP

TCP(传输控制协议)是面向连接的,通过以下机制提供可靠、有序和错误检查的数据传输:

  • 用于建立连接的三次握手
  • 用于排序的序列号和确认
  • 用于错误检测的校验和
  • 流量控制和拥塞控制
  • 用于终止连接的四次握手

来源: README.md1288-1289

HTTP 和 HTTP/2

HTTP(超文本传输协议)在应用层运行于 TCP 之上。主要特点包括:

HTTP/1.1HTTP/2
基于文本的协议二进制分帧层
队头阻塞多路复用
顺序处理并行请求
头部重复头部压缩 (HPACK)
客户端拉取模型服务器推送能力

HTTP/2 通过以下方式克服了 HTTP/1.1 的许多限制:

  • 二进制帧以实现高效解析
  • 通过单个连接多路复用多个请求
  • 流优先级
  • 头部压缩以减少开销

来源: README.md1292-1293 README.md1294-1299

HTTPS

HTTPS(超文本传输安全协议)使用 TLS/SSL 为 HTTP 增加了安全层。其实现涉及:

  1. 用于安全密钥交换的非对称加密
  2. 用于数据传输的对称加密
  3. 证书颁发机构验证服务器身份

HTTPS 确保数据在传输过程中的安全,防止窃听、数据篡改和中间人攻击。

来源: README.md1300-1304 README.md1305-1306

网络编程模型

网络编程模型定义了应用程序如何处理并发连接和 I/O 操作,直接影响系统性能和可扩展性。

I/O 模型

五种具有不同性能特点的主要 I/O 模型

  1. 阻塞 I/O:进程在 I/O 完成前被阻塞
  2. 非阻塞 I/O:立即返回数据或指示“会阻塞”的错误
  3. I/O 多路复用:监视多个文件描述符,直到其中一个准备就绪才阻塞
  4. 信号驱动 I/O:使用信号在 I/O 可用时通知
  5. 异步 I/O:在整个操作完成后通知完成

前四种模型在数据复制阶段是同步的,只有异步 I/O 是完全非阻塞的。

来源: README.md1310-1312

多路复用技术

技术特性局限性
select使用文件描述符的位掩码限制为 1024 个文件描述符(x64 上为 2048),O(n) 扫描
poll使用链表结构没有文件描述符数量限制,仍然是 O(n) 扫描
epoll使用红黑树和回调O(1) 就绪文件检测,性能一致
kqueueBSD/macOS 上等同于 epoll与 BSD 系统上的 epoll 类似

Epoll 和 kqueue 通过避免每次操作都扫描完整的描述符集,在多连接场景下提供了显著更好的性能。

来源: README.md1313-1321 README.md1330-1333 README.md1338-1339

Java NIO 和 Reactor 模式

Java NIO (New I/O) 通过以下方式提供非阻塞 I/O 能力:

  • 通道 (Channels):双向数据连接
  • 缓冲区 (Buffers):数据传输的容器
  • 选择器 (Selectors):用于监视多个通道的多路复用组件

Netty 等框架实现的 Reactor 模式,利用这种架构以更少的线程高效处理大量并发连接。

来源: README.md1323-1324 README.md1334-1336 README.md1346-1350

连接管理

长连接与短连接

长连接在客户端和服务器之间保持持久连接,减少了握手开销,但需要适当管理以防止资源耗尽。

来源: README.md1342-1343

零拷贝技术

零拷贝是一种优化技术,它消除了内核空间和用户空间之间不必要的数据复制,显著提高了 I/O 性能

  1. 传统 I/O:

    • 数据从磁盘复制到内核缓冲区
    • 数据从内核缓冲区复制到用户缓冲区
    • 数据从用户缓冲区复制到套接字缓冲区
    • 数据从套接字缓冲区传输到网络接口
  2. 零拷贝 I/O:

    • 数据从磁盘复制到内核缓冲区
    • 缓冲区引用直接与网络接口共享

Netty 通过其 ByteBuf 设计实现零拷贝,在不复制数据的情况下逻辑地连接物理上独立的缓冲区。

来源: README.md1351-1353

网络框架和库

Netty 架构

Netty 是一个基于 Java NIO 构建的高性能异步事件驱动网络应用框架。它实现了 Reactor 模式以实现高效的网络处理。

Netty 的主要优势

  • 用于各种传输类型(NIO、OIO 等)的统一 API
  • 内置对各种协议的编解码器支持
  • 高度可定制的线程模型
  • 设计良好的缓冲区实现,具备零拷贝能力

来源: README.md1347-1350

序列化和通信格式

序列化对于将内存中的对象转换为可在网络上传输的格式并进行反序列化至关重要。

二进制协议

Protobuf

Protocol Buffers (Protobuf) 是 Google 开发的一种语言无关、平台无关、可扩展的结构化数据序列化机制

  • 需要 .proto 文件中的 schema 定义
  • 为多种语言生成代码
  • 比 XML/JSON 小得多且速度更快
  • 通过 required/optional 字段提供内置版本控制支持

Hessian

Hessian 是一种二进制 Web 服务协议

  • 紧凑的二进制序列化
  • 无需接口定义文件
  • 跨语言支持
  • 用于 Dubbo 等 RPC 框架

来源: README.md1355-1359 README.md1361-1368

RPC(远程过程调用)框架

RPC 框架基于网络协议和序列化格式,为服务间通信提供更高级别的抽象。

gRPC

gRPC 是 Google 开发的高性能 RPC 框架

  • 使用 Protocol Buffers 进行接口定义和序列化
  • 支持 HTTP/2 进行传输,实现双向流式传输
  • 提供内置的认证和 TLS 支持
  • 支持多种编程语言

Thrift

Apache Thrift,最初由 Facebook 开发

  • 使用其自己的接口定义语言 (IDL)
  • 支持多种序列化格式
  • 与各种传输协议协同工作
  • 为多种语言生成客户端/服务器代码

Dubbo

阿里巴巴的 Dubbo 是一个基于 Java 的 RPC 框架

  • 集成服务注册与发现
  • 支持多种序列化选项
  • 提供负载均衡、路由和容错能力
  • 使用 Netty 进行高性能网络通信

来源: README.md1213-1216 README.md1218-1223 README.md1225-1228 README.md1230-1236

高级网络架构模式

现代后端系统采用各种网络架构模式以实现可扩展性、性能和可靠性。

API 网关模式

API 网关作为客户端应用程序的入口点,处理横切关注点:

  • 请求路由
  • 身份验证和授权
  • 速率限制和流量控制
  • 协议转换
  • 请求/响应转换
  • 监控和分析

这种模式集中了边缘功能,简化了客户端与后端服务的集成。

来源: README.md1267-1275

网络安全考量

网络安全是后端架构的关键方面,需要通过多层安全实现深度防御。

来源: README.md1225-1236 README.md1300-1306 README.md1585-1587

网络性能考量

网络性能直接影响应用程序的响应速度和吞吐量。关键优化领域包括:

领域技术
连接管理连接池、keep-alive 设置
数据传输压缩、批量处理、分块传输
协议选择HTTP/2 vs. HTTP/1.1、WebSockets vs. 轮询
内容交付CDN 集成、地理分布
缓存响应缓存、缓存控制头部
后端通信高效序列化、服务同地部署

监控网络性能指标(延迟、吞吐量、错误率)对于识别瓶颈和验证优化至关重要。

来源: README.md1487-1492

总结

网络和通信构成了分布式后端系统的基础。理解整个技术栈——从低层协议到高层架构模式——使架构师能够设计出可扩展、高性能和有弹性的系统。本文涵盖的技术和方法提供了一套全面的工具包,用于实现系统组件之间的高效通信。