当前位置:文档之家› 电子科学与技术单片机tcpip论文初稿

电子科学与技术单片机tcpip论文初稿

这是一份论文初稿直接交给老师会被骂个半死,谨记

摘要

TCP/IP协议是目前网络上应用最广泛的网络传输协议。如果单片机能够用此协议传输数据,那就意味着单片机控制的电子产品也能进入互联网。这将带来一系列好处,能进行远程控制,能够获得数据共享。对于实现基于51单片机的TCP/IP数据传输。需要以单片机为载体,熟悉TCP/IP协议栈,熟悉keilc编程,熟悉电子线路知识。通过对TCP/IP协议的研究和参考uIP协议栈,在单片机上对uIP进行了移植。最终实现了计算机以TCP/IP协议的通信方式对单片机进行了监控。设计过程中主要是构架TCP/IP协议栈,编写网卡驱动程序,编写应用程序。此通信协议的特点是代码和RAM使用量较小,可用在对通信速度要求不高的电子设备上。因为以单片机为载体,所以此通信协议无需太强调对速度的提高,反而应该把重点放在减少多余的功能,来减少对RAM的使用。设计过程并没让单片机接入互联网,控制单片机是通过上位机在局域网内对其进行连接的。

关键词:嵌入式,单片机,TCP/IP协议

Abstract

TCP/IP is the most widely used protocol at the present network transport protocol.If single-chip can transmit data thought this protocol , that means those electronics controlled by single-chip can connect to the Internet .This will get a series of benefits, for remote controlling, for data sharing and so on.For realizing the TCP/IP data transmission on single-chip .Need to be familiar with single-chip, familiar with TCP/IP protocol stack and Keilc programming, familiar with knowledge of electronic circuits.For researching the TCP/IP protocol and referencing the uIP protocol stack, than transplanted the uIP on single-chip.Finally completed the computer communicating to single-chip used by TCP/IP .This design is mainly on finishing the TCP/IP protocol stack, writing the driver of net chip, writing application programs.This communication protocol is characteristic of less code and RAM usage, can using in the low speed requirements of the electronic.Because of taking single-chip as the carrier, this protocol shouldn't be stressed on the speed of communication , instead it should be focused on reducing redundant functions for reducing the use of RAM. The design is not accessing the Internet, it is controlled by computer using the

connection by LAN.

Keywords: embedded system ,single-chip , TCP/IP

目录

1 绪论 (3)

2 TCP/IP协议 (4)

2.1TCP/IP简介 (4)

2.2TCP/IP的分层体系结构 (5)

2.3TCP/IP协议族 (6)

2.4IP地址、子掩码 (8)

3 UIP介绍 (10)

3.1U I P协议栈及其体系结构 (10)

3.2协议栈接口 (11)

3.2.1设备驱动程序接口 (12)

3.2.2应用程序接口 (13)

3.3U IP协议栈提供的主要接口汇总 (14)

4 UIP在单片机上移植 (15)

4.1了解U IP的的主循环代码架构并改写MAIN函数 (15)

4.2仿照UIP-1.0\UNIX\TAPDEV.C 写网卡驱动程序 (18)

3.2.1以太网的帧结构 (18)

4.2.2以太网的芯片RTL8019 介绍 (20)

4.3设置配置文件UIPOPT.H/UIP-CONF.H (24)

5 基于51单片机的TCP/IP协议通信 (26)

5.1硬件原理图设计 (26)

5.2主要代码文件说明 (27)

5.3计算机以TCP/IP协议通信方式监控单片机 (31)

6.结论 (32)

参考文献 (33)

致谢 (34)

附录 (35)

1 绪论

