<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 嵌入式系統中TCP/IP協(xié)議的精簡(jiǎn)與實(shí)現

嵌入式系統中TCP/IP協(xié)議的精簡(jiǎn)與實(shí)現

——
作者: 時(shí)間:2007-08-28 來(lái)源:微計算機信息 收藏

摘要: 通過(guò)對的分析,結合的特點(diǎn),挑選出一套精簡(jiǎn)、實(shí)用的子集,并詳細介紹各協(xié)議層的實(shí)現過(guò)程。為嵌入式系統的開(kāi)發(fā)提供一個(gè)較為簡(jiǎn)單且可行的思路。

關(guān)鍵詞,,, UDP, ARP

1、引言

    嵌入式系統就是在嵌入式設備上實(shí)現了互聯(lián)功能的系統,一般要求嵌入式設備在軟件上支持TCP/IP協(xié)議棧,實(shí)現有關(guān)的協(xié)議。如何實(shí)現TCP/IP協(xié)議是嵌入式網(wǎng)絡(luò )系統的關(guān)鍵技術(shù)之一,在中應用TCP/IP協(xié)議的關(guān)鍵是,如何設計出精簡(jiǎn)、高效的TCP/IP協(xié)議子集,以此來(lái)減少對系統資源的占用。

    目前使用廣泛的TCP/IP協(xié)議棧有LWIP(Light Weight)、uIP、Linux IP等,這些協(xié)議棧具有一定的通用性,包含的協(xié)議內容比較全,同時(shí)也比較復雜。具體在移植到應用系統的時(shí)候要考慮的問(wèn)題較多,各個(gè)庫文件和全局變量相互交叉引用,若要針對特定系統進(jìn)行精簡(jiǎn),則牽一發(fā)而動(dòng)全身,尤其是存儲器的管理及上層協(xié)議與底層網(wǎng)絡(luò )驅動(dòng)的接口是兩個(gè)最大的移植難題。

    為了能對TCP/IP協(xié)議有較深的了解,又利于后期進(jìn)行深入研究,我們在實(shí)現一具體的Internet網(wǎng)絡(luò )報警系統時(shí),進(jìn)行自主的嵌入式TCP/IP協(xié)議開(kāi)發(fā)。下文所介紹的TCP/IP協(xié)議系統由于精簡(jiǎn)而利于實(shí)現,且無(wú)需進(jìn)行內存管理,適合傳送數據量不大的嵌入式系統。在實(shí)現時(shí),只要根據相應的數據幀格式,在各層完成相應的功能即可。非常適合研究學(xué)習之用,為嵌入式網(wǎng)絡(luò )系統的開(kāi)發(fā)提供一個(gè)較為可行且簡(jiǎn)單的思路。

2、協(xié)議的分析與選擇

    眾所周知,TCP/IP是一個(gè)協(xié)議族,是幾百種網(wǎng)絡(luò )協(xié)議的集合。通用計算機系統有足夠的資源支持協(xié)議在內核實(shí)現,但是嵌入式系統則不同,因為其CPU處理能力和系統存儲能力都受到成本限制,充分利用資源、提高系統性?xún)r(jià)比是開(kāi)發(fā)嵌入式應用的根本特點(diǎn)。所以要對TCP/IP協(xié)議進(jìn)行精簡(jiǎn)以適應嵌入式系統。

    下面我們以實(shí)際的Internet網(wǎng)絡(luò )報警系統為例,設計一個(gè)較為精簡(jiǎn)的TCP/IP協(xié)議子系統。此系統采用32位ARM結構的三星S3C440BX處理器,加SMSC公司的控制芯片LAN91C113,以及另外一些外圍芯片組成。此系統要求經(jīng)Internet傳送一些現場(chǎng)采集的報警數據到遠程站點(diǎn),要求實(shí)時(shí)性好、傳輸速度快,但每次傳輸的數據量很少,只是簡(jiǎn)單的報警信息。根據這些要求,再經(jīng)詳細分析TCP/IP各協(xié)議層實(shí)現的功能,精簡(jiǎn)出的協(xié)議子集如圖1:

層次

需要實(shí)現的協(xié)議

應用層

無(wú)

傳輸層

UDP

網(wǎng)絡(luò )層

IP、ICMP中的Ping響應協(xié)議

鏈路層

ARP應答協(xié)議

