TCP/IP在51單片機上的實現(xiàn)特點和方法
李章林1 ,張立民1
( 1 南開大學(xué)信息技術(shù)科學(xué)學(xué)院, 天津 300071 )
摘要:為了實現(xiàn)51單片機接入internet,開發(fā)基于51單片機的TCP/IP具有重要意義。為此開發(fā)了zlIP,它是針對51單片機的特點使用KeilC51編程語言編寫的TCP/IP,具有代碼量小和兼容BSD套接字(socket)用戶接口等特點。zlIP1.0版注重于運行速度,zlIP2.0版注重于用戶接口的易用性,以從不同的角度試驗在51單片機上實現(xiàn)TCP/IP的特點。通過比較兩個版本的優(yōu)缺點和吸收國內(nèi)外其它TCP/IP的優(yōu)點,分析了在單片機上實現(xiàn)TCP/IP的速度、程序大小、內(nèi)存大小、編譯器等特點,并針對這些特點總結(jié)和提出多種技巧和方法,并對這些技巧、方法的優(yōu)缺點進行了分析。最后講述了幾點關(guān)鍵技術(shù):設(shè)計清晰的TCP/IP和應(yīng)用層的接口、采用前后臺和多線程程序結(jié)構(gòu)的比較,內(nèi)存管理方法和防止多余的內(nèi)存拷貝,實現(xiàn)數(shù)據(jù)包整序重發(fā)和窗口控制等。
關(guān)鍵詞:TCP/IP;單片機;zlIP
中文分類號: 文獻標識碼:A 文章編號:1006-8740(2003)-00-0000-00
1 引言
隨著網(wǎng)絡(luò)應(yīng)用的不斷擴大,將各類電子設(shè)備接入Internet的需求越來越大。電子設(shè)備入網(wǎng)有多種解決方案:例如使用嵌入式系統(tǒng),如使用ARM+Linux;一些實現(xiàn)TCP/IP的芯片也已經(jīng)可以獲得,例如Analog
Devices推出的Internet Modem(1);在51系列單片機運行TCP/IP協(xié)議棧等。前兩種方案具有良好的性能,而在單片機上實現(xiàn)TCP/IP的方案具有很低的價格,在某些對網(wǎng)絡(luò)速度要求不高的領(lǐng)域,有廣闊的應(yīng)用前景。
2 TCP/IP在單片機上實現(xiàn)的特點
2.1 速度慢
我們先來了解51單片機網(wǎng)絡(luò)傳輸?shù)臉O限速率。TCP/IP發(fā)送過程中主要的運算量集中在三個部分:應(yīng)用程序?qū)?shù)據(jù)拷貝到RAM、計算TCP校驗和、將RAM中的數(shù)據(jù)包拷貝到網(wǎng)絡(luò)設(shè)備的發(fā)送緩沖區(qū)。對每一個字節(jié)數(shù)據(jù),兩次拷貝大致共使用12×2=24個指令周期;計算TCP校驗和使用16個指令周期。采用12M的晶振,最高網(wǎng)絡(luò)傳輸速度為25K字節(jié)/秒。實際上要比這個速度慢,zlIP第一版速度只有11.752K字節(jié)/秒。
為了提高速度可以采用快速的單片機比如Winbond公司的77E58或者AVR單片機,當然還可以提高晶振頻率。除此之外還有:使用KeilC時,盡量避免使用Reentrant函數(shù),Reentrant類型的函數(shù)比一般函數(shù)速度要慢很多,但是某些時候為了程序結(jié)構(gòu)的需要必須使用Reentrant,這就需要在速度和結(jié)構(gòu)之間作一個選擇;指針使用“指定存儲類型”的指針(memory-specific
pointer)(2);精簡協(xié)議棧去除運算量大但是用處不大的功能,目前zlIP中TCP定時重發(fā)時間是固定的,也沒有擁塞窗口控制,也沒有IP層路由算法;防止數(shù)據(jù)包的不必要的拷貝;優(yōu)化計算校驗和和內(nèi)存拷貝函數(shù)。
2.2 程序存儲空間和外部RAM空間不大
通常TCP/IP協(xié)議棧需要大量的RAM來存儲需要被應(yīng)答的TCP包,如果規(guī)定時間內(nèi)沒有被應(yīng)答則重發(fā)這個TCP包,被應(yīng)答以后釋放這個TCP包。
為了減小RAM使用量,能否不存儲需要被應(yīng)答的TCP包?(3)。當數(shù)據(jù)包需要重新發(fā)送時,如果能夠重新產(chǎn)生數(shù)據(jù)包所需的數(shù)據(jù),那時就可以不存儲。例如存在于EEPROM中的html網(wǎng)頁。但是這種方法存在以下兩個缺點:一,TCPIP和應(yīng)用層接口變得復(fù)雜。當需要重發(fā)時,必須需要應(yīng)用層重新產(chǎn)生數(shù)據(jù),實際上將TCP負責(zé)的重發(fā)機制轉(zhuǎn)移到了應(yīng)用層。應(yīng)用層程序編寫變得復(fù)雜。二,對數(shù)據(jù)無法重新產(chǎn)生的應(yīng)用不適用。例如語音采集。
2.3編譯器
TCP/IP一般采用C語言或者混合匯編來寫。以KeilC516.0編譯器為例。與X8086編輯的代碼不同,使用KeilC要注意函數(shù)重入、指針、函數(shù)指針這三個問題。使用可重入函數(shù)和一般指針(generic
pointer)使得程序代碼增大,運行速度變慢。使用函數(shù)指針時,要么需要手動重建調(diào)用樹(Call tree),要么將通過函數(shù)指針調(diào)用的函數(shù)都設(shè)置為可重入函數(shù)。所以盡量少用重入函數(shù)、函數(shù)指針和一般指針。
3 zlIP的特點和實現(xiàn)技巧
3.1
特點
其它的TCP/IP有l(wèi)wIP、uIP、ucIP、tinyTCP等。其中l(wèi)wIP、uIP、tinyTCP已經(jīng)成功地移植到了單片機。lwIP是專門為微處理器設(shè)計的TCP/IP協(xié)議棧,lwIP的功能很全面,但是相對來說代碼較大,有人做過移植lwip+ucOSII代碼量為60K(4)。uIP側(cè)重于減小代碼量(選擇AVR為目標器件時,代碼為5K左右)和減小RAM使用量(100字節(jié)左右)。uIP采用了不保存需要應(yīng)答的數(shù)據(jù)包的RAM使用方案,沒有和BSD的套接字接口兼容,應(yīng)用層接口較復(fù)雜。zlIP介于uIP和lwIP之間,它針對單片機設(shè)計,有中等代碼量和RAM使用量,使用套接字的應(yīng)用層接口,所有的外部變量都使用了xdata類型,全部指針都為明確存儲類型的指針,需要重入的函數(shù)已經(jīng)聲明為reentant,使用KeilC的小模式下編譯。使用12M晶振、KeilC編譯器、89C52單片下測試的技術(shù)參數(shù)如下:
表1:zlIP技術(shù)參數(shù)(Technical parameter of zlIP)
|
zlIP的版本 |
代碼量(字節(jié)) |
外部RAM使用量(字節(jié)) |
發(fā)送速度(字節(jié)/秒) |
|
1.0 |
6791 |
20K |
11.752K |
|
2.0 |
14464 |
4K |
5.892K |
2.0版主要功能有:支持套接字形式的多個TCP連接。支持多個網(wǎng)絡(luò)設(shè)備。支持通過網(wǎng)關(guān)發(fā)送數(shù)據(jù)包和數(shù)據(jù)包轉(zhuǎn)發(fā)功能。響應(yīng)ping命令。支持TCP包的整序、重發(fā)和窗口控制流量控制。
3.2 zlIP實現(xiàn)TCP/IP的技巧和方法
3.2.1設(shè)計套接字接口
zlIP接口函數(shù)基本和BSD的套接字接口相同。提供的用戶接口函數(shù)有:
l
TCPSocket()。函數(shù)原型:socket
* TCPSocket(IP_ADDR ScrIP)。功能:申請一個套接字。ScrIP是這個套接字的本地IP地址。返回socket類型指針,如果申請失敗返回NULL。
l
TCPConnect()。函數(shù)原型:BOOL
TCPConnect(socket * pTCB, IP_ADDR DestIP, WORD DestPort,void (* recv)(void *
buf,WORD size),void (* close)(socket * pSocket))。功能:向IP地址為DestIP的服務(wù)器的DestPort端口發(fā)起連接。參數(shù)recv和close用于設(shè)置當接收到數(shù)據(jù)包和對方要求關(guān)閉TCP連接時應(yīng)該調(diào)用的回調(diào)函數(shù)指針。連接成功返回TRUE,否則返回FALSE。
l
TCPSend()。函數(shù)原型:BOOL
TCPSend(socket * pTCB,void *buf,WORD DataSize)。功能:發(fā)送數(shù)據(jù)。發(fā)送數(shù)據(jù)的TCP連接是套接字指針pTCB對應(yīng)的連接,發(fā)送的數(shù)據(jù)的起始地址為buf,大小為DataSize。發(fā)送成功返回TRUE,否則返回FALSE。
l
TCPListen()。函數(shù)原型:BOOL
TCPListen(socket *pTCB,WORD ScrPort,void (* accept)(socket *pNewTCB)) 。功能:使用套接字pTCB在ScrPort端口監(jiān)聽。參數(shù)accept是當有客戶端向這個監(jiān)聽端口連接成功時調(diào)用的回調(diào)函數(shù)指針。
l
TCPClose()。函數(shù)原型:void
TCPClose(socket *pTCB)。功能:我方主動關(guān)閉連接時調(diào)用TCPClose函數(shù),它將要求關(guān)閉套接字pTCB對應(yīng)的連接。TCPClose返回以后這個TCP連接可能保持,因為另一方還沒有發(fā)起關(guān)閉請求。
l
TCPAbort()。函數(shù)原型:void
TCPAbort(socket *pTCB)。功能:當使用完這個套接字以后,調(diào)用TCPAbort,將這個套接字釋放,還給系統(tǒng)。
TCP/IP協(xié)議運行中,接收數(shù)據(jù)包到達、另一方發(fā)起關(guān)閉連接、另一方向我方發(fā)起連接這些事件發(fā)生以后如何通知應(yīng)用層?下面以收到數(shù)據(jù)包為例提供幾種思路:(1)TCP/IP模塊設(shè)置一個變量bRecv表征是否有數(shù)據(jù)包到達,應(yīng)用層必須反復(fù)的查詢這個變量,如果為TRUE,則調(diào)用一個接收函數(shù)接收這個數(shù)據(jù)包。但是這種方法增加了應(yīng)用層程序的復(fù)雜性。(2)固定的回調(diào)函數(shù)。當TCP層接收到一個數(shù)據(jù)包后調(diào)用OnReceive(pTCB,buf,size)函數(shù)。用戶必須在應(yīng)用層定義一個函數(shù)名為OnReceive的函數(shù)。然后在OnReceive函數(shù)中處理接收的數(shù)據(jù)。(3)回調(diào)函數(shù)指針。每個套接字保存函數(shù)指針recv,接收到數(shù)據(jù)時TCP調(diào)用recv指向的函數(shù)。這樣每個套接字可以獨立定義接收函數(shù),并且函數(shù)名可以任意。zlIP使用了第三種思路。它的回調(diào)函數(shù)指針有:
l
recv。原型為:void
(* recv)(void * buf,WORD size)。TCP接收到數(shù)據(jù)包時將調(diào)用這個函數(shù)。接收的數(shù)據(jù)的起始地址為buf,大小為size。
l
close。原型為:void (* close)(socket * pSocket)。TCP發(fā)現(xiàn)對方想關(guān)閉連接時調(diào)用這個函數(shù)。pSocket指出了是哪個連接。
l
accept。原型為:void (* accept)(socket *pNewTCB)。TCP發(fā)現(xiàn)另一方成功連接到我方某個端口時調(diào)用這個函數(shù)。pNewTCB是將要接管這個TCP連接的套接字指針。在accept()函數(shù)中還要設(shè)置pNewTCB的回調(diào)函數(shù)指針recv和close。
3.2.2 zlIP的輸入輸出流程簡介
和其它的多數(shù)TCP/IP協(xié)議一樣,zlIP采用了協(xié)議分層的結(jié)構(gòu)。分為應(yīng)用層、TCP層、IP層和網(wǎng)絡(luò)設(shè)備接口層。圖1描述了zlIP輸入和輸出數(shù)據(jù)包的流程以及需要調(diào)用的函數(shù)。輸出時,TCP層先查看unsend隊列,發(fā)現(xiàn)非空,將數(shù)據(jù)包插入隊列;發(fā)現(xiàn)為空,則查看對方窗口是否夠大能夠接收這個數(shù)據(jù)包,然后填寫TCP頭部信息。IP層需要選擇一個網(wǎng)絡(luò)設(shè)備接口,選擇的方法是:目的IP和該接口的子網(wǎng)掩碼相與是否等于子網(wǎng)掩碼。然后調(diào)用這個接口的Output函數(shù)來發(fā)送。zlIP提供了NetIfAdd()函數(shù),可以動態(tài)添加網(wǎng)絡(luò)設(shè)備接口。輸入時,Timer()函數(shù)調(diào)用每個接口的Input函數(shù)。IP層判斷IP版本、IP校驗和、判斷是否應(yīng)該轉(zhuǎn)發(fā)數(shù)據(jù)包,然后根據(jù)IP頭部的protocol字段將包傳給相應(yīng)的高層處理。TCP層,需要判斷TCP校驗和,然后在現(xiàn)有的套接字中查找,判斷是否有套接字可以接收這個數(shù)據(jù)包,判斷TCP序號是否為希望的,然后更新這個連接的狀態(tài)(包括釋放被應(yīng)答的數(shù)據(jù)包和TCP狀態(tài)機的轉(zhuǎn)化等),然后調(diào)用該套接字的回調(diào)函數(shù)recv。需要強調(diào)一下,如果接收的TCP的序號不在我方滑動窗口內(nèi),那么應(yīng)該馬上發(fā)送一個TCP應(yīng)答包,因為這很可能是我方發(fā)送的應(yīng)答包丟失了,我方接收的數(shù)據(jù)包是對方重發(fā)的TCP包。
3.2.3 單片機上實現(xiàn)TCP/IP的兩種程序結(jié)構(gòu)
從圖1可以看到,右方有一個Timer()函數(shù)。它的一個功能是調(diào)用TCPTimer(),TCPTimer用于處理TCP數(shù)據(jù)包的重發(fā)等功能。另一個功能是調(diào)用每個接口的Input()函數(shù)接收到達的數(shù)據(jù)包。Timer()函數(shù)必須在短時間(一般20ms)內(nèi)被調(diào)用一次,否則接收數(shù)據(jù)包和TCP定時等功能將停止。Timer()函數(shù)的調(diào)用有兩種方式查詢方式和中斷方式,Timer()函數(shù)的不同調(diào)用方式?jīng)Q定了兩種程序結(jié)構(gòu)。
(1)前后臺程序結(jié)構(gòu)(5)
查詢方式的調(diào)用對應(yīng)前后臺程序結(jié)構(gòu)。實現(xiàn)方法是:設(shè)置一變量bTimerOut,在定時中斷中將bTimerOut設(shè)置為真,應(yīng)用層在程序流程中反復(fù)查詢bTimerOut是否為真,真則調(diào)用Timer(),然后置bTimerOut為假。程序主流程必須是類似圖2的形式:程序主流程是一個大循環(huán),在循環(huán)中處理發(fā)送數(shù)據(jù)包等應(yīng)用層協(xié)議同時查詢bTimeOut。
缺點:由于Timer()必須在短時間內(nèi)被反復(fù)調(diào)用,這就要求大循環(huán)循環(huán)一次的時間要在20ms以內(nèi)。這給應(yīng)用程序的編寫帶來了限制,例如有時程序可能需要在大循環(huán)中等待鍵盤按下,但是這里這種長時間的等待是不允許的。
(2)多線程程序結(jié)構(gòu)
另一種方案是使用多線程。Timer()函數(shù)會自動地每隔20ms被調(diào)用一次。實現(xiàn)多線程有兩種方法:①
在單片機的定時中斷中調(diào)用Timer函數(shù);② 使用操作系統(tǒng)。
缺點:多線程程序結(jié)構(gòu)解決了前后臺程序的缺點。應(yīng)用程序再也不用套用固定的程序格式。但是,這是有代價的。使用多線程,這就意味著某些函數(shù)可能被重入,這些函數(shù)必須定義為reentrant類型,從而降低了運行速度。
多線程結(jié)構(gòu)還要注意網(wǎng)絡(luò)設(shè)備驅(qū)動函數(shù)被重入的問題。以NE2K的以太網(wǎng)卡驅(qū)動為例,拷貝數(shù)據(jù)包到網(wǎng)卡緩存前要先設(shè)置寄存器(例如起始地址),然后開始拷貝。如果設(shè)置完寄存器以后中斷發(fā)生,并且驅(qū)動函數(shù)被重入,那么寄存器的設(shè)置被修改,中斷返回以后拷貝將出錯�?梢允褂媒怪袛唷⑷謽酥疚�、信號量等方法防止重入。
3.2.4內(nèi)存管理方法和無多余數(shù)據(jù)包拷貝的實現(xiàn)
TCP/IP的內(nèi)存的管理方法這里介紹兩種:分頁方法和鏈表方法。
(1)分頁方法(6):內(nèi)存劃分為多個128字節(jié)大小的小頁和少量1536字節(jié)大小的大頁。一個頁分配給一個數(shù)據(jù)包。用一個數(shù)組memFlag記錄各個內(nèi)存頁是否已經(jīng)被分配。分配內(nèi)存的時候只要查找數(shù)組membFlag,以獲得一個空閑的內(nèi)存頁。為了提高查找的效率,可以將每次查找的起始頁設(shè)為上次找到的空閑頁的下一個頁。釋放時,將memFlag相應(yīng)的元素置為FALSE。在協(xié)議層之間傳送數(shù)據(jù)包只要傳送頁的序號就可以了。這種內(nèi)存管理方法,分配和釋放內(nèi)存的速度較快。但是由于頁的大小固定,不能和數(shù)據(jù)包大小相適應(yīng),造成內(nèi)存的浪費。