现在互联网开始向物联网发展,几乎所有电子产品都有入网的必要性。一旦电子产品能入网,就能做到对远在千里之外的电子产品进行控制。这将解决在某些恶劣环境下由人亲自操作电子设备而带来的危险。而单片机自带的串行通信又因传输距离太短而阻碍其应用范围。而且TCP/IP已成为当今计算机网络最成熟、应用最广的互联协议。Internet 采用的就是TCP/IP协议,网络上各种各样的计算机上只要安装了TCP/IP协议,它们之间就能相互通信。所以只要在单片机上实现居于TCP/IP协议的通信,就能让单片机控制的电子设备进入互联网,实现远程操作,数据共享。这里研究的TCP/IP协议栈可在各种8位CPU上运用。设计过程在保留协议的基本构架的基础上尽可能进行精简,以提高传输速度。并且对数据缓存进行压缩,以减少对单片机RAM的使用。在国外已有专门机构对在嵌入式设备上实现TCP/IP进行研究。例如由瑞典计算机科学学院(网络嵌入式系统小组)的Adam Dunkels开发的uIP。uIP协议栈是专门为嵌入式系统而设计的协议栈,其源代码由C 语言编写,并完全公开。还有uC/IP(mew-kip)是为为控制其设计的一个TCP/IP 协议栈。代码基于BSD(很像所有其它栈)但对非常小的覆盖范围功能有所减少。它当前为Linux和DOS目标而建。在国内ZLIP是专门为51单片机设计的嵌入式TCP/IP协议栈,可以在有操作系统和没有操作系统情况下运行,具有代码量适中、运行速度快、用

户接口简单、兼容BSD socket接口的特点。实现了TCP、UDP、ICMP、ARP协议,ZLWeb 实现了HTTP协议。支持多TCP连接、多UDP连接同时运行,可以用于51单片机TCP/IP 上网解决方案。但目前不管国内还是国外在单片机TCP/IP协议的研究上,都存在以下的问题:数据传输速度慢,对RAM的使用量都大于单片机自带RAM。要在单片机上实现TCP/IP协议需要对计算机网络知识有所了解。清楚理解TCP/IP协议在计算机网络的位置和作用。深入了解TCP/IP协议栈的构成。对单片机结构功能熟悉,能驱动一般的以太网卡,掌握C编程。本文主要对uIP移植到单片机上进行研究,难点是了解TCP/IP协议栈的构成和对网卡的驱动。在实现计算机通过网络对单片机控制的电子设备进行监控的功能时还要对计算机进行相应的配置。

2 TCP/IP协议

2.1 TCP/IP简介

TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。TCP/IP是一个四层的分层体系结构。高层为传输控制协议,它负责聚集信息或把文件拆分成更小的包。低层是网际协议,它处理每个包的地址部分,使这些包正确的到达目的地。

TCP/IP已成为当今计算机网络最成熟、应用最广的互联协议。Internet采用的就是TCP/IP协议,网络上各种各样的计算机上只要安装了TCP /IP协议,它们之间就能相互通信。运行TCP/IP协议的网络是一种采用包(分组)交换网络。TCP/IP协议是由100多个协议组成的协议集,TCP 和IP是其中两个最重要的协议。TCP和IP两个协议分别属于传输层和网络层,在Internet中起着不同的作用。

2.2 TCP/IP的分层体系结构

TCP/IP是一个分层体系结构。

最高层:应用层为协议的最高层,在该层应用程序与协议相配合,发送或接收数据。TCP/IP协议集在应用层上有远程登录协议(Telnet)、文件传输协议(FTP)、电子邮箱协议(SMTP)、域名系统(DNS)等,它们构成了TCP/IP的基本应用程序。

高层:即传输层,其主要协议有UDP(user data protocol)和传输控制协议(TCP,Transmission Control Protocol)。TCP协议是在IP协议提供的服务基础上,支持面向连接的、可靠地传输服务,是负责聚集信息或把文件拆分成更小的包。这些包通过网络传送到接收端的TCP层,接收端的TCP层把包还原为原始文件;UDP协议时直接利用IP协议进行UDP数据报的传输,因此UDP协议提供的是无连接、不保证数据完整到达目的地的传输服务。由于UDP不使用很繁琐的流控制或错误恢复机制,只充当数据报的发送者和接收者,因此,UDP比TCP简单得多。

低层:是网际协议(IP,Internet Protocol),它处理每个包的地址部分,使这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即使来自同一文件的分包路由也有可能不同,但最后会在目的地汇合。 TCP/IP使用客户端/服务器模式进行通信。TCP/IP通信是点对点的,意思是通信是网络中的一台主机与另一台主机之间的。TCP/IP与上层应用程序之间可以说是“没有国籍的”,因为每个客户请求都被看做是与上一个请求无关的。正是它们之间的“无国籍的”释放了网络路径,才使每个人都可以连续不断的使用网络。许多用户熟悉使用TCP/IP协议的高层应用协议。包括万维网(www,world wide web)的超文本传输协议(HTTP),文件传输协议(FTP),远程网络访问协议(Telnet)和简单邮件传输协议(SMTP)。这些协议通常和TCP/IP协议打包在一起。使用模拟电话调制解调器连接网络的个人电脑通常是使用串行线路接口协议(SLIP)和点对点协议(P2P)。这些协议压缩IP包后通过拨号电话线发送到对方的调制解调器中。与TCP/IP协议相关的协议还包括用户数据报协议(UDP),它代替TCP/IP协议来达到特殊的目的。其他协议是网络主机用来交换路由信息的,包括Internet控制信息协议(ICMP),内部网关协议(IGP),外部网关协议(EGP),边界网关协议(BGP)。

