概述

支持的功能

网络 IP 协议栈采用模块化设计,可通过构建时配置选项进行高度配置。只启用应用所需的网络功能即可将系统内存占用降至最低。几乎所有功能都可以按需禁用。

  • 支持 IPv6 (RFC 8200)。可根据网络需求启用或禁用各种 IPv6 子选项。

    • 开发者可以设置同时处于活动状态的单播和组播 IPv6 地址数量。

    • 设备的 IPv6 地址可以静态设置,也可以使用 SLAAC(无状态地址自动配置,RFC 4862)动态设置。

    • 系统还支持多个 IPv6 前缀,最大 IPv6 前缀数量可在构建时配置。

    • 如果不需要,可以禁用 IPv6 邻居缓存,其大小也可在构建时配置。

    • 默认启用 IPv6 邻居发现支持(RFC 4861)。

    • 默认启用组播监听者发现第 2 版支持(RFC 3810)。

    • 对于 IEEE 802.15.4 网络,可以使用 IPv6 报头压缩(6lo)提供 IPv6 连接(RFC 4944)。

    • 支持 DHCPv6(Dynamic Host Configuration Protocol for IPv6)客户端功能(RFC 8415)。

    • 支持 IPv6 隐私扩展(RFC 8981)。

  • 支持 IPv4 (RFC 791)。IEEE 802.15.4 无法使用 IPv4,因为该网络技术仅支持 IPv6。例如,IPv4 可用于基于以太网、Wi-Fi 和蜂窝网络的网络。

    • 支持 DHCP(Dynamic Host Configuration Protocol)客户端和服务器(RFC 2131)。

    • 也可以手动配置 IPv4 地址。默认支持静态 IPv4 地址。

    • 支持 IPv4 NAT(Network Address Translation)。通过执行 SNAT 和 DNAT,数据包可以在接口之间跳转。使用连接跟踪和 iptable 规则跨子网过滤和转发数据包。

  • 双栈支持。 网络协议栈允许开发者将系统配置为同时使用 IPv6 和 IPv4。

  • 支持 UDP (User Datagram Protocol,RFC 768)。开发者可以发送 UDP 数据报(客户端支持),也可以创建监听器接收发往特定端口的 UDP 数据包(服务器端支持)。

  • 支持 TCP (Transmission Control Protocol,RFC 793)。应用可以同时充当服务器和客户端角色。可供应用使用的 TCP socket 数量可在构建时配置。可通过 CONFIG_NET_TCP_SACK 对接收的数据启用选择性确认(RFC 2018)。

  • BSD Sockets API 已实现 BSD socket 兼容 API 的一个子集。同时支持阻塞和非阻塞的数据报(UDP)及流式(TCP)socket。还支持数据包 socket(AF_PACKET)。

  • Secure Sockets API 针对 sockets API 的 TLS/DTLS 安全协议及配置选项提供实验性支持。实现所用的安全函数由 Mbed TLS 库提供。

  • 支持 MQTT (Message Queue Telemetry Transport,ISO/IEC PRF 20922)3.1.1 和 5.0 版本。提供了适用于 MQTT v3.1.1 和 v5.0 的示例客户端应用 MQTT publisher。

  • 支持 MQTT-SN (MQTT for Sensor Networks)1.2 版本。提供了示例客户端应用 MQTT-SN publisher。

  • 支持 CoAP (Constrained Application Protocol,RFC 7252)。提供了 CoAP client 和 CoAP service 两个示例应用。

  • LwM2M 通过“Bootstrap”、“Client Registration”、“Device Management & Service Enablement”和“Information Reporting”接口支持 OMA Lightweight Machine-to-Machine Protocol(LwM2M specification 1.0.2)。系统实现了所需的核心 LwM2M 对象以及若干 IPSO 智能对象。使用 Kconfig 选项启用后,还可以类似方式支持 LwM2M specification 1.1.1。示例 LwM2M client 演示了该库的用法。

  • HTTP 支持 Hypertext Transfer Protocol 客户端和服务器。HTTP 客户端 库支持 HTTP/1.1(RFC 2616)。HTTP 服务器 库支持 HTTP/1.1(RFC 2616)和 HTTP/2(RFC 9113)。提供了 HTTP Client 和 HTTP Server 示例。

  • 支持 Websocket 客户端(RFC 6455)。提供了 WebSocket Client 示例。

  • 支持 DNS Domain Name Service 客户端功能(RFC 1035)。应用可以使用 DNS API 向 DNS 服务器查询域名信息或 IP 地址。可查询 IPv4(A)和 IPv6(AAAA)记录。同时支持多播 DNS(mDNS,RFC 6762)和链路本地多播名称解析(LLMNR,RFC 4795)。还支持 DNS 服务发现(RFC 6763)。

  • 网络管理 API。 应用可以使用网络管理 API 监听核心网络协议栈生成的管理事件,例如为设备添加 IP 地址或网络接口启动等。

  • Wi-Fi 管理 API。 应用可以使用 Wi-Fi 管理 API 管理接口,例如连接到 Wi-Fi 网络以及扫描可用的 Wi-Fi 网络。

  • Wi-Fi 网络管理器 API。 Wi-Fi 网络管理器可以向 Wi-Fi 协议栈注册自身,随后实现 Wi-Fi 管理 API 并管理 Wi-Fi 接口。

  • 多种网络技术。 只需在 Kconfig 中启用相应选项,即可将 Zephyr OS 配置为同时支持多种网络技术:例如以太网、Wi-Fi 和 802.15.4。请注意,这些技术之间不提供自动 IP 路由功能。应用可以根据自身需求将数据发送到指定的网络接口。

  • 最小复制网络缓冲区管理。 可以采用最小复制的网络数据路径,即系统在将应用数据发送到网络时尽量避免复制数据。

  • 虚拟 LAN 支持。 虚拟 LAN(VLAN)允许将以太网物理网络划分为多个逻辑网络。更多详情见 VLAN 支持。

  • 网络流量分类。 可以根据应用需求对发送和接收的网络数据包划分优先级。更多详情见 流量分类。

  • 时间敏感网络。 同时支持 gPTP(generalized Precision Time Protocol)和 PTP(Precision Time Protocol,IEEE 1588)。更多详情见 gPTP 支持 和 PTP 支持。

  • 支持 SNTP Simple Network Time Protocol 客户端(RFC 5905)。提供了 SNTP client 示例。

  • 支持 SOCKS5 代理第 5 版(RFC 1928)。

  • 支持 TFTP Trivial File Transfer Protocol 客户端(RFC 1350)。提供了 TFTP client 示例。

  • 支持 MIDI2 MIDI 2.0 网络 UDP 传输。提供了 MIDI2 network transport 示例。

  • 支持 OCPP Open Charge Point Protocol。提供了 OCPP charge point 示例。

  • 支持 Prometheus 指标服务器功能。提供了 Prometheus Sample。

  • 网络 shell。 网络 shell 提供了用于了解网络状态、启用/禁用功能以及执行 ping、DNS 解析等命令的辅助工具。开发网络软件时,net-shell 非常有用。更多详情见 网络 shell。

  • zperf 是一款 iPerf v2 网络性能和带宽测量工具。同时支持客户端和服务器功能。提供了 zperf: Network Traffic Generator 示例。

