基于DSP的上网方案的软硬件设计与实现
UDP协议是一种面向无连接的不可靠的协议,用两个文件udpin.c和udpout.c来实现。udpin.c实现对udp包输入的处理,判断其端口号、检验和是否正确,正确则将其数据交给相应端口的应用程序,不正确则丢弃;udpout.c实现对udp包输出的处理,从应用程序接收数据,设置相应的源端口号和目的端口号,再交给IP层发送。值得注意的是,计算UDP包的检验和与计算IP包的检验和是不一样的,IP包的检验和只覆盖了IP包的首部,而UDP包的检验和则覆盖了UDP包的首部和所有的数据。UDP包计算检验和时还引入了一个12字节的伪首部,包括4字节的源IP地址、4字节的目的IP地址、1字节的零段、1字节的协议段和两字节的检验和,其目的是让UDP两次检查数据是否正确地到达了目的地。 TCP协议与UDP协议虽然同是运输层协议,但是它提供一种面向连接的可靠的字节流服务。TCP协议是所有协议中最复杂、也是最难实现的一块,主要由tcpin.c、tcpout.c、tcptimer.c和tcpstatem.c四个文件分块实现,并根据具体应用的需要进行简化。TCP的控制块tcb用结构体来实现,每一个tcb包含一条TCP连接的所有控制和状态信息,全部的tcb形成了一个双向链表,有利于在所有TCP连接中进行搜索。tcptimer.c负责管理TCP协议中的各种状态信息,它内含前向后向指针,使之形成定时器超时,PC机上的TCP协议包含快慢两个定时器,这里仅仅实现了一个500ms的慢速定时器,因为没有快速定时器,所以不支持ACK报文延迟,收到一帧即立即发送ACK;tcpstatem.c是TCP的状态机函数,根据TCP连接所处的不同状态以及发生的事件来决定TCP连接的状态变迁;tcpout.c负责tcp报文的发送,典型的发送过程是当接收到上层应用程序的数据时,首先发送SYN帧,与目标节点三次握手建立连接,之后加上TCP首部,交给下层IP模块发送,并通过重传定时器实现超时重发、持续定时器发送窗口探测帧等功能,待所有数据发送完毕并得到确认后发送FIN帧,通过四次握手关闭连接,tcpout.c还可在不同状态和事件下被其它程序调用发送ACK帧、RST帧等其它TCP报文;tcpin.c负责接收从下层IP模块接收到的TCP数据包,并根据TCP连接的状态信息以及TCP首部的各个标志位进行分支处理,将数据交给对应端口的上层应用程序,并调用其它函数实现对TCP包的响应和状态变迁。在PC机上往往可以同时维护多条TCP连接;但在DSP上,由于DSP速度和RAM容量的限制,只支持一条TCP连接;这样大大简化了程序的复杂度,同时也满足了实际需要,如果今后有需要,还可以进行扩展。 综上所述,TCP/IP协议的具体处理流程如图4所示。
本文通过DSP与网卡的硬件接口的设计及编程,使DSP实现了基于以太网的TCP/IP通信,从而使DSP可以通过网线进行联网,并可以实时地与计算机进行通信,交换大量的数据和控制信息。本文所介绍的技术已经在作者参加的国家"973"项目"复杂自然环境时空定量信息的获取与融合处理的理论与应?quot;的硬件设计中得到应用,并运行良好。