2.3 TCP/IP协议族

之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。以下是协议族中一些常用协议英文名称和用途:

TCP(Transport Control Protocol)传输控制协议

IP(Internet Protocol)因特网协议

UDP(User Datagram Protocol)用户数据报协议

ICMP(Internet Control Message Protocol)互联网控制信息协议

SMTP(Simple Mail Transfer Protocol)简单邮件传输协议

SNMP(Simple Network manage Protocol)简单网络管理协议

FTP(File Transfer Protocol)文件传输协议

ARP(Address Resolution Protocol)地址解析协议

TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP

位于协议簇的第三层(对应OSI的第四层)。

TCP和IP是TCP/IP协议簇的中间两层,是整个协议簇的核心,起到了承上启下的作用。

1.IP

网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。

IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP 包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,

许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。

2.TCP

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

3.UDP

UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询 ---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和 DNS(DNS也使用TCP)。

欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。

4.ICMP

ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP 可以使TCP连接‘体面地’终止。 PING是最常用的基于ICMP的服务。

5. TCP和UDP的端口结构

TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。

两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:

源IP地址发送包的IP地址。

目的IP地址接收包的IP地址。

源端口源系统上的连接的端口。

目的端口目的系统上的连接的端口。

端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows 使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。

2.4 IP地址、子掩码

目前,在Internet里,IP地址是一个32位的二进制地址,为了便于记忆,将它们分为4组,每组8位,由小数点分开,用四个字节来表示,而且,用点分开的每个字节的数值范围是0~255,如202.116.0.1,这种书写方法叫做点数表示法。

IP地址可确认网络中的任何一个网络和计算机,而要识别其它网络或其中的计算机,则是根据这些IP地址的分类来确定的。一般将IP地址按节点计算机所在网络规模的大小分为A,B,C三类,默认的网络屏蔽是根据IP地址中的第一个字段确定的。

以下只对C类进行详述:

C类地址的表示范围为:192.0.0.1到223.255.255.255,默认网络屏蔽为:

255.255.255.0;C类地址分配给小型网络,如一般的局域网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。C类网络用前三组数字表示网络的地址,最后一组数字作为网络上的主机地址。

一个C类地址是由3个字节的网络地址和1个字节的主机地址组成,网络地址的最高位必须是“110”,即第一段数字范围为192~223。每个C类地址可连接254台主机,Internet有2097152个C类地址段(32*256*256),有532676608个地址

(32*256*256*254)。

RFC 1918留出了3块IP地址空间(1个A类地址段,16个B类地址段,256

个C类地址段)作为私有的内部使用的地址。在这个范围内的IP地址不能被路由到Internet骨干网上;Internet路由器将丢弃该私有地址。

IP地址类别RFC 1918内部地址范围

A类10.0.0.0到10.255.255.255

B类172.16.0.0到172.31.255.255

C类192.168.0.0到192.168.255.255

子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。通过IP 地址的二进制与子网掩码的二进制进行与运算进行定某个设备的网络地址。也就是说通过子网掩码分辨一个网络的网络部分和主机部分子网掩码一旦设置,网络地址和主机地址就固定了。相对于使用子网掩码来识别网络地址,早期的使用类别进行网络地址的分类存在着地址大量浪费的不足。

3 uip介绍

3. 1 u I P协议栈及其体系结构

uIP由瑞典计算机科学学院(网络嵌入式系统小组)的Adam Dunkels开发。其源代码由C 语言编写,并完全公开,所有代码和相关说明文档可以到