此外,Zephyr OS 还支持以下网络技术(链路层):

  • IEEE 802.15.4

  • 蓝牙

  • 以太网,IEEE 802.3

  • Wi-Fi,IEEE 802.11

  • 蜂窝网络 / PPP(RFC 1661)

  • Thread(提供了 OpenThread 示例)

  • 用于 SocketCAN 的 CAN 总线

  • SLIP(串行线路上的 IP)。用于在 QEMU 中测试。它为主机系统(如 Linux)提供以太网接口,测试应用可以在 Linux 主机上运行并向 Zephyr OS 设备发送网络数据。

源码树布局

网络协议栈的源码树组织如下:

subsys/net/

这里存放各种可选的网络协议栈组件,如连接管理器、数据包过滤代码和主机名处理。

subsys/net/ip/

这里存放核心网络协议栈代码。

subsys/net/l2

这里存放 IP 协议栈第 2 层代码,包括对以太网、IEEE 802.15.4 和 Wi-Fi 的通用支持。

subsys/net/lib/

应用层协议(DNS、MQTT 等)以及其他协议栈组件(BSD Sockets 等)。

include/zephyr/net/

公共 API 头文件。应用需要包含这些头文件才能使用 IP 网络功能。

samples/net/

网络示例代码。这是入门网络应用开发的良好参考。

tests/net/

测试应用。这些应用用于验证 IP 协议栈的功能,但不是示例代码的最佳来源(请参见 samples/net/)。