圖1 精簡(jiǎn)的TCP/IP協(xié)議子集

    首先在鏈路層上,由于采用以太網(wǎng)的接入方式,系統必須要實(shí)現IEEE802.3所規定的CDMA/CD協(xié)議。CDMA/CD協(xié)議不需用戶(hù)實(shí)現,此協(xié)議只要采用通用的以太網(wǎng)接口芯片就可支持。其次,為了保證系統在以太網(wǎng)中的,系統還需實(shí)現ARP應答協(xié)議,該協(xié)議用于將IP地址映射成以太網(wǎng)MAC地址。ARP的執行依靠維持一張表來(lái)完成IP地址和MAC的地址的映射。

    在網(wǎng)絡(luò )層,由于系統要求能夠在Internet進(jìn)行通信,因此系統要實(shí)現IP協(xié)議。IP層的代碼有兩個(gè)功能:驗證到來(lái)的IP報文報頭的正確性,并且對TCP和ICMP報文實(shí)行分流。因為不考慮IP的分片和重組,所以 IP層的代碼非常的精簡(jiǎn)。為了能夠測試系統與網(wǎng)絡(luò )的連接,系統需要實(shí)現ICMP協(xié)議中的Ping應答協(xié)議,Ping應答協(xié)議主要是檢查網(wǎng)絡(luò )是否連通

    在傳輸層, TCP為兩臺主機提供面向連接的、可靠的、無(wú)重復的雙向數據流傳輸服務(wù),TCP協(xié)議設計了嚴格的3次建立連接握手過(guò)程、4次關(guān)閉連接握手過(guò)程,這些過(guò)程的實(shí)現對系統資源的耗費非常大。而UDP的實(shí)現比較簡(jiǎn)單,它在某些嵌入式Internet的應用場(chǎng)合可以很好地應用??紤]到系統的簡(jiǎn)化及速度的要求,采用了UDP協(xié)議,為了確保UDP數據的到達,在應用程序中采用了重復發(fā)送、回復確認的方式來(lái)保證數據的正確性。

    由于本嵌入式系統無(wú)HTTP、FTP等應用,所以應用層中的協(xié)議無(wú)需實(shí)現。

3、協(xié)議的實(shí)現

    本系統由于協(xié)議比較精簡(jiǎn),只保留了必須使用的一些協(xié)議,所以實(shí)現過(guò)程相對簡(jiǎn)單。實(shí)現過(guò)程中的一個(gè)總目標是系統開(kāi)銷(xiāo)要少,每一層之間要相互獨立,內存操作簡(jiǎn)單。為了實(shí)現每一層的獨立,實(shí)現上下層之間的數據透明傳輸。每層之間應通過(guò)一系列的函數進(jìn)行數據傳遞,同時(shí)為了減少由于數據拷貝引入的系統開(kāi)銷(xiāo),系統應通過(guò)指針操作,而不是數據拷貝方式,將緩沖區中的數據沿協(xié)議棧向上傳遞。

    由于TCP/IP的各層協(xié)議的各種數據格式,在各種資料中都有詳細說(shuō)明,這里就不再一一介紹。只詳細介紹總的結構、各層的功能及實(shí)現過(guò)程,為了便于調試,系統在實(shí)現時(shí)肯定是從底層開(kāi)始,一層一層往上實(shí)現。

1) 首先公共數據結構的定義:如MAC地址格式、IP地址格式、系統的地址配置、緩沖區格式及大小。

    其中MAC、IP地址格式都是固定的,系統的配置用于確定系統的IP地址及端口以及MAC地址值。在本系統中由于傳送的數據有限,只定義了4個(gè)用于傳送和接收數據的緩沖區每個(gè)長(cháng)度為150字節。

2)網(wǎng)絡(luò )驅動(dòng)接口:由于網(wǎng)絡(luò )驅動(dòng)也是我們自己編制的,所以與上層結合起來(lái)很順利,接收時(shí)采用中斷機制,當收到網(wǎng)絡(luò )中斷就讀取數據,根據包的種類(lèi)分別傳給ARP或IP協(xié)議,由每一層自行處理數據。發(fā)送時(shí)采用查詢(xún)方式,應用層準備好數據,一層層封裝并向下傳遞,最后經(jīng)由網(wǎng)絡(luò )驅動(dòng)程序發(fā)送。

3) 鏈路層ARP協(xié)議的實(shí)現:

    首先定義ARP數據幀頭結構及ARP高速緩沖表,數據幀必須根據標準定義,高速緩沖表至少要含有IP地址及相對應的MAC地址兩項。由于嵌入式系統所連接的對象數目較少且都比較固定,所以就去掉了緩沖表的定時(shí)刷新程序,這樣可以大大減少系統的刷新開(kāi)銷(xiāo)。

    這一部分的主要工作是:

a、根據上層數據包中的IP地址,在高速緩沖表中查出對應的MAC地址并填入包中相應位置。若表中沒(méi)有相應MAC地址,則按照格式組裝一個(gè)ARP請求包并發(fā)送,以得到對方MAC地址。

b、若收到ARP應答包,則更新ARP緩存表。

主要函數有:

struct pbuf * arp_packet(struct arpdata *q)// 把要發(fā)送的ARP數據打包成網(wǎng)絡(luò )格式字節流;

struct mac *arp_lookup (struct ip *p) // 根據IP地址在A(yíng)RP緩存表中查找MAC地址,若找不到則自動(dòng)向網(wǎng)絡(luò )廣播ARP請求;