https://www.doczj.com/doc/d714803583.html,/adam/uip/下载。最新版本是uIP1.0 版本,u l P 1.0是一个适用于8 /1 6位机上的小型嵌入式TCP/ IP协议栈,简单易用,资源占用少是它的设计特点。其设计重点放在IP、ICMP和TCP协议的实现上,协议虽然也同时实现了UDP和ARP协议,但仅将其作为可选模块。UIP 1.0处于网络通信的中间层,其上层协议在这里被称之为应用程序,而下层硬件或固件被称之为网络设备驱动。TCP / IP 协议组中的链路层协议如PPP等可由uIP之下的设备驱动实现;应用层协议如HTTP、FTP、SMTP等可由ulP之上的应用程序实现。这样的设计方式大大减小了协议代码量和RA M 占用量。表1列出了ulP在stc89c516rd上代码和RAM占用情况。

表3.1 uIP代码和RAM占用情况

协议模块代码大小/B 使用RAM/B

ARP 1324 118

IP/ICMP/TCP 3304 360

HTTP 994 110

校验和函数636 0

数据包缓存0 400

总和6258 988

3.2协议栈接口

ulP协议通过一系列接口函数与底层系统和上层应用程序通信,它内部的协议集合对外部系统来说是透明的,从而增强了该协议的通用性和独立性,可以非常方便地移植到不同系统和应用平台。图1描述了ulP、底层系统和应用程序三者之间的调用关系。其中ulP提供了3个函数给底层系统:uip_init ( ) ,uip_input ( ),uip_periodic ( ) 。应用程序向ulP提供一个调用函数uipappcall ( ) ,在网络事件或计时事件发生时进行调用,同时uIP也要向应用程序提供一些与协议栈的接口函数,应用程序根据接口函数提供的信息或者状态,执行相应的操作。

图 3.1 u l P底层系统和应用程序之间的调用关系

3.2.1设备驱动程序接口

u I P内核中有两个函数直接提供给底层设备驱动程序。一个是uip_ input ( ) ,当设备驱动程序从网络层收到的一个数据包时要调用这个函数,设备驱动程序必须事先将数据包存入到uipbur中包长放到uip_len,然后交由uip_input ( ) 处理。当函数返回时,如果uip_ len不为0,则表明有带外数据(如SYN,ACK等) 要发送。当需要ARP支持时,还需要考虑更新ARP表示或发出ARP请求和回应。以下代码即为设备驱动程序从网络层收到的一个数据包后的处理过程:

#define BUF ( ( struet uip_ethhdr *) &uip_buf[ O ] )

uip _len=ethemet_devicedriver_poll ( ) ;

// 接收以太网数据包( 设备驱动程序)

if(uip_len>0){ //收到数据

if(BUF->type::HTONS(UIP_ETHTYPE_IP)){

// 是I P包吗?

uip_arp_ipin();//去除以太网头结构,更新A R P表

uip_input ;//I P包处理

if(uip_len>0){ // 有带外回应数据

uip_arpout();// 加以太网头结构在主动连接时可能要构造ARP请求

ethemet_devicedriver_send();//发送数据到以太网( 设备驱动程序)

}

} else

if(sot->type==HTONS(UIP-ETHTYPE-ARP)){ //是A RP请求包

uip_arp_arpin ( ) ;//如果是ARP回应更新ARP表如果是请求,构造回应数据包if(uip_len>0) {// 是ARP请求,要发送回应

Ethernet_devicedriver_send();// 发ARP回应到以太网上

}

}

另一个ulP内核直接提供给底层设备驱动程序的函数是uip_periodic(conn) 。这个函数用于ulP内核对各连接的定时轮循,因此需要一个硬件支持的定时程序周期性地

用它轮循各连接,一般用于检查主机是否有数据要发送,如有,则构造I P包。以下示例即为u l P内核对各连接的定时轮循过程:

for(i=0;i

uip_periodic(i);

if(uip_len>0){

uip_arp_out();

ethemet_devicedriver_send();

}

}

从本质上来说uip_nput()和uip_periodic()在内部是一个函数,即uip_process(u8_flag) uIP的设计者将uip_process (UIP-DATA)定义成uip_input ( ) ,而将uip_process(UIP_TIMER)定义成uip_periodic(),因此从代码实现上来说是完全复用的。

3.2.2应用程序接口

