下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。
自 FreeRTOS V10.1.0 开始,FreeRTOS+UDP 已从 (自 FreeRTOS V10.1.0 开始)。请参阅替代方案:FreeRTOS+TCP 堆栈 此堆栈可配置为仅供 UDP 使用的替代方案。

嵌入式 UDP/IP 网络基础


简介

本页旨在简要介绍 UDP/IP 网络的概念与术语,以及它们与 FreeRTOS-Plus-UDP 实现的关系。 本页内容仅为相关主题的概述, 而这些主题本身就是综合性话题。 因此, 特提供外部网页超链接,作为 更深入讨论的参考。

不要被该主题表面的复杂性 所吓倒。 FreeRTOS-Plus-UDP 负责底层 协议。 FreeRTOS-Plus-UDP 用户只需要知道配置选项的含义 以及如何使用 标准伯克利套接字 "like" 接口发送和接收数据。 本网站提供了简单的 示例和 API 引用。

FreeRTOS-Plus-UDP 专为小型嵌入式系统设计。 此类系统 通常通过以太网连接,但这绝非是唯一连接方式。

本页内容(最好按照主题出现的顺序阅读):



UDP 网络

借助 FreeRTOS-Plus-UDP,嵌入式设备可以使用 Internet 协议 (IP) 向远程网络节点发送数据并从其中接收数据。 远程 节点可以位于同一本地网络上,也可以位于 可通过 Internet 访问的远程网络上。

用户数据报协议 (UDP) 数据以无连接数据包的形式发送。 这意味着 UDP 和 IP 协议都无法保证送达。 就像在 RS232 或 RS485 通信中一样, 不能仅仅因为发送数据的节点将数据发送到网络上, 就假定目标接收方收到了数据。 这就是 TCP/IP 与 UDP/IP 的不同之处。 TCP 协议 具有内置的确认和重新传输机制,而 UDP 没有。 因此,需要确认接收的 UDP 数据包必须 由接收应用程序手动确认。

UDP 体积更小、速度更快,更适合快速嵌入式网络通信 (相较 TCP 而言)。


网络寻址

同一网络上的不同节点由其 IP 地址标识。 例如, 您阅读本文所使用的计算机上的每个网络接口 都具有不同的 IP 地址,您的计算机所连接的网络上的每台计算机 也具有不同的 IP 地址。

每个网络节点可以运行多个 使用相同网络接口(因而使用相同 IP 地址)的应用程序。 例如, FreeRTOS 应用程序可以同时运行 TFTP 服务器、回显服务器和 Nabto 客户端, 这些服务器和客户端都使用 UDP/IP 堆栈。 在同一网络节点上运行 并采用同一 IP 地址的不同应用程序均通过端口号标识。

因此,每个 UDP 数据包的源地址和目标地址是 IP 地址和端口号的组合。


套接字

套接字是网络通信的概念性端点。 套接字 可以发送和接收数据。 以下章节将详细讨论 套接字。

API 函数 FreeRTOS_socket() 用于创建套接字。


绑定

每个套接字都需要一个唯一的地址。 如前所述,地址是 IP 地址和端口号的组合。

系统会假定 创建套接字的网络节点的 IP 地址。 如果套接字有 IP 地址但没有端口号,则称为 “未绑定”。 未绑定的套接字无法接收数据,因为 没有完整的地址。

如果套接字同时具有 IP 地址和端口号,则称为 “绑定到端口”或“绑定到地址”。 绑定的套接字 可以接收数据,因为具有完整的地址。

将端口号分配给套接字的过程 称为“绑定”。

API 函数 FreeRTOS_bind() 用于将 FreeRTOS-Plus-UDP 套接字绑定到端口号。

如果 ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND 在 FreeRTOSIPConfig.h 中设置为 0, 则必须使用 FreeRTOS_bind() 将套接字绑定到端口号, 然后套接字才可用于发送或接收数据。 如果 在 FreeRTOSIPConfig. h 中将 ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND 设置为 1, 则未绑定的套接字在首次尝试发送数据时自动绑定到端口号, 但仍然只能在绑定后 接收数据。


客户端和服务器

服务器是等待传入请求、然后予以回复的应用程序。 客户端是向服务器发送请求的应用程序。 在这种情况下, 请求和回复都通过网络进行。

客户端需要定位服务器,最简单的方法是 将服务器绑定到预先商定的地址 (也有其他更复杂的方法)。

服务器无需事先知道客户端的地址, 只需将回复发送到客户端请求的来源地址即可。 因此,客户端(通常)可以绑定到几乎任何端口号, 但 0xC000 到 0xFFFF 这一范围中的高端口号留给 FreeRTOS-Plus-UDP 使用, 而许多低端口号(仅按照惯例) 留给通用网络服务

标准回显服务 提供了一个方便的示例,并且是本网站提供的有效 FreeRTOS-Plus-UDP 演示应用程序的主题 。 回显服务器只回显 客户端向其发送的数据。 按照惯例,回显服务器使用端口 7。 下方 时序图显示在回显客户端和回显服务器上均创建和绑定了套接字, 而且客户端和服务器之间进行了单次回显事务 (请注意,套接字只需创建和绑定一次, 无需每次事务都创建和绑定)。


回显客户端和回显服务器之间的简单事务


静态 IP 地址

请注意,每个网络节点都有一个 IP 地址。 静态 IP 地址为预分配,从不发生变化。

FreeRTOS-Plus-UDP API 函数 FreeRTOS_IPInit() 将默认 IP 地址(以及其他地址)作为其参数之一。 如果 ipconfigUSE_DHCP 设置为 0, 或者如果 ipconfigUSE_DHCP 设置为 1,但无法联系 DHCP 服务器, 则默认 IP 地址用作静态 IP 地址。 请参阅下文 DHCP 描述。


