23、分布式系统与物联网架构中的网络通信技术

分布式系统网络通信技术解析

分布式系统与物联网架构中的网络通信技术

1. TCP/IP 网络配置与通信基础

在网络通信中,首先需要进行网络配置。可以通过指定地址和子网掩码来创建 IP 协议中的路由,以访问子网中的所有邻居。以下是相关代码示例:

pico_ipv4_link_add(&dev, ipaddr, netmask);

添加默认路由时,将网关与 0.0.0.0 地址(表示任何主机)关联,度量值为 1。后续可以通过为其他子网定义更具体的路由来覆盖默认网关:

pico_ipv4_route_add(any, any, gw, 1, NULL);

应用程序初始化套接字并关联回调函数,当需要时,协议栈会调用这些回调函数:

application_init_sockets();

通过一个简单的主循环反复调用 pico_stack_tick 函数,该函数会轮询所有关联的网络接口,并执行所有协议模块中的待处理操作:

while (1)
    pico_stack_tick();
    WFI();
}

所有 TCP/IP 操作都与套接字回调相关联,当应用程序需要对网络和超时事件做出反应时,会调用这些回调函数,并且协议栈会在需要时自动设置超时以管理单个协议的内部状态。

2. 套接字通信
2.1 lwIP 裸机套接字通信

lwIP 为裸机套接字通信提供的接口(也称为原始套接字 API)由自定义调用组成,每个调用在期望从协议栈接收到事件时指定一个回调函数。当特定事件发生时,lwIP 会从主循环函数中调用该回调函数。

创建监听 TCP 套接字的新控制块:

struct tcp_pcb *tcp_new(void);

接受 TCP 连接时,裸机 lwIP TCP 服务器首先调用以下函数将套接字绑定到本地地址并使其进入监听状态:

err_t tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port);
err_t tcp_listen(struct tcp_pcb *pcb);

与使用阻塞套接字的 POSIX 应用程序不同,lwIP 裸机应用程序调用以下函数表示服务器准备好接受新连接,并在建立新传入连接时回调传入的 accept 函数:

void tcp_accept(struct tcp_pcb *pcb,
    err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)
);

接收下一个数据段时,应用程序调用:

