Semi-TCP协议是一种网络拥塞控制方法,它通过对传统TCP协议进行改进,将拥塞控制功能下放到MAC层,即媒体访问控制层。这种跨层设计思想的核心在于逐跳地判断和处理网络中的拥塞状态,而不仅仅是端到端的控制。在动态拓扑网络中,由于信道损耗和动态路由等问题,会出现很多非拥塞因素导致的丢包现象。传统的TCP协议在面对这种情况时会误认为是网络拥塞,导致错误地缩小拥塞窗口,降低发送速率,从而降低网络的吞吐量。Semi-TCP针对这个问题,将拥塞控制的部分功能转移到数据链路层的MAC层,实现了逐跳拥塞控制,提高了对非拥塞因素引起丢包的判别准确性和处理时效性,从而在多跳无线网络中有效提升了网络吞吐量。
Semi-TCP协议的实现关键在于在数据帧的帧体域携带节点缓存状态量化信息,通过节点间的逐跳通信传递拥塞信息,实现拥塞状态的判定和拥塞控制。在Semi-TCP协议中,节点根据自身缓存状态和从相邻节点接收的缓存状态信息及时调整自己的发送速率,确保数据流在多跳无线网络中的高效和稳定传输。
在Semi-TCP协议的实现过程中,研究者们尝试了多种方法来修改控制帧并携带缓存状态信息。例如,可以增加或修改控制帧如CTS(Clear to Send),当接收节点的缓存空间不足以接收数据时,发送节点会收到一个携带拥塞信息的CTS帧;或者修改RTS/CTS帧,使其带有拥塞状态信息;在某些方案中,ACK帧也会携带拥塞信息以告知发送方是否可以发送数据;还有方案通过在MAC层和TCP层之间增加一个虚拟层VTCP来调节发送窗口大小和发送速率。这些方法通常需要对现有的TCP/IP协议栈体系结构进行修改,并改变无线网络接口卡的硬件配置信息。此外,网络结构和终端系统都需要适配相应的协议。
然而,上述方法都仅限于计算机仿真阶段,尚未在实际的网络平台上得到验证。本文尝试在ARM开发板RP4412上实现Semi-TCP协议,该开发板基于ARM处理器内核。实现过程中不修改已有MAC层的控制帧和现有的硬件配置信息,而是通过软件定义发送数据帧的方式,在数据帧的帧体域携带节点缓存状态量化信息,完成节点拥塞状态信息的传递。这一方法需要在Linux(Ubuntu)操作系统下对修改的相关代码进行交叉编译,然后移植到RP4412开发板上,并利用软件定义的方式判断开发板无线网卡的缓存状态再发送数据帧,实现拥塞状态的判断。
在Semi-TCP算法中,可以将节点自身的拥塞控制分为两部分:节点自身的拥塞判定和拥塞信息的逐跳传递。节点自身的拥塞判定是指节点(包括转发节点)根据传输层向下层发送的数据包和接收到的下一跳节点的接收缓存状态信息来及时调整自身的发送速率。拥塞信息的逐跳传递则是指节点根据本地缓存状态信息向相邻节点发送包含拥塞状态信息的控制帧,从而完成网络中的拥塞状态信息传递和网络整体性能的优化。
在具体实现上,节点内的发送缓存空间大小为z,设定一个拥塞门限值CTH(0<CTH≤1),若当前数据包占据的缓存空间为N,那么当N达到或超过CTH时,意味着节点将进入拥塞状态。因此,节点需要根据这些参数来调整自己的发送行为,包括是否需要调整发送速率以避免拥塞进一步恶化。
Semi-TCP协议的实现难点在于如何在不改变现有网络协议栈和硬件配置的情况下,通过软件定义的方式在数据帧中携带和处理拥塞状态信息,并且在实际的网络平台上进行验证。Semi-TCP协议在动态拓扑网络中,特别是多跳无线网络环境下的实现和性能测试,对于提升网络通信效率和吞吐量具有重要意义。