(2)鏈表方法:鏈表方法根據(jù)數(shù)據(jù)包大小分配相應(yīng)大小的內(nèi)存塊。如圖3所示,鏈表將內(nèi)存塊鏈接起來,used字段表示該內(nèi)存塊是否正在使用,pSstart和pEend表示數(shù)據(jù)部分有效數(shù)據(jù)的開始地址和結(jié)束地址。分配時,搜索內(nèi)存鏈表找到一個沒有分配的比所需空間大的內(nèi)存塊,截取所需的大小。該內(nèi)存塊被截取以后可能還有較多剩余,這時將剩余部分從原內(nèi)存塊中分離出來,成為一個新的內(nèi)存塊,并插入鏈表。釋放時,將used置為假,如果pNext或者pPre指向的內(nèi)存塊也是空閑的,將其和自己合并,以防止內(nèi)存分片(7)。在協(xié)議層之間傳送數(shù)據(jù)包只要傳送內(nèi)存塊的起始地址就可以了。這種內(nèi)存管理方法空間浪費小但是運算量相對較大。
無數(shù)據(jù)包拷貝是指除了獲得數(shù)據(jù)到RAM和數(shù)據(jù)包到網(wǎng)絡(luò)設(shè)備發(fā)送緩存這兩次拷貝外沒有數(shù)據(jù)包的拷貝。這節(jié)省了拷貝時間。介紹兩種實現(xiàn)方法:
(1)鏈表方式:例如當應(yīng)用層將DataSize大小的應(yīng)用層數(shù)據(jù)交給TCP層發(fā)送,一般的做法是申請一個DataSize+TCPHeadSize大小的內(nèi)存然后填寫TCP頭部,并將數(shù)據(jù)包拷貝到TCP的載荷中。使用鏈表方式:TCP層只申請TCPHeadSize大小的內(nèi)存,然后將這個TCPHead用鏈表連接到應(yīng)用層數(shù)據(jù)。這種方式缺點是:同一個數(shù)據(jù)包的內(nèi)存不連續(xù),這加大了計算校驗和內(nèi)存釋放的復(fù)雜度,運算量大。
(2)預(yù)留空間方式:應(yīng)用層為DataSize大小的數(shù)據(jù)包申請內(nèi)存的時候,實際申請的是DataSize+AllHeadSize,其中AllHeadSize表示所有協(xié)議頭部大小總和�?截悜�(yīng)用層數(shù)據(jù)時在其前面留出AllHeadSize大小的空余空間。內(nèi)存塊頭部的pStart指示了程序所在層的有效數(shù)據(jù)的開始,例如在應(yīng)用層時指向應(yīng)用層數(shù)據(jù)包的開始地址。應(yīng)用層將這個數(shù)據(jù)包傳給TCP層以后,TCP層只要在pStart-TCPHeadSize開始的內(nèi)存空間加一個TCP頭部即可。這種方式運算量很小,但是應(yīng)用層必須事先知道其底層的協(xié)議頭大小之和,違反了下層協(xié)議和上層無關(guān)的要求。
3.2.5如何實現(xiàn)整序、重發(fā)和窗口控制
zlIP使用了隊列緩存的方式來實現(xiàn)。這里隊列的一個元素指向一個數(shù)據(jù)包,隊列的最大長度沒有限制。對于整序,使用ooSeq隊列(7),如果發(fā)現(xiàn)接收的TCP包序號并不是希望的,但是序號在接收窗口內(nèi),此時我們不能立刻接收這個包也不應(yīng)丟棄,先將這個包放入ooSeq隊列。每當,一個希望的TCP包被接收以后,再查看ooSeq隊列現(xiàn)在是否有TCP包成為了希望的數(shù)據(jù)包,如果有則將其取出并處理。對于重發(fā),使用unacked隊列,每一個需要被應(yīng)答的TCP數(shù)據(jù)包發(fā)送以后都要放入unacked隊列,等到被應(yīng)答以后才從隊列中刪除。TCP重發(fā)定時只針對unacked隊列第一個TCP包,如果定時超出,重新發(fā)送,重發(fā)次數(shù)超出規(guī)定值,則報錯。對于窗口控制,使用unsend隊列,如果發(fā)現(xiàn)對方的窗口過小無法接收這個數(shù)據(jù)包,則只發(fā)送部分數(shù)據(jù),將多余部分放入unsend隊列,等待對方發(fā)來TCP包通知新的窗口大小時,再次判斷是否可以發(fā)送了。如果在unsend隊列不為空的情況下,我方應(yīng)用層傳來需要發(fā)送的數(shù)據(jù)包都應(yīng)插入unsend隊列。我方的TCP窗口的大小就是剩余內(nèi)存空間的大小。
3.2.6 捎帶應(yīng)答的實現(xiàn)
捎帶應(yīng)答指的是,當對方一個需要應(yīng)答的TCP包到達時,我方不馬上給予應(yīng)答,而是等待一個較短的時間。如果在這段時間內(nèi),我方有數(shù)據(jù)發(fā)送,則會捎帶給予了應(yīng)答,這減少了包的發(fā)送數(shù)量。
參考文獻
[1] (電子文獻)中國電子網(wǎng).ADI具有TCP/IP棧的單片Modem[Z].http://www.21ic.com.2000-10-11.
[2] (電子文獻)德國Keil公司.Cx51 Compiler[Z].http://www.keil.com.2001-5.103-110.
[3] (電子文獻)Adam Dunkels.uIP - A Free
Small TCP/IP Stack[Z].http://dunkels.com/adam/uip/index.html.2002-1-15.1
[4] (電子文獻)Adam Dunkels.lwIP - News
Archive[Z].http://www.sics.se/~adam/lwip/news.html.2001-1-9.
[5] (專著)jean j labrosse.μc/os-II-源碼公開的實時嵌入式操作系統(tǒng).邵貝貝等譯.[M]北京:中國電力出版社,2001.
29-30.
[6] (專著)Douglas E Comer,
David L stevens.用TCP/IP進行網(wǎng)際互連第二卷[M]北京:電子工業(yè)出版社 ,2000.24-25.
[7] (電子文獻)Adam Dunkels.Design and
Implementation of the lwIP TCP/IP Stack[Z].http://www.sics.se/~adam/lwip/
documentation.html.2001-2-20.10-19.
了解單片機TCP/IP更多方案:http://www.wyjjpt.com/products_serial_server.htm
The specialty and
method in implementation
of TCP/IP in 51 serial MCU
Li Zhanglin1 ,Zhang Limin1
(1
ABSTRACT:In order to connect a 51 serial MCU to internet, it’s
necessary to develop a TCP/IP especially for 51 serial MCU. So We developed
zlIP, a TCP/IP designed especially for 51 serial MCU with KeilC51. Its
specialties include small code size, compatibility with BSD socket interface
etc. In order to test different aspects in implementation TCP/IP on 51, zlIP
1.0 emphasized on speed while zlIP 2.0 emphasized on facility of user
interface. The thesis analyzed specialties, which include speed, code size, ram
usage and complier, by comparing the tow editions of zlIP and absorbing the
strong points of other TCPIP. The thesis promoted and summarized some methods according
to these specialties and compared these methods. Finally, the thesis analyzed
some key techniques: TCP/IP user interface design, comparison of back-front and
multithread programming structure, memory management and avoidance of redundant
copy of packets, realization of packets arrangement, resending and window
control.
Key word: TCPIP;
MCU; zlIP