void arp_input(struct pbuf *p)// 從驅動(dòng)程序傳入ARP幀數據,如果是ARP請求則發(fā)送一個(gè)ARP應答包,如果是ARP應答則更新ARP緩存表;

4)網(wǎng)絡(luò )層IP協(xié)議及Ping應答的實(shí)現:

    首先定義數據結構IP及ICMP數據幀格式,這兩者都要根據標準來(lái)定義。這一部分的主要工作有:

a、對上一層傳下來(lái)的數據包,加上IP首部和IP校驗和,發(fā)往下一層。以及對下一層傳上來(lái)的數據包,進(jìn)行校驗和檢查,若正確去掉IP首部,送往上一層。

b、為了便于測試要響應主機的PING程序,即如收到ICMP的回顯請求包,則按照格式組裝一個(gè)ICMP的回顯應答包并發(fā)送。

主要函數有:

int ip_input(struct pbuf* p);//輸入下一層的數據包,去掉IP首部傳給上一層;

int ip_send_data(struct pbuf *p,int len,int type,struct ip dst_ip);//將上一層的數據加上IP首部,并向下一層發(fā)送;

void ip_packet(struct pbuf *p,struct IP_data *q,int len);//IP首部和數據打包;

U16 ip_chksum(U8 *p,int len);//IP檢驗和計算;

void icmp_input(struct pbuf *p) 如果ICMP的回顯請求,則發(fā)一個(gè)應答包;

5)傳輸層UDP協(xié)議的實(shí)現:

    根據標準定義UDP數據幀格式。這一部分的主要工作有:對應用層傳下來(lái)的數據包,加上UDP首部和UDP校驗和,發(fā)往下一層。以及對下一層傳上來(lái)的數據包,進(jìn)行校驗和檢查,若正確去掉UDP首部,提出數據送給應用層。需注意的是,要產(chǎn)生一個(gè)偽首部用于UDP數據檢驗和計算。

主要函數有:

void udp_input(struct pbuf *p);//從下一層輸入UDP數據

void udp_output(U8 *str,struct ip dst_ip,U16 dst_port);//向下一層發(fā)送UDP數據

void makeup_pheader(struct ip *p,U16 len ,U8 *q);//產(chǎn)生偽首部用于UDP檢驗和計算

U16 udp_chksum(U8 *p,int len,U8 *p1,int len1);//計算UDP檢驗和

6)執行過(guò)程:

    當本地系統有數據要發(fā)送時(shí),首先在傳輸層將數據加上UDP首部,再到網(wǎng)絡(luò )層加IP首部,然后到鏈路層從ARP表中查詢(xún)相應的MAC地址,填入相應位置,并發(fā)給網(wǎng)絡(luò )驅動(dòng)程序傳到以太網(wǎng)上。

    圖2是用SPYNET軟件截取的本系統啟動(dòng)后第一次發(fā)送一串字符的整個(gè)網(wǎng)絡(luò )協(xié)議應答過(guò)程,由于是第一次發(fā)送, ARP表為空。所以當發(fā)送UDP數據時(shí)找不到目的IP地址對應的MAC地址,系統先發(fā)ARP請求,等對方回一個(gè)ARP應答,得到對方MAC地址,然后再發(fā)UDP數據包。

圖2 一個(gè)實(shí)際UDP數據包發(fā)送全過(guò)程

4、結束語(yǔ)

       由于嵌入式系統發(fā)展及互聯(lián)網(wǎng)絡(luò )的普及、遠程控制和信息家電的興起,嵌入式系統與互聯(lián)網(wǎng)絡(luò )的結合逐漸成為一種新的技術(shù)發(fā)展方向,嵌入式TCP/IP協(xié)議的選擇與實(shí)現是這一技術(shù)必須要面對的。很多時(shí)候在涉及TCP/IP協(xié)議時(shí),都容易被其復雜的體系結構所迷惑,而不敢輕易動(dòng)手,本文提出的這種嵌入式TCP/IP協(xié)議的選擇思路及給出的一套精簡(jiǎn)TCP/IP協(xié)議子集的實(shí)現過(guò)程,對于這一方面的研究很具有參考價(jià)值。

參 考 文 獻

1、李潤知,岳儉,李陽(yáng)陽(yáng)(2003).基于Web的嵌入式網(wǎng)絡(luò )管理系統.《計算機應用》.23(6):95-97.

2、許海燕,付炎主編(2002).嵌入式系統技術(shù)與應用.北京:機械工業(yè)出版社。

3 、(美)W.Richard Stevens著(zhù),范建華等譯(2000).TCP/IP詳解 卷1:協(xié)議.機械工業(yè)出版社。

4、李明,康靜秋,賈智平(2002).嵌入式TCP/IP協(xié)議棧的研究與開(kāi)發(fā)《計算機工程與應用》.2002(16):118-121.

5、洪錫軍,汪德才(2000).基于Internet的多功能遠程監控報警系統.《上海交通大學(xué)學(xué)報》.34(10):1370-1371.

tcp/ip相關(guān)文章:tcp/ip是什么




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>