首页 基于DM9000A的TCP通信设计论文最终版

基于DM9000A的TCP通信设计论文最终版

举报
开通vip

基于DM9000A的TCP通信设计论文最终版基于DM9000A的TCP通信设计论文最终版 基于DM9000A的TCP通信设计 摘 要 随着时代的发展因特网的广泛普及人们对智能化产品需求的增加 许多应用 领域纷纷与网络技术结合出现了信息家电如PDA可视电话 移动电话 机顶盒和 数码相机等嵌入式设备它们正逐渐走向网络化以共享互联网中庞大的信息资源 本课题设计了一个基于DM9000A的TCP通信以DM9000A以太网控制器为核心 TCPIP协议为重点采用软硬结合方式实现设计课题系统的介绍了硬件网络控制 器DM9000A的内部结构与特点并编写了相应的程序代码及...

基于DM9000A的TCP通信设计论文最终版
基于DM9000A的TCP通信 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 论文最终版 基于DM9000A的TCP通信设计 摘 要 随着时代的发展因特网的广泛普及人们对智能化产品需求的增加 许多应用 领域纷纷与网络技术结合出现了信息家电如PDA可视电话 移动电话 机顶盒和 数码相机等嵌入式设备它们正逐渐走向网络化以共享互联网中庞大的信息资源 本课题设计了一个基于DM9000A的TCP通信以DM9000A以太网控制器为核心 TCPIP 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 为重点采用软硬结合方式实现设计课题系统的介绍了硬件网络控制 器DM9000A的内部结构与特点并编写了相应的程序代码及阐述了它的驱动原理 采用软件编程定义TCPIP协议层的各帧结构 通过 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 协议的通信原理及具体实 现过程将简化的TCPIP协议移植到ARM硬件平台并利用协议的接口函数编写上层 应用程序最后在应层实现EM客户端与PC服务器端之间的数据传输实验证明本课 题的设计能够成功的实现ARM平台上的移植并完成数据的准确传输这将为以后 网络之间的通信提供了方便 关键词DM9000A以太网TCPIP协议 TCP communication design based on DM9000A Abstract With the development of the times the popularization of internet widespread peoples demand on the increase of intelligent product many application domains in abundance with networking union Appeared information home appliances such as PDA videophone mobile telephone set-top boxes and digital camera etc they are gradually embedded equipment to share internet towards network in the enormous information resources This topic is TCP communication design based on DM9000A takes the DM9000A Ethernet controller as the core TCPIP protocol for key point and selects the soft and hard union method to realize the design This topic systematically introduces the hardware network controller DM9000As internal structure and characteristics and have compiled the corresponding procedure code and elaborated its actuation principle Using software programming definition TCPIP protocol layer each frame structure and realizes the process specifically through the analysis agreements correspondence principle will simplify the TCPIP protocol transplanted to ARM hardware platform And using agreement connection function compilation upper formation application procedure finally in should the level realize between the EM client side and the PC server end data transmission The experiment proved that this topics design can succeed realizes in the ARM platform transplant and completes the data the accurate transmission this will be for the communication between network and network and will provides convenient for every one after Key wordDM9000A etherneTCPIP protocol 目 录 1 绪论 1 11 TCPIP协议的发展 1 12 目前国内外TCPIP协议的应用 2 13 本课题的设计内容与结构 2 2 以太网接口 4 21 硬件平台描述 4 22 DM9000A芯片的内部结构和工作原理 5 23 DM9000A的驱动 7 24 以太网接口设计 12 3 TCPIP通信协议的实现 16 31 TCPIP通信的设计思想 16 311 TCPIP协议的介绍 16 312 数据报的封装 17 313 主程序流程 17 32 ARP协议及其实现 19 33 IP协议及其实现 23 331 IP协议帧数据结构 23 332 IP协议的实现 25 34 ICMP协议及其实现 27 35 TCP协议及其实现 29 351 TCP协议帧数据格式 29 352 TCP协议端口及套接字 31 353 TCP协议的通讯过程 31 354 TCP协议的实现 34 4 应用层的实现 36 结 论 39 致 谢 40 参考文献 41 附 录 42 1 绪论 11 TCPIP协议的发展 早在阿帕网ARPR产生运作之初通过接口信号处理机实现互联的电脑并不多大部分电脑相互之间不兼容在一台电脑上完成的工作很难拿到另一台电脑上去用每一个电脑在各自的系里都运行良好但却不能共享资源面对这样的状况科学家们提出这样一个理念让所有电脑能够实现资源共享这就得在这些系统的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 之上建立一种大家共同都必须遵守的标准让不同的电脑按照一定的规则进行谈判并且在谈判之后能握手 随着接口信号处理机IMP的研试及网络测评中心的建立科学家们又提出用网络思想设计网络布局网络测评系统的想法然而考虑到如何让各种电脑都认可的信号来打开通信管道并且数据通过后还要关闭通道的问题上便引进了通信协议的概念 70年代包切换理论为网络之间的联接方式提供了理论基础建立一种对各种操作系统普适的协议利用包交换技术实现网络之间的通信这就产生了目前在开放系统下的所有网民和网管人员都在使用的传输控制协议和因特网协议即TCPIP协议通过制定详细定义的TCPIP协议标准第一次实现了将信息包通过点对点的卫星网络再通过陆地电缆再通过卫星网络再由地面传输贯串欧洲和美国经过各种电脑系统全程94万公里竟然没有丢失一个数据位远距离的可靠数据传输从而验证了TCPIP的成功使其得以发展[1] TCPIP的成功给网络通信带来了很多方便最初的TCPIP是借助与因特网的密切关系才得以发展起来的在网络中TCPIP提供了在两端计算机之间数据交换的环境它的功能取决于两台计算机间进行的通信内容即通过在两端计算机上运行 的程序决定TCPIP网络究竟能做些什么TCPIP协议具有可靠性与面向连接性能使计算机之间直接交换数据实现资源的共享不管在商务还是在家庭中把计算机与网络相连利用TCPIP协议通信获得全世界信息推进了TCPIP技术的增强TCPIP包含了所有网络综合技术具备了涵盖所有类型网络的功能目前大量的研究机构研究将它推向开放式的网络化协议TCPIP技术在与时俱进不断增强它已进入我们生活的方方面面 12 目前国内外TCPIP协议的应用 目前TCPIP协议已成为占主导地位的通讯协议它能使各种业务在不同的网上实现互联互通从技术上为网络融合奠定了基础是研究和应用现代网络必不可少的知识也是从事网络设计与应用工作的基石它之所以能够获得如此成就是因为它具有如下的特点 开放的协议标准可以独立于特定计算机和操作系统的开放方式独立于特定的物理网络硬件可以运行在多种网络传输介质上共同的地址规划 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 使得整个网络中的任何TCPIP设备都具有一个唯一的地址标准化的高层协议提供了多种可靠的用户服务 TCPIP在诞生之初主要以文字为中心进行信息交换用于远程登录电子邮件和文件传送等方面的应用不久它应用于万维网实现了图像和声音动画等在内的大量可视化信息的访问随着因特网的的普及与发展TCPIP也广为人知应用于介绍各种新闻提供各种服务中如传送影像和声音的服务航天飞机升空实况转播音乐会实况传播讲演活动的介绍等现在TCPIP已推广到因特网以外的网络领域比如商店的收款机银行的ATM自动取款机测量仪器机械设备的控制与监视公司内部网络及家庭内的居室自动化等等开展了各种网络应用[2] 随着人们对智能化产品需求的增加未来的嵌入式产品包括各种家电通信 PDA仪器仪表等设备正逐渐走向网络化TCPIP协议在嵌入式系统的研究也越来越有实际意义因而基于TCPIP协议使嵌入式设备的网络化开发也有广阔的市场前景目前嵌入式系统作为新技术的发展方向已广泛的应用在军事国防消费电子网络通信工业控制等领域随着因特网的普及出现了信息家电如PDA可视电话 移动电话 机顶盒和数码相机等嵌入式设备它们的市场需求也越来越大正逐渐走向网络化以共享互联网中庞大的信息资源 TCPIP协议已成为目前最为流行及广泛使用的以太网协议TCP通信也将成为基于ARM的有线通信的的主要通信方式实现远程图像监控系统远程温度环境监控系统网络通信等广泛的应用 13 本课题的设计内容与结构 本课题是基于DM9000A的TCP通信设计首先对以太网控制器DM9000A作了简要的说明并阐述了它的驱动原理编写了相应的程序代码其次分析了TCPIP协议的通信原理及实现过程讲述了以太网层传输层网络层的具体处理过程最后基于TCP协议进行网络通信实现应用层的数据传输设计 本课题共分为四部分内容安排如下 本课题第一部分为绪论介绍了TCP的发展应用背景及国内外发展前景说明了TCPIP应用的领域及网络通信的可靠性 本课题第二部分为以太网接口DM9000A主要介绍了本课题的硬件平台DM9000A的工作原理及驱动过程等编写相关程序代码实现数据的接收发送处理它为本课题的主要部分实现了网络数据的传输 本课题第三部分为TCPIP协议的实现主要介绍了以太网层传输层网络层等各层中的协议及数据的接收发送实现针对TCP协议更加系统的说明了它的具体 通讯过程如建立连接数据传输关闭连接等这一部分对每个协议的实现过程都有概括的表述做为基础有利于一些的理解 本课题第四部分为应用层的实现介绍应用层的协议功能实现应用层客户端与服务器端之间的通信 2 以太网接口 21 硬件平台描述 图21 硬件平台 本课题实现的硬件平台如图所示在这个开发平台上ARM处理器选用S3C440X与ARM连接的有JTAG接口用于调试程序用的电源晶振是给ARM提供电源ARM才能进行正常工作FLASH相当于ARM的ROM用来储存程序SDRAM用来储存数据串行口用于跟外界连接进行数据交换如把下载到ARM中LCD接口是连接LCD显示器的用来显示ARM运行的结果在调试仿真的时候很方便直观USB接口用于跟外界交换数据如将数据从U盘中传入ARM中网络驱动中用的网卡是DM9000A用于S3C440X和网络间的数据接收和发送设计中将CMD引脚与处理器的地址线ADR2网络控制器CMD引脚决定了处理器访问的是哪个端口寄存器当CMD 0时主机访问的是INDEX端口寄存器当CMD 1时访问的是DATA端口寄存器总体介绍 DM9000AMAC控制器与一般处理接口一个10100M自适应的PHY和4K DWORD值的SRAM 它的目的是在低功耗和高性能进程的33V与5V的支持宽容 DM9000A还提供了介质无关的接口来连接所有提供支持介质无关接口功能的家用电话线网络设备或其他收发器该DM9000A支持8位16位接口访问内部存储器以支持不同的处理器DM9000A物理协议层接口完全支持使用10MBps下3类4类5类非屏蔽双绞线和100MBps下5类非屏蔽双绞线这是完全符合IEEE 8023u 规格它的自动协调功能将自动完成配置以最大限度地适合其线路带宽还支持IEEE8023x全双工流量控制这个工作里面DM9000A是非常简单的所以用户可以容易的移植任何系统下的端口驱动程序[3] 2 特点 1支持处理器读写内部存储器的数据操作命令以字节字双字的长度进行 2集成10100M自适应收发器 3支持介质无关接口 4支持背压模式半双工流量控制模式 5IEEE8023x流量控制的全双工模式 6支持唤醒帧链路状态改变和远程的唤醒 7支持自动加载EEPROM里面生产商ID和产品ID 8支持4个通用输入输出口 9超低功耗模式功率降低模式电源故障模式 100脚CMOS LQFP封装工艺11兼容33v和50v输入输出电压12支持4K双字SRAM13可选择11YL18-2050s YT37-1107S或54变压比例的变压器降低格外功率 图22 DM9000A的硬件电路 DM9000A的EECS引脚保持默认的悬空状态数据线SD0-SD15直接与3C44B0XSST39VF1601HY57V641620HG的数据线相连DM9000A的IO读信号线IOR写信号线IOW分别与片选信号CSNGCS3端口相连它的起始地址为0X0600-0000读写信号与片选信号都是保持默认设置的低电平有效在DM9000A中只有INDEX端口与DATA端口两个寄存器可以直接被CPU直接访问其它所有内部控制和状态寄存器都是通过这两个端口寄存器间接访问的设计中将CMD引脚与处理器的地址线ADR2网络控制器CMD引脚决定了处理器访问的是哪个端口寄存器当CMD 0时主机访问的是INDEX端口寄存器当CMD 1时访问的是DATA端口寄存器实际中 INDEX端口寄存器保存的是访问DATA端口寄存器的内部寄存器的地址因此对 DM9000A控制或状态寄存器访问的命令顺序是1要访问寄存器的地址到INDEX端 口2通过DATA端口来读写数据在系统上电时处理器通过总线配置DM9000A内的 网络控制寄存器NCR中断寄存器ISR等以完成DM9000A的初始化随后DM9000A 进人数据收发等待状态当DM9000A接收到外部网络送来的以太网数据时首先检 测数据帧的合法性如果帧头标志有误或存在CRC校验错误则将该帧数据丢弃否 则将数据帧缓存到内部RAM并通过中断标志位通知处理器处理器收到中断后将 DM9000A接收RAM的数据读出进行处理当处理器要向以太网发送数据帧时先将数 据打包成P或IP数据包并通过8位或16位总线逐字节发送到DM9000A的数据发 送缓存中然后将数据长度等信息填充到DM9000A的相应寄存器内随后发送使能 命令DM9000A将缓存的数据和数据帧信息进行MAC组帧并发送出去 DM9000A按字节半字字方式读写数据 define DM9000_outb dP volatile UINT8 p d define DM9000_outw dp volatile UINT16 p d define DM9000_outl dp volatile UINT32 p d define DM9000_inb p volatile UINT8 p define DM9000_inw p volatile UINT16 p define DM9000_inl p volatile UINT32 p 其中 volatile UINT8 p为强制类型转换即将P转换为无符号八位再将d 赋给转换后的p后面几个语句类似于此语句 2 DM9000A软件复位 void DM9000_reset void dlyus 20 DM9000_iow DM9000_NCR 0x03 dlyus 20 DM9000_iow DM9000_NCR 0x03 dlyus 20 DM9000_iow DM9000_GPR 0x01 DM9000_iow DM9000_GPR 0x00 dlyms 4 函数的功能是实现DM9000A的复位即将寄存器NCR的第0位赋值为1保持4ms自动清零 3 DM9000A寄存器读数据 __inline UINT8 DM9000_ior UINT8 reg DM9000_outb regDM9000_INDEX_PORT return DM9000_inb DM9000_DATA_PORT 使用如上函数实现DM9000A从寄存器中读取数据首要对要访问的寄存器正确寻址再将DM9000A的数据端口和地址端口复用通过CMD引脚来选择端口当CMD引脚拉高时当前命令周期访问的是数据端口当CMD引脚拉低时当前命令周期访问的是地址端口此程序首先是由INDEXPORT写入需要读取操作的寄存器地址在 由DATAPORT读取寄存器内的数据 4 DM9000A寄存器写数据 __inline void DM9000_iow UINT8 regUINT8 value DM9000_outb regDM9000_INDEX_PORT DM9000_outb valueDM9000_DATA_PORT 函数功能实现将数据写入寄存器中首先由INDEXPORT写入需要写操作的寄 存器地址 再由DATAPORT写入寄存器内数据 5 DM9000A检查PID与VID UINT32 DM9000_probe void UINT32 id_val id_val DM9000_ior DM9000_VIDL id val DM9000_ior DM9000_VIDH 8 id val DM9000_ior DM9000_PIDL 16 id_val DM9000_ior DM9000_PIDH 24 if id_val DM9000_PIDVID ifdef ETHERNET_DEBUG DbgPrintf "[DM9000_probe OK]" endif return 1 else return 0 函数实现了DM9000检查PID与VIDDM9000A默的PID是0x9000VID是0x0A46 6 DM9000A的初始化处理 DM9000A的初始化处理基于DM9000A如何接收和发送数据的驱动程序设计DM9000A是一个全双工的低功耗快速以太网控制器集成了MAC层和PHY层同时具有16K字节的SRAM支持多种双绞线和光纤传输媒介完全兼容IEEE802(3u10,100MB,sDM9000A内部的16K字节SRAM被分成两部分一部分为发送TX缓冲区另一部分为接收RX缓冲区DM9000A的驱动程序主要由初始化函数接收函数发送函数和一些辅助函数组成[6] void DM9000_Init UINT8 mac int ioft DM9000_reset If DM9000_probe 0 return -1 If DM9000_ior DM9000_ISR 7 0x01 DM9000_IO_MODE return -1 DM9000_iow DM9000_NCR 0x00 DM9000_iow DM9000_TCR 0x00 DM9000_iow DM9000_SMCR0x00 DM9000_iow DM9000_NSR 0x2C DM9000_iow DM9000_ISR 0x3f DM9000_iow DM9000_BPTR0x3f DM9000_iow DM9000_FCTR0x38 DM9000_iow DM9000_FCR 0x29 for i 0oft DM9000_PARi 6ioft DM9000_iow oftmac[i] for i 0oft DM9000_MARi 8ioft DM9000_iow oft0xff DM9000_iow DM9000_RCR0x31 DM9000_iow DM9000_IMR1 7 ifdef ETHERNET_DEBUG DbgPrintf "[DM9000 init is succed]" end if 对DM9000A的初始化即填写设置DM9000A的控制寄存器首先调用复位函 数使GPIO默认0位为输出以激活内部PHY寄存器NCR的第0位赋值为1软件复 位清零以便设置正常的工作模式 GPIO控制寄存器GPCRGPCR的1到3位表示GPIO的输入输出方向1为 输出0为输入4到6位为GPIO的固定output不可写在本课题设计中将其设置为0x01 GPIO寄存器GPR它的第0位为0表示激活PHY为1表示关闭PHY它的1到3位表示GPIO的1到3位的端口映射位4到6位表示GPIO的4到6位的端口映射位在本课题将其设置为0x00表示激活PHY 网络控制寄存器NCR设置网络控制寄存器NCR的Bit[0]RST位为1进行软件复位设置网络控制寄存器NCR进行网络工作模式设置TCR本课题中将其置为0x00它的Bit[0]代表发送请求发送完成后自动清零该位Bit[1]表示禁止为数据包指针1添加CRC校验Bit[2]表示禁止为数据包指针1添加PADBit[3]表示禁止为数据包指针2添加CRC校验Bit[4]表示禁止为数据包指针2添加PADBit[5]表示额外冲突模式控制0代表当额外的冲突计数多于15则终止本次数据包1代表始终尝试发发送本次数据包Bit[6]表示Jabber传输使能1代表使能Jabber传输定时器2048字节0代表禁止本课题中将其设置为0x00 特殊模式控制寄存器SMCR赋值为0x00它的0位表示强制最短Back-off时间第1位表示强制最长Back-off时间第2位表示强制冲突延迟3到6位保留第7位表示特殊模式使能 使用网络状态寄存器NSR清除各种状态标志位将其置为0x2C赋值中断状态寄存器ISR为0x3f来清除所有中断标志位它Bit[0]表示数据包接收Bit[1]表示数据包传输Bit[2]表示接收溢出Bit[3]表示接收溢出计数器溢出Bit[4]表示传输Under-runBit[5]表示连接状态改变Bit[7]表示处理器模式0为16位模式1为8位模式 还用到了背压门限寄存器BPTR它的0到3位表示拥挤状态时间默认为 200us0000为5us0001为10us0010为15us0011为25us0100为50us0101为100us0110为150us0111为200us1000为250us1001为300us1010为350us1011为400us1100为450us1101为500us1110为550us1111为600us它的4到7位表示背压门限最高值当接收SRAM空闲空间低于该门限值则MAC将产生一个拥挤状态默认值为3H即3K字节空闲空间不要超过SRAM16KB大小本课题将其赋值为0x3f 对于溢出控制门限寄存器FCTR 将其赋值为0x38它的0到3位表示接收FIFO缓存溢出门限最低值当接收SRAM空闲空间大于该门限值则发送一个暂停时间pause_time为0000H的暂停包当溢出门限最高值的暂停包发送之后溢出门限最低值的暂停包才有效默认值为8K字节不要超过SRAM大小4到7位表示接收FIFO缓存溢出门限最高值当接收SRAM空闲空间小于该门限值则发送一个暂停时间pause_time为FFFFH的暂停包若该值为0 则无接收空闲空间默认值为3H即3K字节空闲空间不要超过SRAM大小 对于接收发送溢出控制寄存器FCRBit[0]表示溢出控制使能1设置使能溢出控制模式Bit[1]表示接收暂停包当前状态Bit[2]表示接收暂停包状态只读清零允许Bit[3]表示背压模式该模式仅在半双工模式下有效当接收SRAM超过BPHW并数据包DA匹配时产生一个拥挤状态Bit[4]表示背压模式该模式仅在半双工模式下有效当接收SRAM超过BPHW并且接收新数据包时产生一个拥挤状态Bit[5]表示强制发送暂停包使能按溢出门限最高值使能发送暂停包Bit[6]表示1发送暂停包发送完成后自动清零并设置TX暂停包时间为FFFFHBit[7]表示1发送暂停包发送完成后自动清零并设置TX暂停包时间为0000H将其赋值为0x8 还用到物理地址寄存器PAR多点发送地址寄存器MAR 接收控制寄存器RCRBit[0]表示接收使能Bit[1]表示混杂模式Promiscuous ModeBit[2]表示忽略不完整的数据包Bit[3]表示忽略所有多点传送Bit[4]表示丢弃CRC校验错误的数据包Bit[5]表示丢弃长数据包1为丢弃数据包长度超过1522字节的数据包Bit[6]表示看门狗定时器禁止1禁止0使能赋值0x31 中断屏蔽寄存器IMRBit[0]表示1使能数据包接收中断Bit[1]表示1使能数据包传输终端Bit[2]表示1使能接收溢出中断Bit[3]表示1使能接收溢出计数器溢出中断Bit[4]表示1使能传输Underrun中断Bit[5]表示1使能连接状态改变中断Bit[7]表示1使能指针自动跳回当SRAM的读写指针超过SRAM的大小时指针自动跳回起始位置需要驱动程序设置该位若设置则MRRH将自动位0CH本文将其赋值为0x80[7] 24 以太网接口设计 1 以太网的MAC帧格式 图23 以太网帧格式 以太网的MAC帧格式比较简单由5个字段组成前两个分别为6字节的目的端地址与发送端地址字段第三个为两字节的类型字段标志上一层用的是什么协议如上层使用的是IP数据报则该类型字段值为ox0800第四个是数据字段其长度为46 1500字节之间最后为4字节的帧检验序列FCSMAC帧在物理层传输时还须在帧前面插入8个字节它有两段组成第一个字段为7个字节的前同步码实现位同步第二个字段是帧开始定界符定义为10101011 以太网帧结构体定义如下 struct ethernet_frame UINT8 destination[ETH_ADDRESS_LEN] UINT8 source[ETH_ADDRESS_LEN] UINT16 frame_size UINT16 protocol UINT16 buf_index 2 以太网的数据链路传输 以太网基本上采用总线型的连接方式在一条电缆上连接所有的计算机当某台计算机发送数据时其信号可以传输给连接在电缆上的所有计算机每台计算机的网卡可以接收传过来的数据接收到数据后网卡给CPU一个中断信号告诉它应该接收数据了收到中断请求的CPU就中断现在正在执行的处理开始准备接收数据包 驱动软件则首先检查MAC地址从而判断是否有自己应当接收的数据报如果与自己主机NIC的MAC地址相同就接着检查类型的字段以及是否有自己应当接受的协议当在自己可接受的协议情况下就使用在内存中的可接纳数据帧长度的内存缓冲器把NIC中的数据通过数据总线传送到内存然后再交由上层的软件作进一步的处理如果与自己主机NIC的MAC地址不同没有可接收的数据则删除数据报 3 DM9000A接收数据处理 DM9000A接收以太网数据具体实现函数为DM9000_ReceiveFrame首先要判断数据帧的合法性其具体过程是DM9000A从网络中接到一个数据包后会在数据包前面加上4个字节分别为[01H][status][LENL][LENH]然后要读取这四个字节来确定数据包的状态若第一个字节是[01H]表示接收的是有效数据包若为[00H] 则表示没有收到数据包若为其它值则表示网卡没有正确初始化需要重新进行初始化当接收的数据包长度小于60字节时DM9000A会自动为不足的字节补上0使其达到60字节同时在接收到的数据包后DM9000还会自动添加4个CRC校验字节可以不予处理所以接收到的数据包的最小长度会是64字节接收到有效数据后读取并保存以太网协议头以太网协议头长度14字节具体包括6个字节的以太网目的MAC地址6个字节的以太网源MAC地址和2个字节的帧类型 [8]接收处理过程如图24所示 图24 DM9000A的接收处理的流程图 4 DM9000A发送数据处理 DM9000A发送处理具体实现函数为DM9000_SendFrame其过程如图25所示首先由DM9000_outb函数写入数据命令再由DM9000_outw函数按照以太网协议的格式将16位数据写入发送到DM9000A的数据发送缓存中然后将数据长度等信息填充到DM9000A的相应寄存器内发送使能命令DM9000A将缓存的数据和数据帧信息进行MAC组帧并发送出去 图25 DM9000A的发送处理流程图 3 TCPIP通信协议的实现 31 TCPIP通信的设计思想 311 TCPIP协议的介绍 TCP,IP20世纪60年代末美国政府资助的一个分组交换网络研究项目到20世纪90年代已经发展成为计算机之间最常用的通信协议传统的开放式系统互连参考模型是一种通信协议的7层抽象的参考模型其中每一层执行某一特定任务TCP,IPOSI的七层参考模型它采用4层的层级结构每一层都呼叫它的下一 层所提供的网络来完成自己的需求该模型的目的是使各种硬件在相同的层次上相互通信TCPIP协议代表了整个TCPIP协议族不仅包括TCP和IP两个协议还包括ARPICMPUDP等多个协议是Internet上最基本的网络通信协议是实现互联网连接性和互操作性的关键 TCPIP参考模型由数据链路层网络层传输层和应用层构成它们是基于硬件层次的四个概念性层次在这四个层次中每一层都有特定的功能上一层直接利用下一层提供的服务来实现本层的功能下一层又通过相邻层之间的接口为上一层提供服务通信的双方在相同层之间进行通话通话规则和协定就是该层的协议TCPIP参考模型中的每一层都包含有一个或多个协议而各个层次所包含的协议总和就构成了TCPIP协议栈[9]参考模型如表31 表31 TCPIP协议参考模型 应用层 HTTPTelnetFTPSMTPSNMP 传输层 TCPUDP 网络层 IPICMPIGMP 数据链路层 EthernetX25SLIPARPRARP 1数据链路层它是TCPIP参考模型的最底层它负责将IP分组封装成适合在物理网络上传输的帧格式进行传输同时将物理网络上接收到的数据帧进行解封装提取出IP分组交付给网络层数据链路层的协议与网络的具体实现有关通常包括网络设备的驱动程序和对应的网络的接口卡它们一起处理与传输媒介有关的物理接口细节 2网络层主要确定如何将分组从源端送达目的端即确定是将数据链路层传输来的IP分组继续传给其他的网络节点还是直接传给传输层并对传输层发来的数据进行填充报头路径选择和发送IP协议是网络层的重要协议它负责无连接的数据传送数据报寻径和差错处理网络层还定义了ARPRARPICMP等协议以完成地址解析传递网络控制信息提供差错报告等功能 3传输层主要为源端口和目的端口的应用程序提供端到端的通信传输层定义了两个端到端的传输层协议一个是TCP传输控制协议它是一个面向连接的协议允许从一台机器发出的字节流无差错的到达另一台机器另一个协议是UDP用户数据报协议它是一个不可靠的不面向连接的传输协议用于不需要TCP排序和流量控制的应用中 4应用层为用户提供特定的应用服务常见的应用层协议有FTP文件传输协议HTTP超文本传输协议SMTP简单邮件传送协议Telnet远程登录协议等[10] 312 数据报的封装 数据封装体现协议层次模型的重要特征每层协议按照自己的方式进行数据的封装和拆封数据发送时各层在收到的上一层数据前面添加对应的头部信息进行数据封装然后传递到下一层数据接收时各层对数据进行解包剥离出头部信息进行适当的保存然后将数据传递到上一层处理如图31所示 图31 数据报的封装 313 主程序流程 当以太网网卡接收到数据的时候这些数据都是经过了哪些协议应该做怎样的处理才能被正确的接收呢应该如何编程实现呢如图32主程序流程图所示展示了本课题设计的总体思想初始化是编程实现设计的必要步骤如图所示以初始化设置为第一步进入本课题的设计它包括设置时钟初始化IO初始化存储器CHCHE配置使能CACHE及看门狗初始化中断初始化和网络初始化其中网络初始化包括本地的物理地址以及IP地址时间的初始化DM9000A的初始化ARP 图32 主程序流程图 首先调用DM9000A驱动获取数据实现以太网的数据接收具体的实现过 程在24节做过详细说明当以太网成功接收数据时首先会分析是不是ARP包是的话就调用ARP协议处理不是的话就看看是不是IP数据包如果不是的话就丢弃该帧若是IP数据包还要具体分析是哪种报文因为ICMPP报文都是用IP传送的判断IP数据报传送的是哪种报文后调用相应协议的处理程序处理数据这样就完成了数据的接收了 当接收处理完数据以后再重新检测以太网网卡是否接收新的数据如此一直循环下去实现数据的接收和发送 以上各种协议的处理过程将在后文详细地描述 32 ARP协议及其实现 1 ARP的分组帧格式 地址解析协议ARP是联系IP协议和LAN协议的桥梁该协议把节点的IP解析成对应的MAC地址也叫物理地址它可以在局域网内寻找IP所对应的MAC地址并保存起来以供发送使用这是由于以太网设备并不识别32位的网络地址它是以48位的物理地址来传输以太网数据包的因此IP驱动器必须把网络目的地址转换为物理目的地址 图33 用于以太网的ARP请求或应答分组格式 在以太网上解析IP地址时ARP请求和应答分组的格式如图33所示以太网报头中的目的地址为全1的特殊地址即广播地址电缆上的所有以太网接口都要接收广播的数据帧以太网帧类型表示后面数据的类型对于ARP请求或应答来说该字段的值为0x0806 形容词hardware硬件和protocol协议用来描述ARP分组中的各个字段例如一个ARP请求分组询问协议地址这里是IP地址对应的硬件地址这里是以太网地 址硬件类型字段表示硬件地址的类型它存储的是以太网的MAC帧则值为1协议类型字段表示要映射的协议地址种类它的值为0x0800即表示IP地址它的值与包含IP数据报的以太网数据帧中的类型字段的值相同如本课题设计在以太网上使用IP协议进行通信则硬件类型字段应为1协议类型字段应存储0x0800 硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度以字节为单位对于以太网上IP地址的ARP请求或应答来说它们的值分别为6和4 可选域指出四种操作类型它们是ARP请求值为1ARP应答值为2这个字段是必需的因为ARP请求和ARP应答的帧类型字段值是相同的 对于一个ARP请求来说除了目的端硬件地址外的所有其他的字段都有填充值当ARP请求包时目的端硬件地址域中存储0当系统收到一份目的端为本机的ARP请求报文后它就把硬件地址填进去然后用两个目的端地址分别替换两个发送端地址并把操作字段置为2最后把它发送回去ARP实现应答[11] 在软件编程时为了实现ARP协议本设计定义了ARP的结构体如下 struct arp_entry UINT8 state UINT8 type UINT8 retries UINT8 ttl UINT8 hwadr[HWALEN] UINT32 pradr 在这个结构体中定义了状态state包括ARP_FREE空闲ARP_RESERVED保留ARP_PENDING等待回应ARP_RESOLVED完成几种状态类型type包括ARP_FIXED_IP固定IPARP_TEMP_IP临时IP重发次数retries为5次定义生存时间ttl为60秒hwadr[HWALEN]为物理地址pradr为缓存表IP地址 本为了简化ARP协议缓存表只定义了10项也就只说在缓存里只能存十组IP地址与物理地址的映射ARP高速缓存以及工作分析 ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录高速缓存中每一项的生存时间一般为20分钟起始时间从被创建时开始算起 有了高速缓存cacheARP工作效率会高多了下面就是它的工作过程 1当ARP解析一个IP地址时它会搜索ARP cache和ARP表作匹配如果找到了ARP就把物理地址返回给提供IP地址的应用 2假如ARP没找到一个匹配的IP地址它就会ARP请求的以太网数据帧给以太网上的每个主机以太网上所有主机运行的ARP进程都收到ARP请求这个过程称作广播ARP请求数据帧中包含目的主机的IP地址其意思是如果你是这个IP地址的拥有者请回答你的硬件地址 3目的主机的ARP层收到这份广播报文后识别出这是发送端在寻问它的硬件地址于是发送一个ARP应答响应并写入自己的硬件地址其他主机不理睬ARP请求发送ARP应答包含IP地址及对应的硬件地址发送ARP请求的机器收到ARP应答就在ARP表和ARP cache中写入目的主机IP地址到硬件地址的映射以备将来之用使用这种方式ARP能决定任何IP地址对应机器的物理地址[12] 4收到ARP应答后使ARP进行请求应答交换的IP数据报现在就可以传送了 3 ARP协议的实现 ARP的实现包括两个过程ARP输入过程和ARP输出过程 1ARP协议输入处理过程 ARP输入过程如图34所示当数据进入ARP处理程序首先再次判断是否是ARP协议这样经过两次判断结果会更准确确认是ARP数据后再判断它是属于分组请求还是分组响应判断的依据是看ARP协议的操作字节是1还是21表示请求2表示应答然后再对其作相应的处理 如果是ARP请求分组则发出响应分组发送响应是个ARP输出过程详细细节见下文的ARP输出处理流程 若是ARP响应分组就接收响应为在高速缓存中根据IP地址找到该表项更新映射并利用ARP分组中的信息填写该表项同时为寿命字段赋予最大超时时间ARP_TIMEOUT这就是ARP处理接收数据的过程 图34 ARP协议输入处理流程图 2ARP协议输出IP请求分组第一步是在高速缓存中线性查找查看是否有从目的IP地址到物理地址的映射若有就更新缓存表并把数据放到使用该地址的帧中并发送该帧若没有在ARP高速缓存中分配一个表项用于存放新的绑定然后将本地IP地址和物理地址以及目的IP地址和广播物理地址写入数据缓存中组成ARP请求分组帧广播的发送出去在发送时调用DM9000A驱动完成以太网的数据发送具体实现过程如24的详细介绍 通过这两个过程就实现了ARP协议在这里要指出的是当高速缓存增加一个新表项时初始化该表项中的寿命字段设置最长等待时间ARP_TIMEOUT为601分钟随时间的推移高速缓存管理程序递减寿命字段中的值并当其值达到零时丢弃该 表项如果高速缓存已满又必须向其中增加新的绑定时高速缓存管理程序采用循环法删除一个旧表项将其分配给一个新绑定同时将记录删除标志指针依次移向下一个表项当再次有新绑定需要添加时将此时删除指针指向的表项删除再将记录删除标志指针下移一个表项以此类推进行替换 图35 ARP输出处理数据流程图 33 IP协议及其实现 331 IP协议帧数据结构 IP协议是TCPIP体系中最主要的协议之一 IP数据报的格式如表32所示一个IP数据报由首部和数据两部分组成首部的前一部分是固定长度共20个字节所有IP数据报必须具有的分析图37中的首部最高位在左边记为0 bit最低位在右边记为31 bit 4个字节的32 bit值以下面的次序传输首先是0,7 bit8,15 bit16,23 bit24,31 bitbig endian字节序由于TCPIP首部中所有的二进制整数在网络中传输时都要求以这种次序因此它又称作网络字节序以其他形式存储二进制整数的机器如little endian格式则必须在传输数据之前把首部转换成网络字节序[13]如图表32为IP数据报的格式 表32 IP数据报格式及首部中的各字段 0 4 8 16 19 24 31 版本 首部长度 区分服务 总长度 标志 标识 片偏移 生存时间 协议 首部检验和 源IP地址 目的IP地址 选项如果有 数据部分 表 在软件编程时为了实现IP协议定义了IP结构体 struct ip_frame UINT8 vihl UINT8 tos UINT16 tlen UINT16 id UINT16 frags UINT8 ttl UINT8 protocol UINT16 checksum UINT32 sip UINT32 dip UINT8 opt[_IP_OPTLEN 1] UINT16 buf_index 在这个结构体里定义了vihl包括版本和首部长度版本号是固定的为4tos为服务类型tlen为总长度id为标志frags为标识和片偏移ttl为生存时间protocol为协议checksum为检验和sip为源IP地址dip为目的IP地址opt[_IP_OPTLEN 1]为可选字段buf_index为数据缓存区数据缓存区位数据部分的偏移量在此设置则这部分是为了区分首部和数据部分提取数据时方便操作 332 IP协议的实现 1 IP协议总体设计 IP协议主要完成两个功能分别是检查收到的IP数据包的首部检验和以及对IP数据包进行解析本课程设计采用TCP协议进行通信因此IP层只需要确定是ICMP数据包还是TCP数据包然后根据数据包的类型进行相应的处理主要参数如下 Ip_construct_cs 为校验函数负责计算IP协议头检查和 Ip_check_cs 函数负责检查IP协议头检查和 Prosess_ip_out 为IP数据报的发送函数它负责生成IP报头并将其写入到发送缓存区调用DM9000A的驱动函数将IP数据包发送给以太网接收模块它被上层ICMP处理函数和TCP发送函数调用 Process_ip_in 为IP数据报的接收函数它根据协议类型将数据报提交给上层协议进行处理 2 IP协议输入处理设计 IP协议的实现包括两个过程IP协议输入过程和IP协议输出过程下图36是IP协议输入处理的流程 其具体工作过程如下 IP协议输入过程 图36 IP 协议输入处理流程 3 IP协议输出IP协议输出DM9000_SendFrame实现数据的发送 图37 IP协议输出处理流程 34 ICMP协议及其实现 由于IP协议提供的是不可靠的无连接的分组传输当转发分组出现异常情况时需要通知源站采取措施避免或纠正问题这时就需要使用网络层的ICMP网络控 制报文协议使主机或路由器报告差错和异常情况ICMP消息在以下几种情况下发送当数据报不能到达目的地时当网关已经失去缓存功能时当网关能够引导主机在更短路由上发送时[14] ICMP报文是封装在IP分组中进行传输的当IP分组的首部中协议字段为1就表示IP数据报分组的数据部分是ICMP报文当IP模块发现传输出错时首先丢弃该出错数据报然后调用ICMP模块向源端主机发送出错报文本课题把ICMP简化成只有响应请求和响应应答其报文格式如表33所示ICMP报文格式包括8 bit的报文类型字段标志出错类型0代表响应应答8代表响应请求8 bit代码字段0表示不能到达所要发送的网络16 bit的校验和字段此外报文还包括标识符和序号 表33 ICMP 响应-请求响应-应答的报文格式 0 8 16 31 类型0或8 代码0 检验和 标识符 序号 选型数据 图 ICMP报文简化处理流程如38所示 图38 ICMP 处理流程 ICMP协议有两种报文请求报文和应答报文由于系统很少主动进行网络连接因此只实现ICMP协议的一部分即可对接收到ping请求报能予应答首先确定是IP数据报后再判断是不是ICMP报文确认是ICMP报文后验证检验和再判断是请求报文还是应答报文ICMP协议主要是针对Ping的处理即对接收到的ping请求报进行应答并发送ICMP应答报文设计思路如下处理程序接收到ICMP报的IP报头后首先对ICMP校验和验证然后根据ICMP报的类型字段判断是否是ping请求 帧若是则根据接收到的ping请求帧来设置ping应答帧本课题只处理响应请求当确定以后就组装好IP数据报把响应应答发送出去在发送过程中类似于IP协议的输出过程同样是调用DM9000A的驱动函数完成发送过程 35 TCP协议及其实现 351 TCP协议帧数据格式 TCP协议提供的是面向连接服务是在不可靠的网络服务上提供端到端的可靠字节流TCP之所以可靠是因为它对发送数据的顺序号进行了控制以及进行与其对应的肯定确认应答控制面向连接是因为TCP协议在传输数据开始前通信双方之间需建立好连接在通信结束后切断连接由于TCP要提供可靠的面向连接的运输服务因此不可避免地增加了许多的开销如确认流量控制计时器以及连接管理等使得协议数据单元的首部增大很多还要占用许多的处理器资源 TCP报文段分为首部和数据两部分TCP的全部功能都体现在它首部中各字段的作用TCP首部格式如表34所示它的前20个字节是固定的后面4N字节是根据需要而增加的选项所以TCP首部最小长度为20字节 表34 TCP报文段的首部 0 8 16 24 31 发送端端口号 接收端端口号 序 列 号 确 认 序 号 数据 偏移 保留 U R G A C R P S H R S T S Y S F IN 窗 口 检 验 和 紧 急 指 针 选项长度可改变 填 充 前两个为发送端端口号和接收端端口号各占两个字节端口是运输层与高层的服务接口16bit 的端口32bit的IP地址构成了相当于运输层服务访问点TSAP的地址总共是48bit 序列号占四个字节表示所发送的数据的位置是本报文段所发送的数据部分第一个字节的序号在 TCP传送的数据流中每一个字节都有一个序号从0开始到232-1为止共232个序列号 确认序号占四个字节是期望收到对方下次发送的数据的第一个字节的序号也就是期望收到的下一个报文段的首部中的序号由于序号字段有32bit长可对4GB的数据进行编号这样就可以保证序号重复使用时就序号的数据早已在网络中消失了 数据偏移量占4bit这是TCP报文段首部的长度用于指出TCP报文段的数据开始处离TCP报文段的起始处有多远数据偏移的单位是32bit字 保留位6bit为了将来的扩展而准备的域目前应置为0 控制标志位共占6bit它由1bit来确定其含义按照顺序分别赋予名字 URGACKPSHRSTSYNFIN各比特意义如下紧急比特URG当URG 1时表明此报文段应尽快发送而不要按原来的排队来传送应与紧急指针字段配合使用确认比特ACK当ACK 1时确认序号字段才有意义除了最初的一个SYN段之外它必须为1急迫比特PSH当PSH 1时表明请求远地TCP将本报文段立即传送给其应用层而不等到整个缓冲区满后再向上交付重建比特RST当RST 1时表明出现严重错误必须释放连接然后重新建立运输连接同步比特SYN当SYN 1而ACK 0时表明这是一个连接请求报文段若对方同意建立连接则应在发回的报文段中使SYN 1且ACK 1终止比特FIN当FIN 1时表明发送的字节串已经发送完毕并要求释放运输连接[15] 窗口占两字节是报文段接收方的接收缓冲区的空闲区域的大小发送数据一方只能发送比这个域所表示的数据量小的数据单位为字节 检验和占两字节检验的范围包括首部和数据两部分在计算检验和时首先要在TCP报文段的前面加上一个12字节的伪首部然后接收端在计算检验和时仍然要加上伪首部 紧急指针域在控制标志URG为1时有效它所存储的值作为表示需要紧急数据的存储单元来处理 选项长度可变TCP规定一种选项即最长报文段MSS用于告诉对方的TCP本地的缓冲区所能接收的报文段的最大长度 填充不定长填充的内容必须为0它是为了保证包头的结合和数据的开始处偏移量能够被32整除 在软件编程时为了实现TCP协议本课题定义了结构体tcb如下 struct tcp_frame TCP协议帧 UINT16 sport UINT16 dport UINT32 seqno UINT32 ackno UINT16 hlen_flags UINT16 window UINT16 checksum UINT16 urgent UINT8 opt[_TCP_OPTLEN 1] UINT16 buf_index 在这个结构体里定义了sport为发送端端口号dport为接收端端口号seqno为包的序列号ackno为确认应答号hlen flags为控制标志window为窗口checksum为检验和urgent为紧急指针opt[_TCP_OPTLEN 1]为可选字段buf_index为存区起始地址 352 TCP协议端口及套接字 端口是应用层与运输实体进行交互的接口端口号是一个16bit的地址不同的应用进程用不同的端口号来标识端口号分为两类一类是专门分配给一些最常用的应用程序这叫熟知端口另外一类则是一般的端口号用来随时分配给请求通信的客户进程 套接字即是IP地址与端口号的组合TCP的一个连接就是以一对套接字来标识的所以在运输层通信的一对套接字必须是唯一的 353 TCP协议的通讯过程 在TCP 通讯中主要有连接的建立数据的传输连接的关闭三个过程每个过程 完成不同的工作而且序列号和确认号在每个过程中的变化都是不同的 以客户端与服务器之间建立的通信来说明如表35所示 表35 TCP通讯传输过程 客户端 序号 确认号 标志 数据 服务端 建立连接过程 第一次握手-- 随机C1 不考虑 SYN -- 第二次握手 -- 随机S1 C11 SYNACK -- 第三次握手 -- C11 S11 ACK -- 传送数据过程 发送数据 -- C11 S11 PSHACK n字节 -- 接收确认 -- S11 C11n ACK -- 发送数据 -- C11n S11 PSHACK m字节 -- 接收确认 -- S11 C11nm ACK -- 关闭连接过程 第一次握手-- C1 S1 FINACK -- 第二次握手 -- S1 C11 ACK -- 第三次握手 -- S1 C11 FINACK -- 第四次握手 -- C11 S11 ACK -- 1 TCP 建立连接 运输连接的建立和释放是每一次面向连接通信中必不可少的过程在连接建立的过程中要解决以下三个问题 1要使每一方都知道对方的存在 2要允许双方协商一些参数如最大报文段长度最大窗口的大等 3能够运输实体资源如缓冲区大小连接表中的项目等进行分配 TCP 建立连接也就是我们常说的三次握手它需要三步完成在TCP 的三次握手中发送第一个SYN 的一端执行的是主动打开而接收这个SYN 并发回下一个SYN 的另一端执行的是被动打开这里以客户端向服务器发起连接来说明 1 第 1 步客户端向服务器发送一个同步数据包请求建立连接该数据包中初始序列号ISN是客户端随机产生的一个值确认号是0 2 第 2 步服务器收到这个同步请求数据包后会对客户端进行一个同步确认这个数据包中序列号ISN是服务器随机产生的一个值确认号是客户端的初始序列号1 3 第 3 步客户端收到这个同步确认数据包后再对服务器进行一个确认该数据包中序列号是上一个同步请求数据包中的确认号值确认号是服务器的初始序列号1 2 TCP 传输数据 在 TCP 建立连接后就可以开始传输数据了TCP 工作在全双工模式它可以同时进行双向数据传输这里为了简化只使用客户端向服务器发送数据的情况服务器向客户端发送数据的原理它们是类似的工作过程这里不再重复说明服务器向客户端发送一个数据包后客户端收到这个数据包后会向服务器发送一个确认 数据包TCP的确认是对接收到的数据的最高序号即收到的数据流中的最后一个序号表示确认但返回的确认序号是已收到的数据的最高序加1也就是说确认序号表示期望下次上到的第一个数据字节的序号[16] 传输数据的简要过程如下 1发送数据客户端向服务器端发送第一个带有数据的数据包该数据包中的序列号和确认号与建立连接第三步的数据包中的序列号和确认号相同为提高网络传送效率发送端可以连续发送多个数据包序列号为上一个数据包序列号值数据包大小确认号为上一个数据包确认序列号客户端收到服务器端确认数据包后再次向服务器端发送带有数据的数据包该数据包中的序列号为上一个回复数据包中的确认号值确认号为建立连接第三步的数据包中的确认号值 2确认收到为提高网络传送效率接收端不一定在收到一个数据包后就立刻发送一个数据包回复而可以根据实际情况如缓冲区大小报文段大小等再发送确认回复数据包该确认数据包中序列号是为上一个数据包中的确认号值确认号为服务器发送的上一个数据包中的序列号该数据包中所带数据的大小 3 TCP 关闭连接 关闭一个连接需要经过4 个步骤因为TCP 连接是全双工的工作模式所以每个方向上需要单独关闭在TCP 关闭连接时首先关闭的一方即发送第一个终止数据包的将执行主动关闭而另一方收到这个终止数据包的再执行被动关闭 1第 1 步客户端完成它的数据发送任务后会主动向服务器发送一个终止数据包以关闭在这个方向上的TCP 连接该数据包中序列号为客户端发送的上一个数据包中的确认号值而确认号为服务器发送的上一个数据包中的序列号该数据包所带的数据的大小 2第 2 步服务器收到客户端发送的终止数据包后将对客户端发送确认信息以关闭该方向上的TCP 连接这时的数据包中序列号为第1 步中的确认号值而确认号为第1 步的数据包中的序列号1 3第 3 步同理服务器完成它的数据发送任务后就也会向客户端发送一个终止数据包以关闭在这个方向上的TCP 连接该数据包中序列号为客户端发送的上一个数据包中的确认号值而确认号为服务器发送的上一个数据包中的序列号该数据包所带数据的大小 4第 4 步客户端收到服务器发送的终止数据包后将对服务器发送确认信息以关闭该方向上的TCP 连接这时在数据包中序列号为第3 步中的确认号值而确认号为第3 步数据包中的序列号1 354 TCP协议的实现 1 TCP协议输入处理设计 TCP协议输入处理如图39所示 图39 TCP协议的输入流程 首先要重新判断接收到的是否是TCP数据报这样做是为了再次确定数据报判断的准确如果是就获取TCP的首部信息否则报错然后判断该TCP套接字是否打开并找到处理数据报要用到的SOCKET进一步验证检验和的正确性当套接字未打开就不做任何处理当检验和也正确无误最后调用TCP套接字侦听事件完成应用层的处理 2 TCP协议输出处理设计 如下图310所示在发送过程中首先要判断实际数据长度不超过缓存区长度套接字要求处于打开状态然后填入TCP协议头并计算校验和正确之后保存校验 和使数据缓存区buf指向TCP协议头然后传给IP层进行IP封装然后等待发送在发送过程中调用DM9000A的驱动函数完成数据的发送 图310 TCP协议的输出流程 4 应用层的实现 使用TCP协议在应用层实现数据的上传具体来说在应用层我们要完成数据的接收和应答和发送在应用层实现EM客户端与PC服务端之间的通信首先在应用层定义了一个网络通信协议它分为一个字节的机器类型一个字节的协议号0x01八个字节的机器号如"99999999"两个字节的备用两个字节的总帧号两个字节的帧号一个字节的命令一个字节的检验和所有的累加为0xAC和两个字节的数据长度本帧DATA部分长度还有数据部分协议的具体工作过程可表示为1EM客户端向PC服务端发起点对点的连接设置客户端机器类型为0x03-JL206A它的TCP端口固定为11018PC服务器端的端口号默认为10323本设计中协议号为0x012EM客户端向PC服务端发起注册此时命令字为0x01PC服务器端回应注册设置命令字为0x023注册成功后在整个通讯中通过设置不同的命令字实现发送应答接收若客户端向服务端上传数据设置命令字为0x33服务器读取客户端的参数置命令字为0x30客户端向服务端返回参数设命令字为0x31 PC服务器端下载程序设置命令字为0x32 本地网络的初始化 图41 本地网络初始化 通信过程中首先要对本地网络进行初始化如上图41所示 2 TCP协议应用层侦听事件回调 在35节我们曾介绍过TCP协议的实现在输入设计中介绍了调用TCP套接字 侦听事件本小节要实现TCP协议应用层侦听事件回调的功能本地网络应用层接收处理过程如图42所示 图42 本地网络应用层接收处理流程 首先判断是否是该TCP应用层的套接字然后判断侦听到的事件类型本课题的设计只处理接收到的数据事件对其他事件不做处理在保证数据有效机器类型与机器号都正确的情况下然后对其协议号字段进行判断再根据其协议中的命令字段进行相应的处理若命令字段为0x01则表示客户端EM向服务器端PC注册若命令字段为0x33则为客户端EM向服务器端PC上传数据若命令字为0x32则PC读取EM参数由于采用TCP协议传输它保证了数据的可靠性及建立了连接应答所以在数据的传输中不在进行应答和相应的重发 3(本地网络发送设计 图43 本地网络发送处理 结 论 本课题的设计我通过搜集大量的资料掌握基本理论知识在ARM硬件平台上最终实现了基于DM9000A的TCP通信设计本设计采用硬件与软件结合方式了解以太网控制器DM9000A内部结构与特点编写驱动程序 利用TCPIP协议的通信功能分析协议的具体实现过程后将简化的TCPIP协议移植到ARM硬件平台上工作最终利用协议的接口函数编写上层应用程序在软硬件基础上实现EM客户端与PC服务器端之间的数据传输设计课题的主要结论如下 1完成了基于确定了整个包括开发平台上实现TCPIP协议的程序仿真该仿真实现TCPIP协议的基本功能包括以太网驱动程序ARPIPTCP等并且保证实现的ARPIPTCP层的程序最终能够移植在ARM平台上 3将TCPIP协议移植到ARM平台实现EM客户端与PC服务器端之间的数据传 输通信 参考文献 [1] 梁桂蓉(TCPIP[J]( 200626 4 1-3(((北京出版社15-18([3] 闫亚 婧祖静梁志坚(( 12 -63([4] DAVICOM SemiconductorIncDM9000A Ethernet controller with ceneral Processor Interface Date Sheet[S]USA DAVICOM SemiconductorInc2005 [5] DM9000AE Application Notes V100DAVICOMhttpdaxicomcom [6] 张阳唐昆基于ARM的TCPIP开发 httphibaiducomfirstm25blogitem 28806>html [7] 苏耀峰王德刚魏急波(([8] 黄慧群吴景东( (([9] 谢希仁((((((北 京出版社-60 [15] 郅琦雷斌(( 20069-47([16] Beh rouzA Fo rouzan Soph ia Chung Fegan TCP IP 协议族[S]谢希仁译 北京 清华大学出版社2001(INT8 tcp_getsocket UINT8 soctype UINT8 tosUINT16 toutINT32 listener INT8UINT8UINT32UINT32 INT8 i struct tcb soc if soctype TCP_TYPE_SERVER 服务器端 soctype TCP_TYPE_CLIENT 客户端 soctype TCP_TYPE_CLIENT_SERVER 服务器客户端 soctype TCP_TYPE_NONE 未使用 ifdef TCP_DEBUG DbgPrintf "[Invalid socket type requested]" endif return -1 if listener 0 ifdef TCP_DEBUG DbgPrintf "[Event listener function not specified]" endif return -1 for i 0i NO_OF_TCPSOCKETSi 搜索可用的socket soc tcp_socket[i] if soc- state TCP_STATE_FREE 如果可用 soc- state TCP_STATE_RESERVED 标志为已占用 soc- type soctype TCP类型 soc- tos tos 服务类型 soc- event_listener listener 回调函数 soc- rem_ip 0 soc- remport 0 soc- locport 0 soc- flags 0 soc- tout toutTIMERTIC return i 返回获取的socket句柄 ifdef TCP_DEBUG DbgPrintf "[No socket found]" endif return -1 2 本地网络初始化 INT8 net_init void INT16 i localmachinelocalHW[5] MAC_addr[0] localmachinelocalHW[4] MAC_addr[1] localmachinelocalHW[3] MAC_addr[2] localmachinelocalHW[2] MAC_addr[3] localmachinelocalHW[1] MAC_addr[4] localmachinelocalHW[0] MAC_addr[5] localmachinelocalip interface_parmip_address[0] 24 interface_parmip_address[1] 16 interface_parmip_address[2] 8 interface_parmip_address[3] localmachinedefgw interface_parmdefault_gateway[0] 24 interface_parmdefault_gateway[1] 16 interface_parmdefault_gateway[2] 8 interface_parmdefault_gateway[3] localmachinenetmask interface_parmsubnet_mask[0] 24 interface_parmsubnet_mask[1] 16 interface_parmsubnet_mask[2] 8 interface_parmsubnet_mask[3] localmachinelocalHW[5] interface_parmmac[0] localmachinelocalHW[4] interface_parmmac[1] localmachinelocalHW[3] interface_parmmac[2] localmachinelocalHW[2] interface_parmmac[3] localmachinelocalHW[1] interface_parmmac[4] localmachinelocalHW[0] interface_parmmac[5] for i 0i 4i MACHINE_ID[2i] 0x30 systemmanage_parammachine_id[i] 4 0x0f MACHINE_ID[2i1] 0x30 systemmanage_parammachine_id[i] 0x0f ---采用默认99999999 if eth_init -1 DM9000_Init localmachinelocalHW[0] return -1 timer_pool_init 时间池初始化 arp_init tcp_init return 0 袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅 羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁 芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳 聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇 蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃 蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀 薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂 羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇袁节膅薂羄肃蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆罗袂芈蚅蚄膈膄蚄螇羁蒂蚃衿嗉莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅腽蒅蝿肈罴莁螈螇芁芇莄袀肄腽莄羂艿蒂莃蚂肂莈蒂蛳芈芄蒁袆肀膀蒀罿袃荟葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羁莇薄罿膄芃薃虿罴艿薃袁节膅薂羄肃蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆罗袂芈蚅蚄膈膄蚄螇羁蒂蚃衿嗉莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅腽蒅蝿肈罴莁螈螇芁芇莄袀肄腽莄羂艿蒂莃蚂肂莈蒂蛳芈芄蒁袆肀膀蒀罿袃荟葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆 螅膅蒁薅袇羁莇薄罿膄芃薃虿罴艿薃袁节膅薂羄肃蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆罗袂芈蚅蚄膈膄蚄螇羁蒂蚃衿嗉莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅腽蒅蝿肈罴莁螈螇芁芇莄袀肄腽莄羂艿蒂莃蚂肂莈蒂蛳芈芄蒁袆肀膀蒀罿袃荟葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羁莇薄罿膄芃薃虿罴艿薃袁节膅薂羄肃蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆罗袂芈蚅蚄膈膄蚄螇羁蒂蚃衿嗉莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅腽蒅蝿肈罴莁螈螇芁芇莄袀肄腽莄羂艿蒂莃蚂肂莈蒂蛳芈芄蒁袆肀膀蒀罿袃荟葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羁莇薄罿膄芃薃虿罴艿薃袁节膅薂羄肃蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆罗袂芈蚅蚄膈膄蚄螇羁蒂蚃衿嗉莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅腽蒅蝿肈罴莁螈螇芁芇莄袀肄腽莄羂艿蒂莃蚂肂莈蒂蛳芈芄蒁袆肀膀蒀罿袃荟葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羁莇薄罿膄芃薃虿罴艿薃袁节膅薂羄肃蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆罗袂芈蚅蚄膈膄蚄螇羁蒂蚃衿嗉莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅腽螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羁莇薄罿膄芃薃虿罴艿薃袁节膅薂羄肃蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆罗袂芈蚅蚄膈膄蚄螈螇芁芇莄袀肄腽莄羂艿蒂莃蚂肂莈蒂蛳芈芄蒁袆肀膀蒀罿袃荟葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羁莇薄罿膄芃薃虿罴艿薃袁节膅薂羄肃蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆罗袂芈蚅蚄膈膄蚄螇羁蒂蚃衿嗉莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅腽蒅蝿肈罴莁螈螇芁芇莄袀肄腽莄羂艿蒂莃蚂肂莈蒂蛳芈芄蒁袆肀膀蒀罿袃荟 罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀 聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃 芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈 蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆 艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀 薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅 莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿 蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肃芁荟螁膅莃蛳聿膄蒆薇罗腽蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羁腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肃芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀荟袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃 蒈蚂螂羂薁袈肀肁芀蚁罴肁莃袆袂肀薅虿 网络接口 Y USB接口 网络驱动 JTAG 电源晶振 读取接收数据包的地址 读取数据包第一个字节 保存以太网协议头 接收有效数据 内部接收数据缓存区 开始 结束 清除 结束 开始 发送数据 写入发送数据长度 数据发送缓存区 16位数据写入 以太网首部 IP首部 TCP首部 应用数据 IP首部 TCP首部 应用数据 以太网驱动程序 TCP首部 应用数据 APPL 用户数据 用户数据 应用程序 TCP IP N Y Y N N Y 结束 是TCP包 是ICMP包 是IP包 是ARP包 4 461500 2 6 6 2 目的 以太 网地 址 硬件地址长度 发送 端以 太网 地址 可选域 协 议 类 型 硬 件 类 型 帧 类 型 以太 网源 地址 以太 网目 的地 址 开始 报错 重新判断是 否是ARP Y 是请求 是响应 报错 接受响应 发送回应 是否是新的IP地 址 更新ARP高速缓存 结束 开始 ARP输出请求 查找ARP高速 缓存表 分配表空间 将本地IP地址和物理地 址以及目的IP地址广 播物理地址写入缓存中 发送ARP分组请求 结束 开始 报错 重新判断是否 是IP 获取IP首部信息 记录可选字段 有无可选字段 首部检验和是 否正确 Y 更新ARP高速缓存 返回数据部分长度 开始 ARP表中能找到 MAC地址 是ICMP 是TCP 将IP包存入发送缓存区 计算IP首部校验和 要发送的数据 将各类协议字段的值填入 并加上要发送的数据 发送数据 结束 结束 将IP包存入ICMP缓存区 返回ARP缓存没有准备好 报错 N N N Y N 开始 重新判断是不 是ICMP 检验和是否 正确 响应应答 报错 响应请求 发送响应应答 结束 帧的传输方向 FCS 写入数据命令 Y Y N Y Y 读取16位数据 01H N Y 套接字打开 结束 开始 发送数据 进行IP封装 数据缓存指向P协头 重新判断是否 TCP 报错 获取TCP首部信息 获取TCP首部信息 套接字是否打 开 不处理 理 理 验证校验和 报错 调用TCP套接字侦听事件 返回 1 数 据 类 型 发送端的 MAC地址 目的端的 MAC地址 6 6 1 2 4 4 目的 IP地 址 1 以太网首部 28字节ARP请求应答 6 6 发送 端IP 地址 协议地址长度 2 2 Y N Y N N N N 保存校验和 计算校验和 填入TCP协议头 Y N N N N 报错 N Y Y Y Y 调用TCP协议处理 Y Y Y 调用ICMP协议处理 Y N N N N N Y N N N EM向PC上传数据 N 不支持 报错 Y 结束 回应注册 N 调用ARP协议处理 Y EM要求PC注册 N PC读取EM参数 0x33 0x32 命令字为0x01 数据有效机器
本文档为【基于DM9000A的TCP通信设计论文最终版】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_260251
暂无简介~
格式:doc
大小:100KB
软件:Word
页数:0
分类:
上传时间:2017-10-11
浏览量:8