uIP使用基于事件的程序模式,应用程序由c语言函数实现。当收发数据、新连接建立或者数据需要重新传输时,uIP都会调用应用程序。同时,应用程序还要周期查询是否有新的数据收发。因为应用程序只提供了一个回调函数,所以应用程序还要把不同的网络服务映射到不同的端口和连接。uIP在接受到底层传来的数据包后,如果需要送上层应用程序处理,就调用UIP_APPCLL()。同时,uIP设置结构体uIP_eonn指针指向当前连接。uIP_conn记录一条TCP连接的所有相关信息,它是维持uIP运行的关键结构,定义如下:

struct tcp_conn{

u8_t tcpstateflags;// T C P的状态和标志

u16_t lport,rpert ;// 当地和远端端口

u16_t fipodar[ 2 ] ;// 远端的地址

u8_t rcv_nxt [ 4 ] ;// 下一个要接收的序列号

u8_t sod _xt [ 4 ] ;//上一个已发送的序列号

u8_t aek -nxt [ 4 ] ;//对端下一个应答序列号

u8_t timer ;// 重传时间

u8_t nrtx ;//计算特殊段的重发数量

u8_t mss ;//连接中最大分段的大小

u8_t appstate [ UIP_APPSTATE_SIZE] ;

}

为了将用户的应用程序挂接到uIP中,必须将宏UIP_APPCALL ( ) 定义成实际的应用程序函数名,这样每当某个ulP事件发生时,内核就会调用该应用程序进行处理。如果要加入应用程序状态的话,必须将宏UIP_APPSTATE_SIZE定义成应用程序状态结构体的长度。在应用程序函数中,依靠ulP事件检测函数来决定处理的方法,另外可以通过判断当前连接的端口号来区分处理不同的连接。

3.3 uIP 协议栈提供的主要接口汇总

提供的接口在uip.h 中,为了减少函数调用造成的额外支出,大部分接口函数以宏命令实现的。

1.初始化uIP协议栈:uip_init()

2.处理输入包:uip_input()

3.处理周期计时事件:uip_periodic()

4.开始监听端口:uip_listen()

5.连接到远程主机:uip_connect()

6.接收到连接请求:uip_connected()

7.主动关闭连接:uip_close()

8.连接被关闭:uip_closed()

9.发出去的数据被应答:uip_acked()

10.在当前连接发送数据:uip_send()

11.在当前连接上收到新的数据:uip_newdata()

12.告诉对方要停止连接:uip_stop()

13.连接被意外终止:uip_aborted()

4 在单片机上移植uIP 4.1 了解uIP的的主循环代码架构并改写main函数

下面是uIP协议栈的主控制循环。

void main(void)

{

/*省略部分代码*/

/*设置TCP超时处理时间和ARP老化时间*/

tim er_set(&periodic_timer, CLOCK_CONF_SECOND / 2);

tim er_set(&arp_timer, CLOCK_CONF_SECOND * 10);

/*定时器初始化*/

init_T imer();

/*协议栈初始化*/

uip_init();

uip_arp_init();

/*应用层初始化*/

exam ple1_init();

/*驱动层初始化*/

etherdev_init();

/*IP地址、网关、掩码设置*/

uip_ipaddr(ipaddr , 192,168,1,9);

uip_sethostaddr(ipaddr);

uip_ipaddr(ipaddr , 192,168,1,16);

uip_setdraddr(ipaddr);

uip_ipaddr(ipaddr , 255,255,255,0);

uip_setnetm ask(ipaddr);

/*主循环*/

while(1)

{

/*从网卡读数据*/

uip_len = etherdev_read();

/*如果存在数据则按协议处理*/

if(uip_len > 0)

{

/*收到的是IP数据,调用uip_input()处理*/

if(BUF->type == htons(UIP_ETHTYPE_IP))

{

uip_arp_ipin();

uip_input();

/*处理完成后,如果uip_buf中有数据,则调用etherdev_send 发送出去*/

if(uip_len > 0)

{

uip_arp_out();

etherdev_send();

}

}

/*收到的是ARP数据,调用uip_arp_arpin()处理*/

else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {

uip_arp_arpin();

if(uip_len > 0)

{

etherdev_send();

}

}

}

/*查看0.5S是否到了,到了则调用uip_periodic处理TCP超时程序*/ els e if(timer_expired(&periodic_timer))

{

timer_reset(&periodic_timer);

for(i = 0; i < UIP_CONNS; i++)

{

uip_periodic(i);

if(uip_len > 0)

{

uip_arp_out();

etherdev_send();

}

}

/*查看10S是否到了,到了则调用ARP 处理程序*/

if(tim er_expired(&arp_timer))

{

timer_reset(&arp_timer);

uip_arp_ timer();

}

}

}

return ;

}

