新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 一種uIP TCP/IP協(xié)議棧在51系列單片機上的實現(xiàn)

一種uIP TCP/IP協(xié)議棧在51系列單片機上的實現(xiàn)

作者: 時間:2011-08-04 來源:網(wǎng)絡 收藏

 一 引言

本文引用地址:http://m.butianyuan.cn/article/172581.htm

  隨著信息技術的不斷發(fā)展,以及人們對日常生活舒適度、方便度要求的提高,信息家電、智能儀表等產(chǎn)品越來越頻繁的出現(xiàn)在我們的生活當中;人們也越來越熱衷于把家電、儀表等設備連接到Internet 中,從而可以方便、及時的對它們進行遠程察看、遠程控制。把這些設備接入Internet ,就需要考慮 網(wǎng)絡。

  51機是對目前所有兼容Intel 8031指令系統(tǒng)的機的統(tǒng)稱。該機的始祖是Intel的8031單片機,后來隨著Flash rom技術的發(fā)展,8031單片機取得了長足的進展,成為目前應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89,它廣泛應用于工業(yè)測控系統(tǒng)之中。目前很多公司都有51的兼容機型推出,在目前乃至今后很長的一段時間內將占有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的。需要注意的是52系列的單片機一般不具備自編程能力。本文將簡要描述方法,分析棧的應用接口,并討論如何將其應用到51系列單片

  二 棧的方法簡述

  uIP協(xié)議棧主要提供了三個函數(shù)供系統(tǒng)底層調用。即uip_init(), uip_input() 和uip_periodic()。其與應用程序的主要接口是UIP_APPCALL( )。ip_init()是系統(tǒng)初始化時調用的,主要初始化協(xié)議棧的偵聽端口和默認所有連接是封閉的。當網(wǎng)卡驅動收到一個輸進包時,將放進全局緩沖區(qū)uip_buf中,包的大小由全局變量uip_len約束。同時將調用uip_input()函數(shù),這個函數(shù)將會根據(jù)包首部的協(xié)議處理這個包和需要時調用應用程序。當uip_input()返回時,一個輸出包同樣放在全局緩沖區(qū)uip_buf里,大小賦給uip_len.假如uip_len是0,則說明沒有包要發(fā)送。否則調用底層系統(tǒng)的發(fā)包函數(shù)將包發(fā)送到網(wǎng)絡上。uIP周期計時是用于驅動所有的uIP內部時鐘事件。當周期計時激發(fā),每一個TCP連接都會調用uIP函數(shù)uip_periodic()。類似于uip_input()函數(shù)。uip_periodic()函數(shù)返回時,輸出的IP包要放到uip_buf中,供底層系統(tǒng)查詢uip_len的大小發(fā)送。

  uIP實現(xiàn)了協(xié)議集的四個基本協(xié)議:ARP地址解析協(xié)議,IP網(wǎng)際互聯(lián)協(xié)議, ICMP網(wǎng)絡控制報文協(xié)議和TCP傳輸控制協(xié)議。為了在8位16位處理器上應用,uIP協(xié)議棧在各層協(xié)議實現(xiàn)時采用有針對性的方法,保持代碼大小和存儲器使用量最小。

  1 實現(xiàn)ARP地址解析協(xié)議時為了節(jié)省存儲器,ARP應答包直接覆蓋ARP請求包。

  2 實現(xiàn)IP網(wǎng)絡協(xié)議時對原協(xié)議進行了極大的簡化,它沒有實現(xiàn)分片和重組。

  3 實現(xiàn)ICMP網(wǎng)絡控制報文協(xié)議時,只實現(xiàn)echo(回響)服務。uIP在生成回響報文時并不重新分配存儲器空間,而是直接修改echo請求報文來生成回響報文。將ICMP類型字段從echo類型改變成 echo reply類型,重新計算校驗和修改校驗和字段。

  4 uIP里的TCP沒有實現(xiàn)發(fā)送和接收數(shù)據(jù)的滑動窗口。每個TCP連接的狀態(tài)由uip_conn結構保存,uip_conn結構包括當?shù)睾瓦h端的TCP端口編號,遠程主機的IP地址,重發(fā)時間值,上一段重發(fā)的編號,和連接的段的最大尺寸等信息。一個uip_conn結構數(shù)組用于保存所有的連接,數(shù)組的大小為支持的同時連接的最大數(shù)量。為了減少儲存器的使用量,在處理重發(fā)時uIP并不緩存發(fā)送的數(shù)據(jù)包,而是由應用程序在需要重發(fā)時重新生成發(fā)送的數(shù)據(jù)。

  三 uIP協(xié)議棧的接口

  uIP協(xié)議棧為了具有最大的通用性,在實現(xiàn)時將底層硬件驅動和頂層應用層之外的所有協(xié)議集打包在一個庫里。協(xié)議棧通過接口與底層硬件和頂層應用通信.通過這種方式,uIP具有極高的通用性和獨立性,移植到不同系統(tǒng)和實現(xiàn)不同的應用都很方便,很好的體現(xiàn)了協(xié)議平臺無關性的特點。uIP協(xié)議棧與系統(tǒng)底層和應用程序之間的接口關系如圖(一)所示:

  1 uIP協(xié)議棧與系統(tǒng)底層的接口

  uIP與系統(tǒng)底層的接口包括與設備驅動的接口和與系統(tǒng)定時器的接口兩類。

  1.1 uIP與設備驅動接口

  uIP通過函數(shù)uip_input()和全局變量uip_buf、uip_len來實現(xiàn)與設備驅動的接口。uip_buf用于存放接收到的和要發(fā)送的數(shù)據(jù)包,為了減少存儲器的使用,接收數(shù)據(jù)包和發(fā)送數(shù)據(jù)包使用相同的緩沖區(qū)。uip_len表明接收發(fā)送緩沖區(qū)里的數(shù)據(jù)長度,通過判斷uip_len的值是否為0來判斷是否接收到新的數(shù)據(jù),是否有數(shù)據(jù)要發(fā)送。當設備驅動接收到一個IP包并放到輸入包緩存里(uip_buf)后,應該調用uip_input()函數(shù)。uip_input()函數(shù)是uIP協(xié)議棧的底層入口,由它處理收到的IP包。當uip_input()返回,若有數(shù)據(jù)要發(fā)送,則發(fā)送數(shù)據(jù)包放在包緩沖區(qū)里。包的大小由全局變量uip_len指明。如果uip_len是0,沒有包要發(fā)送;如果uip_len大于0則調用網(wǎng)絡設備驅動發(fā)送數(shù)據(jù)包。

tcp/ip相關文章:tcp/ip是什么



上一頁 1 2 3 4 下一頁

評論


相關推薦

技術專區(qū)

關閉