資源描述:
《lwip協(xié)議棧架構(gòu)與設(shè)計(jì)解析》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、LWIP協(xié)議棧及接口提取Version1.02012/06/20第18頁共18頁版本1.0姓名部門郵件作者雷巖Leiyan3521@163.com審閱第18頁共18頁版本歷史版本日期修訂姓名Rev1.02011/11/07FirstDraftleiyan第18頁共18頁目錄一、LWIP介紹5二、LWIP源碼分析71.LWIP協(xié)議棧的架構(gòu)72.各個文件夾介紹83.模塊及源文件介紹10三、LWIP協(xié)議棧處理數(shù)據(jù)流程17四、接口提取18第18頁共18頁一、LWIP介紹首先說明一下,這篇文檔的主要目的是提取網(wǎng)絡(luò)發(fā)送和接收數(shù)據(jù)的函數(shù)接口。然后用我們自己的驅(qū)動網(wǎng)卡的接口函數(shù)替代程
2、序中的接口。如果對LWIP協(xié)議棧本身沒什么興趣的,可以跳過第一、二、三章,直接閱讀第四章,使用我們的接口代替第四章的接口就行了。寫第一、二、三章的主要目的是為了方便理解數(shù)據(jù)的發(fā)送和接收在LWIP協(xié)議棧中是如何進(jìn)行處理的。這便于我們理解提取出來的接口。LWIP是瑞典計(jì)算機(jī)科學(xué)院開發(fā)的一套用于嵌入式系統(tǒng)的開放源代碼的輕量級的TCP/IP協(xié)議棧。傳統(tǒng)的,或者說是典型的TCP/IP協(xié)議族的設(shè)計(jì)都是按照分層的思想來設(shè)計(jì)的。這樣設(shè)計(jì)有個好處,就是每層相對于其他層獨(dú)立,代碼方便理解。缺點(diǎn)就是,每層之間進(jìn)行數(shù)據(jù)交互的時候必須要進(jìn)行復(fù)制,而數(shù)據(jù)的復(fù)制是很耗時的,這就降低了實(shí)時性。LWI
3、P采用了一種不同的設(shè)計(jì)方式來實(shí)現(xiàn)TCP/IP協(xié)議族。LWIP各層之間沒有明顯的界限,各層之間都可以訪問到共享在內(nèi)存中的數(shù)據(jù)。因?yàn)楦鲗佣伎梢栽L問共享內(nèi)存,所以這就避免了內(nèi)存復(fù)制產(chǎn)生的性能損失。但是并不是說LWIP就沒有分層的概念了。只不過LWIP各層都是邏輯意義上的層。每個協(xié)議都以模塊的形式被實(shí)現(xiàn)。而這些模塊就共同組成了LWIP整體。下面一章將分析LWIP的源碼,結(jié)合源碼介紹這些模塊。了解各個協(xié)議是怎么通過模塊被實(shí)現(xiàn)的。其中這里最主要的是TCP協(xié)議模塊的實(shí)現(xiàn)。TCP協(xié)議在LWIP協(xié)議棧中占得比例最大,有將近一半的代碼是專門用來實(shí)現(xiàn)TCP協(xié)議的。所以重點(diǎn)會分析TCP協(xié)議。
4、并且無線音頻項(xiàng)目采用的也是TCP協(xié)議傳輸數(shù)據(jù)。LWIP邏輯上被分為四個層:應(yīng)用層,傳輸層,網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。如下圖1.1所示:第18頁共18頁圖1.1LWIP協(xié)議棧的分層模型應(yīng)用層主要是使用LWIP協(xié)議棧開發(fā)相應(yīng)的網(wǎng)絡(luò)通信程序。LWIP主要提供了三種接口供用戶使用。三種接口分別為RAWAPI,NetconnAPI和BSDSocketAP。其中RAWAPI主要是采用回調(diào)函數(shù)的方式來完成數(shù)據(jù)的發(fā)送和接收,RAWAPI接口寫的應(yīng)用程序與LWIP協(xié)議棧處在同一個進(jìn)程(或者稱任務(wù))中。NetconnAPI和BSDSocketAP工作于多線程方式中,要使用者兩種接口,必須有多任
5、務(wù)的操作系統(tǒng)的支持。這次項(xiàng)目采用的接口是RAWAPI。關(guān)于RAWAPI接口如何寫應(yīng)用層程序,另寫了一個專門的文檔介紹。這里不列出。傳輸層。我們最熟悉的TCP協(xié)議,UDP協(xié)議,以及我們使用ping命令時采用的ICMP協(xié)議都處在這一層。這一層提供了一些專門的接口,用于處理與應(yīng)用層和網(wǎng)絡(luò)層的數(shù)據(jù)傳送(注明,這里說的數(shù)據(jù)傳送并不是指數(shù)據(jù)的拷貝。事實(shí)上,LWIP協(xié)議棧使用的是內(nèi)存共享技術(shù),各層都能訪問這段共享內(nèi)存,各層傳遞的就是數(shù)據(jù)結(jié)構(gòu)指針,所以LWIP協(xié)議棧降低了內(nèi)存復(fù)制所產(chǎn)生的性能損失)。關(guān)于這層函數(shù),會在下面進(jìn)行具體說明。網(wǎng)絡(luò)層主要的協(xié)議是IP協(xié)議。這一層主要是對底層接收
6、的數(shù)據(jù)包進(jìn)行發(fā)送,轉(zhuǎn)發(fā),丟棄組合等功能。網(wǎng)絡(luò)接口層是和底層硬件驅(qū)動交互的層。我們所需要提取的網(wǎng)絡(luò)接口就在這一層。第18頁共18頁二、LWIP源碼分析1.LWIP協(xié)議棧的架構(gòu)LWIP協(xié)議棧源碼的架構(gòu)如下圖2.1所示:圖2.1LWIP協(xié)議棧源碼架構(gòu)api目錄:應(yīng)用程序接口文件,包括netconn和BSD2種API。這個文件夾主要是為了方便應(yīng)用程序編寫而為應(yīng)用層提供的API接口。core目錄:ICMP,IP,TCP,UDP協(xié)議的實(shí)現(xiàn)文件,以及一些輔助函數(shù),LWIP實(shí)現(xiàn)的核心代碼。其中這個文件夾里面實(shí)現(xiàn)TCP協(xié)議的代碼量幾乎占了整個lwip協(xié)議棧的一半。重點(diǎn)會討論TCP協(xié)議。
7、在此也可以簡單看出LWIP協(xié)議棧沒有嚴(yán)格區(qū)分傳輸層和網(wǎng)絡(luò)層,因?yàn)閭鬏攲拥拇a和網(wǎng)絡(luò)層的代碼放在一個文件夾里實(shí)現(xiàn)了。目錄里還提供了RAWAPI接口的實(shí)現(xiàn)。RAWAPI接口和上面兩種接口一樣,都是為了方便應(yīng)用程序編寫而為應(yīng)用層提供的API接口。include目錄:主要是LWIP協(xié)議棧使用的自定義的一些頭文件。netif目錄:這個目錄里主要實(shí)現(xiàn)的是ARP協(xié)議。當(dāng)然還有一些PPPOE等協(xié)議。當(dāng)然PPPOE協(xié)議不是我們所關(guān)心的。port目錄:最后寫這個目錄,主要是因?yàn)檫@個目錄是我們最終所要修改的一個目錄??梢钥吹酱四夸浵掳粋€ethernetif.c文件。這