ZHCACY3 august 2023 AM2431 , AM2432 , AM2434 , AM2631 , AM2631-Q1 , AM2632 , AM2632-Q1 , AM2634 , AM2634-Q1 , AM263P4 , AM263P4-Q1 , AM2732 , AM2732-Q1 , AM6411 , AM6412 , AM6421 , AM6422 , AM6441 , AM6442
轻量级 TCP/IP (LwIP) 协议栈是嵌入式系统中使用的开源 TCP IP 协议栈。LwIP 协议栈旨在减少内存用量和缩小代码大小。LwIP 采用分层方法。针对层间通信的宽松方案是通过使用共享内存建立的,这意味着应用进程和网络代码可以使用相同的内存或内部缓冲区。内部数据包在 LwIP 中表示为 Pbufs(数据包缓冲区)。这些 Pbuf 包含要在网络中传输的数据包的有效负载。在 MbedTLS 不存在的情况下,Pbuf 包含要传输的实际应用数据。但在安全通信的情况下,需要通过加密、哈希处理等多种可能方法之一来保护这些数据。
LwIP 工程已经内置了对 MbedTLS 的支持。启用 MbedTLS 后,通过默认 TCP 层传输的数据现在采用备用路由并由备用 TCP/IP 层(也称为 ALTCP 层)进行处理。这些层设置了回调函数。回调函数决定应用在建立连接、发送数据、接收数据、关闭连接、处理错误等方面的行为。MbedTLS 可与 LwIP 套接字 API、BSD 套接字 API 和 Netconn API 一起使用。这种广泛的用途是通过填充通用 altcp_tls_config 结构来实现的,该结构在内部使用 MbedTLS 函数进行加密/SSL 操作。
altcp_tls_config 结构保存创建新 TLS 客户端或服务器连接所需的状态。然后,此 TLS 配置会直接传递给 LwIP 函数或其他 LwIP 内部结构。例如,通常通过回调 tcp_recv(未启用 MbedTLS 时)传递的数据现在会通过 altcp_recv(启用了 mbedTLS 时)传递。这些替代实现包含额外的代码(默认在 lwip-stack 内)。所有替代层实现都在以下路径的文件中定义:MCU_PLUS_SDK/source/networking/lwip/lwip-stack/src/apps/altcp_tls。
MbedTLS 与 LwIP 的用法由 lwip-config/lwipopts.h 中定义的宏在顶层进行控制。在此启用 MbedTLS 即会启用 ALTCP 层。当 LwIP 库重建(MbedTLS 已启用)时,ALTCP 层将处理数据。如图 3-1 所示,启用了 MbedTLS 时,数据通过备用 TCP 层 (altcp) 传输。启用了 MbedTLS 时,数据通过备用 TCP 层 (altcp) 传输。
当调用 tcp_new() 函数时,会创建一个新的协议控制块 (TCP PCB)。此 PCB 是一个新的 TCP 连接标识符,可以设置用于侦听新的连接或显式连接到另一个主机。在使用 MbedTLS 的情况下,这时会使用备用 PCB(即 altcp_pcb,而不是 tcp_pcb)。altcp_pcb 结构包含 altcp_functions、对下一个 PCB 的引用、指向参数的指针、PCB 的状态以及应用程序回调。
LwIP 提供 HTTP 客户端和服务器、MQTT 客户端等示例应用。普通的 LwIP 应用不安全,网络中的通信也不安全,这在现场会导致设备容易成为网络攻击的目标。
在 LwIP 上使用 MbedTLS 可确保数据通过安全的端到端传输通道传递。MbedTLS 会在传输实际数据之前执行 3 路 TLS 握手。TLS 握手可确保愿意通信的实体经过授权且可信。TLS 可确保数据的加密和完整性,以及网络中实体的身份验证。此外,MbedTLS 还可在需要额外安全性时提供双向 SSL 身份验证。
启用 MbedTLS 后,LwIP 的内存占用量变化几乎可以忽略不计。据观察,应用中 MbedTLS 本身的内存占用量约为 176KB(还可以进一步降低)。表 3-1 展示了内存占用量。
代码 | RO 数据 | RW 数据 | 总大小(字节) |
---|---|---|---|
127988 | 39289 | 9159 | 176436 |