动态主机配置协议 (DHCP)

静态 IP 地址在应用程序开发过程中很有用, 但对于产品部署来说有些不切实际,原因如下:
  • 它们需要在可执行二进制 或外部闪存中进行硬编码。
  • 如果不事先了解产品部署的网络环境,就不能 为产品预先分配 IP 地址。
  • 事先不知道网络上会有多少个节点, 也不知道可能存在的 节点 总数在某一时间的实际活跃节点数。
DHCP 提供了静态 IP 地址分配的替代方案。 DHCP 服务器 存在于本地网络中,为同一网络中的节点动态分配 IP 地址。 启用网络的产品在启动时会联系 DHCP 服务器,请求其 IP 地址,从而无需对每个节点 进行静态配置。

如果 ipconfigUSE_DHCP 在 FreeRTOSIPConfig.h 中设置为 1, 则 FreeRTOS-Plus-UDP 会尝试从 DHCP 服务器获取其 IP 地址, 并且仅在无法联系 DHCP 服务器时 才恢复使用静态 IP 地址。


子网/网络掩码

子网这一主题复杂度处于中等水平,但在编写 FreeRTOS-Plus-UDP应用程序时,可以简单将其视为确定 目标 IP 地址是存在于本地网络还是远程网络的 一种方式。

与 IP 地址一样,子网掩码可以静态配置为 FreeRTOS_IPInit() 的参数,也可以从 DHCP 服务器动态配置。

如果目标 IP 地址和子网掩码进行按位与计算后得到的结果 与本地 IP 地址和子网掩码进行按位与计算后得到的结果相符, 则这两个 IP 地址处于同一网络。


网关和路由器

如果目标 IP 地址和子网掩码进行按位与计算后得到的结果 与本地 IP 地址和子网掩码进行按位与计算后得到的结果相同, 则这两个 IP 地址处于同一网络。 在这种情况下,发送到目标地址的数据包无法直接发送, 而必须发送到网关进行智能 网际路由。

FreeRTOS-Plus-UDP 确定是否可以直接发送 UDP 数据包, 还是需要通过网关进行路由。 FreeRTOS-Plus-UDP 用户只需要 提供网关地址。 与 IP 地址一样, 网关的 IP 地址可以静态配置为 FreeRTOS_IPInit() 的参数,也可以从 DHCP 服务器动态配置。


域名系统 (DNS)

使用原始 IP 地址并不总是可行,原因如下:
  • IP 地址可能会更改。
  • 远程计算机的 IP 地址可能未知。
  • IP 地址不太好记。
下方 域名系统 (DNS) 可将人类易读的静态文本(而非数字)名称映射到 IP 地址, 从而解决上述问题。 域名服务器可将文本域名解析为合适的 IP 地址。 例如,在台式计算机的命令控制台中输入"ping www.freertos.org", 将显示 ping 请求发送到 IP 地址 195.8.66.1 (至少今天是这样),因为 DNS 服务器 将字符串 "www.freertos.org" 解析为 IP 地址 195.8.66.1。

如果 ipconfigUSE_DNS 在 FreeRTOSIPConfig.h 中设置为 1, 则FreeRTOS-Plus-UDP API函数 FreeRTOS_gethostbyname() 将文本名称解析为 IP 地址。

与 IP 地址一样, 域名服务器的 IP 地址可以静态配置为 FreeRTOS_IPInit() 的参数,也可以从 DHCP 服务器动态配置。


地址解析协议 (ARP)

如果使用常规有线网络,UDP 消息 会以以太网帧格式发送。 UDP 消息在 IP 地址之间发送, 但以太网帧在 MAC(硬件)地址之间发送。 因此, 在创建以太网帧之前, 必须知道目标 IP 地址的 MAC 地址。

地址解析协议 (ARP) 用于获取 MAC 地址信息。 FreeRTOS-Plus-UDP (像大多数 IP 堆栈那样)将 IP 地址到 MAC 地址的映射 存储在 ARP 表(有时称为 ARP 缓存)中。


字节顺序和 Endian

不同的微控制器以不同方式存储多字节值, 如两个字节的 uint16_t 或四个字节的 uint32_t。 首先存储 最重要的字节的微控制器被称为大 Endian。 首先存储 最不重要字节的微控制器被称为小 Endian。 将字节存储在运行 FreeRTOS-Plus-UDP 的微控制器上的方式 被称为主机字节序

未连接到微控制器的应用程序的编写者很少需要考虑 其目标微控制器如何在内部存储数据。 如果数据以 Little Endian 顺序写入内存, 从内存中以小 Endian 的顺序读回,因此读回的值将 与最初写入的值相匹配。

连接微控制器时会更复杂, 因为无法保证连接网络上的所有微控制器 都具有相同的字节顺序。 网络上的所有微控制器 都必须事先同意用于发送和接收数据的字节顺序。 传输中的数据所使用的字节序称为网络字节 顺序

在 UDP/IP 网络中,数据首先以最高有效字节发送, 这使得 UDP/IP 网络实际上是 Big Endian。 因此, 发送到 UDP/IP 网络的 Little Endian 微控制器必须 交换字节在多字节值中出现的顺序,方可将这些值发送到网络; 出现的顺序,以及使用这些多字节值之前 字节在从网络接收到的多字节值中出现的顺序 。 Big Endian 微控制器无需执行任何 字节交换,因为微控制器的 Endian(主机字节 序)匹配网络的约定 Endian(网络字节序)。

Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.