4.2 仿照 uip-1.0\unix\tapdev.c 写网卡驱动程序

4.2.1使用以太网的帧结构

下面以IEEE 802.3 数据帧来分析数据链路层和网卡的工作内容。IEEE 802.3是电气和电子工程师协会(IEEE)制定的一种描述物理层和数据链路层的实现方法的网络协议,主题是在多种物理媒体上以多种速率采用CSMA/CD 访问方式。其规定的帧结构如下:

表4.1 以太网(802.3)帧结构

PR(前导码):包括了7 个字节的二进制“1”、“0”间隔的代码,即1010 (10)

共56 位。当帧在链路上传输时,接收方就能建立起同步,因为这种“1”、“0”间隔的传输波形为一个周期性方波。同时也指明了传输的速率(10M 和100M 的方波频率不一样,所以100M 网卡可以兼容10M 网卡)。

SD(帧数据定界符):它是长度为1 个字节的10101011 二进制序列,此码表示表示下面跟着的是真正的数据。

DA(目的地址):目的以太网的物理地址,由48 位二进制组成(6 个字节),说明该帧传输给哪个网卡。如果地址为FFFFFFFFFFFF(广播地址),则该网络上的所有网卡都能接收到本帧数据。这个地址和下面的SA就是我们常说的网卡的MAC地址。具体信息我们待会介绍。

SA(源地址):48 位,说明该帧的数据是哪个网卡发的,即发送端的网卡物理地址(MAC)。

LENGTH/TYPE (长度/数据类型):指示后面的数据属于什么类型。如0800H表示数据为IP包,0806H 表示数据为ARP包。这样,交给网络层后就可以由相应的协议对后面的数据解析。如果这个字段小于0600H的值,则表示数据包的长度,在单片机的网络编程中不考虑这种用法。

DATA(数据段):由网络层负责发送和解析的数据,因为以太网帧传输的数据包

最小不能小于64 字节,最大不能超过1518 字节。除去14 字节为DA、SA、TYPE以及4 字节的FCS,DATA 不能超过1500 字节。如果不够46(64-18)字节,余下的由PAD 填充。

PAD(填充位):当DATA的数据不足46 字节时,缺少的字节需要补上(可补任意值)。

FCS(帧校验序列):由32 位(4 字节)循环冗余校检码(CRC)组成,其校验范围不包括前导码FR及帧数据定界符SD。此序列由发送端网卡自动生成,自动填充到帧的最后。一般情况下,接收端网卡对收到的数据校验后也不会将FCS放到数据中上报。由于网卡的自动管理,并且前导码FR和帧数据定界符SD的值是固定的,也由网卡自动生成和插入。所以,网络层向网卡发送的数据或者网络层接收到的数据一般是由DA、SA、TYPE和DATA组成(DATA不足46 字节需要用PAD补齐)。如表二。假如网络层的一个IP包要发送出去,首先要填充接收网卡的地址和本网卡的地址(MAC地址),同时将TYPE 填充成0800H,紧跟着就是发送的数据。网卡获取到这些数据后会组成物理传输帧发送出去。

表4.2 网络层管理的帧结构

由以太网的帧结构知道,在数据链路层就需要使用MAC 地址(即物理地址)进行通讯,MAC 地址是数据的第一道关卡,由硬件自动识别来接收。因此,MAC 地址就像是是网络设备的“身份证”一样,需要具有全球唯一性。在做测试时,可以修改MAC 地址,但也应该保证本地网络里MAC 的唯一性。

以太网的MAC 地址由48bit (6 字节)组成,如08:02:10:3A:85:23 就是一个MAC

地址。前24 位(08:02:10)是由生产网卡的厂商向IEEE申请的厂商地址,后24 位(3A:85:23)是由厂家自己分配。每个厂商必须确保它所制造的每个以太网设备都具有相同的前三个字节以及不同的后三个字节,这样就可保证世界上每个以太网设备都具有唯一的MAC 地址。网卡的MAC 地址通常是由生产厂家烧入网卡的EPROM 中

(NE2000 系列网卡常用93C46,在网卡上可以找到)。

MAC地址又可以分成3类:

相关主题
文本预览
相关文档 最新文档