void tcp_recv(struct tcp_pcb *pcb,
    err_t (* recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
);
2.2 picoTCP 套接字通信

picoTCP 为每个套接字对象关联一个回调函数,该回调函数是对任何与套接字相关的事件(如新的传入 TCP 连接、套接字缓冲区中有新数据可读或上一次写入操作结束)做出反应的公共点。创建套接字时指定回调函数:

struct pico_socket *pico_socket_open(uint16_t net,
    uint16_t proto,
    void (*wakeup)(uint16_t ev, struct pico_socket *s));

在新创建的套接字上配置 TCP 套接字服务器:

int pico_socket_bind(struct pico_socket *s, void *local_addr, uint16_t *port);
int pico_socket_listen(struct pico_socket *s, int backlog);

当建立新的传入连接时,会生成一个事件调用 wakeup 函数,应用程序最终可以调用 accept 函数生成与传入连接对应的新套接字对象:

struct pico_socket *pico_socket_accept(
    struct pico_socket *s,
    void *orig,
    uint16_t *local_port);

picoTCP wakeup 回调函数的第一个参数是一个位掩码,指示套接字上发生的事件类型,可能的事件如下:
- EV_RD:表示传入数据缓冲区中有数据可读。
- EV_CONN:表示在调用 connect 后或在监听状态下等待调用 accept 之前建立了新连接。
- EV_CLOSE:当连接的另一端发送 FIN TCP 段,表示其传输已完成时触发。套接字处于 CLOSE_WAIT 状态,意味着应用程序在终止连接之前仍可发送数据。
- EV_FIN:表示套接字已关闭,从回调函数返回后不再可用。
- EV_ERR:表示发生错误。

3. 无连接协议:TCP 与 UDP 的比较

TCP 是一种广泛使用的面向连接的传输协议,适用于需要保证数据可靠传输的应用场景。然而,TCP 实现较为复杂,在某些平台上会占用大量的可用闪存空间,因为它需要管理重传、超时和确认等复杂的内部机制,还需要组织缓冲区并跟踪每个套接字的多个状态机。

UDP 则是 TCP 的无连接对应协议,它相对简单,对从套接字接口到网络的数据以及反之的数据应用较少的转换。通常,UDP 实现的代码大小要小得多,并且由于不需要保证数据的可靠性,它不需要跟踪已传输或接收数据的顺序和间隙,从而减少了运行时 RAM 的使用。当网络特性允许时,对于低流量冗余数据传输,使用 UDP 通常是一个可行的选择。

4. 网状网络与动态路由
4.1 网状网络概述

链路层协议可能能够实现 mesh-under 机制,为上层隐藏拓扑的复杂性。当链路层协议不具备此功能,或者网状解决方案需要跨不同网络接口扩展时,则需要实现一种与接口无关的标准协议。每个链路连接两个直接可见的设备,这些设备会根据检测到的拓扑协调以检测到达远程节点的最佳网络路径。路径上的中间节点会根据当前拓扑信息将流量路由到目的地。

在某些场景中,拓扑不是固定的,当路径中的节点不可用或改变位置时,拓扑会发生演变,这种非静态拓扑的网状网络称为移动自组织网络(MANETs)。为 MANETs 设计的动态路由机制必须能够对拓扑变化做出反应并相应地更新其路由。

4.2 动态路由协议分类

基于动态 IP 路由的网状网络依赖于不同的协议,可分为以下两类:
| 协议类型 | 特点 | 常见协议 |
| ---- | ---- | ---- |
| 主动动态路由协议 | 每个网络节点发送广播消息以宣布其在网络上的存在,其他节点通过读取消息检测邻居的存在并将邻居列表传达给邻居。网状网络随时可用,在拓扑变化时需要固定的重新配置时间。 | 优化链路状态路由(OLSR)、更好的移动自组织网络方法(B.A.T.M.A.N.)、Babel、目的序列距离向量(DSDV) |
| 被动动态路由协议 | 节点在没有数据交换时可以处于空闲状态,然后通过查询每个邻居来配置路径,询问到达目的地的路由。消息会重复发送并增加计数器以跟踪跳数,直到到达目的地,此时网络可以根据回复定义发送者请求的路径。动态路由按需形成,因此通信的第一条消息可能会有额外的延迟,但它需要的功率更少,并且可能对拓扑变化反应更快。 | 自组织按需距离向量(AODV)、动态源路由 |

路由协议的选择取决于要构建的网状网络的需求。对于数据传输不频繁且由电池供电的节点的网络,被动按需协议是最佳选择;而对于始终开启的嵌入式系统,主动路由机制可能更有益,因为它可以确保路由表始终更新到网络的最新已知状态,每个节点随时都知道到达每个可能目的地的最佳路由,但需要定期以广播数据包的形式在网络中传播更新,以不断刷新网络节点及其邻居的状态。

4.3 picoTCP 对网状网络的支持

picoTCP 旨在为物联网设备提供先进的路由技术,它支持 6LoWPAN 链路层中的一种 mesh-under 机制以及两种 route-over 协议,即 OLSR(被动)和 AODV(主动),为将 TCP/IP 通信集成到移动自组织网络提供了更广泛的选择。

启用 OLSR 时,只需编译支持 OLSR 的协议栈,OLSR 守护服务将自动启用并在主 TCP/IP 协议栈循环中运行。所有需要参与网状网络定义的设备都可以通过调用以下函数添加:

pico_olsr_add(struct pico_device *dev);

启用 AODV 网络的方式类似,使用 pico_aodv_add 函数添加接口:

pico_aodv_add(struct pico_devices *dev);

在这两种情况下,服务将对用户透明运行,并在检测到网络中的新节点(对于 OLSR)或每次请求与远程节点通信并创建按需路由以到达该节点时更改路由表。不在直接可见范围内的节点会指定一个第一跳网关,以确保可以到达目标节点,并使用路由度量作为跳数的指示,以便在找到更短的目的地时替换路由,理想情况下不会因路由替换而导致通信中断。

此外,像 OLSR 这样的路由协议在计算网状网络中到达给定目的地的最佳路径时,可以考虑除跳数之外的其他参数,例如在计算最佳路径时集成有关无线链路质量的信息(如信噪比或接收信号强度指示),从而根据多个参数选择路由,并始终选择无线信号方面的最佳选项。

route-over 网状网络策略没有预见转发广播数据包的机制,这些数据包必须由链路层协议重复发送才能到达网络中的所有节点。然而,实现这样的机制很容易触发乒乓效应,即单个数据包在两个或多个节点之间来回反弹,因此链路层中实现的广播转发机制必须通过跟踪最近转发的几个帧来避免重复转发同一帧。

5. 传输层安全(TLS)

在现实世界的物联网系统中,通信需要为传输中的数据实施安全措施,包括但不限于加密以保证传输数据的机密性。实现标准安全协议可以保证网络中异构组件(如设备和远程服务器)之间的端到端互操作性,并依赖于与经典 IT 世界中使用的协议完全兼容的软件解决方案。

链路层协议通常提供一些基本的安全机制,例如使用 AES 等对称密钥来保证连接到特定网络的客户端的身份验证并加密数据。在大多数情况下,链路层的身份验证足以保证基本级别的安全。然而,LR - WPAN 网络栈中常用的预共享、众所周知的密钥可能容易受到多种攻击,如果密钥被泄露,攻击者可以解密之前在同一链路上捕获的任何流量。在其他场景中,仅加密不足以保证另一端是其声称的身份,或者数据在传输过程中没有被篡改。

TLS 是一组旨在通过标准 TCP/IP 套接字提供安全通信的加密协议,其主要职责集中在分布式系统中安全通信的三个关键要求上:
- 保密性 :通过使用对称加密技术保证参与通信各方之间的通信保密性。TLS 定义了旨在生成一次性对称密钥的加密技术,这些密钥在生成它们的会话结束时失效。
- 身份验证 :使用公钥加密技术对挑战有效负载进行签名和验证,以实现通信各方的身份验证。由于非对称密钥的特性,只有拥有秘密私钥的一方才能对有效负载进行签名,而任何人都可以通过使用签名消息的密钥的公钥对应物来验证签名的真实性。
- 完整性 :使用消息摘要验证消息在传输过程中没有被修改。

对于嵌入式市场,有一些开源的实现可用于启用标准加密算法和安全套接字通信策略的协议套件。其中,wolfSSL 是一个免费的开源软件库,提供了 TLS 和 DTLS 的最新标准版本,专为小型嵌入式系统的性能和可靠性而设计,包括支持许多为系统安全设计的嵌入式平台的硬件加速器和随机数生成器。

wolfSSL 在其核心库(wolfCrypt)中实现了加密原语,并将它们分组到 TLS 套接字使用的密码套件中,这些密码套件可以轻松集成到裸机网络应用程序和任何提供传输套接字通信 API 的嵌入式操作系统中。这些加密原语针对嵌入式设备进行了优化,在最关键的性能操作中使用汇编代码以获得最佳性能。

专为微控制器设计的 TLS/SSL 库的主要优点是,它实现了与互联网上任何 PC 或服务器相同的协议,但代码大小仅为其一小部分,并且在最昂贵的加密操作期间始终控制资源使用(如内存使用)。采用支持前沿加密算法的 TLS 库可以与物联网网络的经典 IT 基础设施组件中实施的安全措施完美集成。在云端,供远程嵌入式系统访问的服务应允许选择基于椭圆曲线的更高效密码套件,因为传统的基于 RSA 的公钥加密需要更大的密钥和复杂的计算才能达到相同的安全级别。TLS 1.3 中包含了诸如 Curve22519 等基于公钥的加密新标准。

以下是一个简单的 mermaid 流程图,展示了 picoTCP 套接字通信的基本流程:

graph LR
    A[创建套接字] --> B[绑定地址和端口]
    B --> C[监听连接]
    C --> D{有新连接?}
    D -- 是 --> E[接受连接]
    D -- 否 --> C
    E --> F{有数据可读?}
    F -- 是 --> G[读取数据]
    F -- 否 --> F
    G --> H{是否继续通信?}
    H -- 是 --> F
    H -- 否 --> I[关闭套接字]

综上所述,在分布式系统和物联网架构中,网络通信涉及多个层面的技术,从基本的 TCP/IP 配置到复杂的安全协议,每种技术都有其特定的应用场景和优势。开发者需要根据具体的需求和环境选择合适的技术来构建高效、安全的网络通信系统。

分布式系统与物联网架构中的网络通信技术(续)

6. 不同路由协议的对比与选择

在网状网络中,主动动态路由协议和被动动态路由协议各有优劣,以下通过表格进一步对比它们的特点,帮助开发者根据实际需求做出选择。

对比项 主动动态路由协议 被动动态路由协议
节点状态 节点始终活跃,定期广播自身存在信息 节点在无数据交换时可空闲
路由建立时间 网络随时可用,拓扑变化时有固定重配置时间 按需配置路径,首条消息可能有额外延迟
资源消耗 需定期广播消息,消耗一定网络资源 无数据交换时资源消耗低
拓扑适应性 对拓扑变化反应相对较慢 能更快适应拓扑变化
适用场景 适用于始终开启、对实时性要求高的嵌入式系统 适用于数据交换不频繁、电池供电的节点网络
7. 安全协议的重要性及应用

在物联网系统中,安全协议的应用至关重要。TLS 协议作为保障安全通信的关键技术,其具体应用流程如下:

graph LR
    A[客户端发起连接] --> B[服务器发送证书]
    B --> C[客户端验证证书]
    C --> D{验证成功?}
    D -- 是 --> E[生成会话密钥]
    D -- 否 --> J[终止连接]
    E --> F[双方使用会话密钥加密通信]
    F --> G{通信结束?}
    G -- 否 --> F
    G -- 是 --> H[销毁会话密钥]
    H --> I[关闭连接]

从流程图可以看出,TLS 协议通过证书验证、会话密钥生成等步骤,确保了通信的保密性、身份验证和完整性。以 wolfSSL 为例,其在嵌入式系统中的应用步骤如下:
1. 集成 wolfSSL 库 :将 wolfSSL 库添加到项目中,根据嵌入式平台的特点进行配置。
2. 初始化 wolfSSL :在代码中调用相应的初始化函数,如 wolfSSL_Init()
3. 创建 SSL 上下文 :使用 wolfSSL_CTX_new() 函数创建 SSL 上下文,并进行必要的配置,如设置证书和密钥。
4. 建立 SSL 连接 :在客户端和服务器端分别使用 wolfSSL_new() 函数创建 SSL 对象,并使用 wolfSSL_connect() wolfSSL_accept() 函数建立连接。
5. 进行安全通信 :使用 wolfSSL_write() wolfSSL_read() 函数进行加密数据的读写操作。
6. 关闭连接 :通信结束后,使用 wolfSSL_shutdown() wolfSSL_free() 函数关闭连接并释放资源。

8. 套接字通信的优化策略

在实际应用中,为了提高套接字通信的性能,可以采用以下优化策略:
- 回调函数优化 :合理设计回调函数,减少不必要的处理逻辑,提高响应速度。例如,在 picoTCP 的 wakeup 回调函数中,只处理必要的事件,避免在回调函数中进行复杂的计算。
- 缓冲区管理 :合理设置套接字的缓冲区大小,避免缓冲区溢出或不足。可以根据实际应用场景调整缓冲区大小,提高数据传输效率。
- 多线程处理 :在支持多线程的系统中,可以使用多线程技术并行处理套接字通信,提高系统的并发性能。例如,将接收和发送数据的操作分别放在不同的线程中执行。

9. 网状网络的部署与维护

部署和维护网状网络需要考虑多个方面的因素,以下是一些关键步骤和注意事项:
1. 网络规划 :根据应用场景和需求,确定网状网络的拓扑结构、节点数量和分布等。例如,在一个大型仓库中部署物联网传感器网络,需要合理规划节点的位置,确保信号覆盖范围和通信质量。
2. 节点配置 :对每个节点进行必要的配置,包括 IP 地址、路由协议、安全设置等。确保节点之间能够正常通信,并根据需要调整节点的参数。
3. 路由协议选择 :根据网络的特点和需求选择合适的路由协议。如前所述,主动动态路由协议适用于实时性要求高的场景,而被动动态路由协议适用于资源受限的场景。
4. 监控与维护 :建立网络监控系统,实时监测节点的状态、通信质量和路由信息等。及时发现并解决网络故障,如节点掉线、路由异常等问题。
5. 安全保障 :在网状网络中实施安全措施,如使用 TLS 协议进行加密通信、设置访问控制等。防止网络受到攻击,保护数据的安全和隐私。

10. 总结与展望

在分布式系统和物联网架构中,网络通信技术涵盖了从基本的 TCP/IP 配置到复杂的安全协议等多个方面。通过合理选择和应用不同的技术,可以构建高效、安全的网络通信系统。

未来,随着物联网技术的不断发展,网络通信将面临更多的挑战和机遇。例如,随着物联网设备数量的不断增加,对网络的扩展性和可靠性提出了更高的要求;同时,新的安全威胁也不断涌现,需要不断完善安全协议和技术。因此,开发者需要持续关注技术的发展趋势,不断优化和改进网络通信方案,以适应不断变化的应用需求。

总之,掌握分布式系统和物联网架构中的网络通信技术,对于构建智能、高效、安全的物联网系统具有重要意义。希望本文能够为相关领域的开发者提供有益的参考和指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值