| 導購 | 订阅 | 在线投稿
分享
 
 
 

lwIP――TCP/IP協議棧的一種實現(1)

來源:互聯網  2006-02-01 01:56:44  評論

1 介紹

近幾年來,對計算機互連及裝備有無線聯網設備的計算機的興趣越來越流行。計算機和日常設備越來越無縫集成在一起並且價格也在下降。同時無線網絡技術,如藍牙和IEEE 802。11b無線局域網也相繼出現。這將在很多領域如健康保健,安全,保險,運輸及處理産業等引發更多令人振奮的前景。小設備如傳感器等能接入一些已經存在的網絡基礎設施如全球因特網,也能在任何地方被監測到。

互聯網技術已經被證實足夠靈活的適應過去幾十年來不斷變化的網絡環境。互聯網技術起初是在如ARPANET的慢速網絡上發展起來的,但它現在卻運行在大量的連接技術及許多不同特征的帶寬和比特錯誤率上。由于大量使用互聯網技術的應用已被廣泛應用,在不久的無線網絡中使用現有互聯網技術有很大的益處。同時,全球互聯網的巨大互聯性是個很大的激勵。

由于小設備如傳感器經常被要求小型且便宜,網絡協議的實現必須處理受限制的計算資源及內存。這篇文章描述了一個成爲lwIP的小TCP/IP協議棧的設計及實現,它足夠小便于在最小限度的系統中使用。

文章的安排如下:2,3和4部分給出了lwIP協議棧的概要,第5部分描述了操作系統仿真層,第6部分描述了內存及緩沖區管理,第7部分介紹了lwIP網絡層的抽象接口,第8,9和10部分描述了IP,UDP和TCP協議的實現,第11,12部分描述了怎樣使用lwIP及API介紹,第13,14部分分析了實現,最後,第15部分提供了lwIP API的使用手冊,並且第17,18部分給出了幾個代碼實例。

2 協議分層

TCP/IP協議族設計成分層模式,每個協議層解決不同的通信問題。分層思想主導了協議實現的設計,各個協議能被分開實現。以一種嚴格分層的方式實現協議導致了這麽一種情況:協議層之間的通信降低了總體的性能。爲了克服這個問題,一個協議的某些方面應當被其他協議所了解。必須小心,那樣只有重要的信息在協議層間共享。

許多的TCP/IP實現都嚴格區分開應用層及其底下的協議層,不管這些層是否可以或多或少的交叉實現。在許多操作系統中,這些底層的協議被實現爲操作系統內核的一部分,而只提供給應用層進程一些通信調用點。應用程序只知道TCP/IP實現的一個抽象方式,網絡通信同進程間通信或文件I/O的差異很少。這樣實現的原因是應用程序不會意識到底層使用緩沖區的機制,它不能使用該信息拒絕經常使用數據的緩沖區。同時,當應用程序發送數據時,該數據必須在被網絡代碼執行前從應用進程內存空間複制到內部緩沖區。

在最小限度系統上的操作系統通常不會維護內核及應用進程之間的嚴格界限保護。這就允許通過共享內存在應用層及底層協議間使用更爲靈活的通信機制。特別地,應用層能意識到底層使用緩沖區的機制。因此應用程序能更高效地重用這些緩沖區。同時,由于應用進程可以使用網絡層代碼同樣的內存,應用進程能直接讀寫那些內部緩沖區,因此也節省了複制的代價。

3 概要

正如許多其他的TCP/IP實現一樣,已有的分層協議設計給lwIP的設計實現提供了向導。每個協議實現了自己的模塊,以一些函數做爲進入該協議的入口。盡管大多數協議被分開實現,但有些層卻違背了這個思想,爲的是上面提到的在處理速度及內存使用上提高性能。例如,當要驗證到達的TCP報文段檢驗和,或者當要分組轉發(demultiplexing)一個報文段時,TCP模塊必須知道該報文段的源IP地址和目的IP地址。TCP模塊清楚IP頭部結構,因此能自己析取出所需的信息,而不是通過函數調用來傳遞這些地址。

lwIP包含好幾個模塊,除了那些實現TCP/IP協議族(IP,ICMP,UDP,TCP)的模塊外,也實現了其他一些支持的模塊。這些支持的模塊包括操作系統仿真層(在第5部分描述),緩沖及內存管理子系統(在第6部分描述),網絡接口函數(在第7部分描述),和計算檢驗和的函數。lwIP在第12部分也描述了一個抽象的API。

4 進程模型

一個協議實現的進程模型是這樣描述的:系統被分開爲不同的進程。一種已經被用于實現通信協議的進程模型是讓每個進程作爲一個獨立的進程運行。在這種模型中,協議分層是嚴格的,並且協議層間的通信接口也被嚴格定義。盡管這種方法有其優點,如協議能在運行是加入進來,清楚代碼且容易調試,它也有些缺點。前面提到過,嚴格分層並不是實現協議的最好方法。同時,更重要的是,層間交互會引起上下文切換。對一個到達的TCP報文段意味著三個上下文切換,從網絡接口層的設備驅動,到IP進程,再到TCP進程,最後才到應用進程。大多數操作系統的上下文切換是相當昂貴的。

另一個通常的方法是讓通信協議駐留在操作系統的內核中。在這種內核級實現通信協議的情況下,應用進程通過系統調用和這些協議進行通信。這些通信協議並不嚴格區分彼此,反而會使用某些技術來跨過協議分分層。

lwIP使用了進程模型。在這個模型中,所有的協議駐留在單一的進程中,顯然和操作系統內核是分開的。應用進程可以駐留在lwIP進程中,也可以在分開的不同進程中。應用程序和TCP/IP協議棧之間的通信有兩種:一個是當應用程序和lwIP共享一個進程時可以通過函數調用;另一種是使用一個更爲抽象的API。

讓lwIP實現爲用戶空間的進程而不是駐留操作系統內核有其優缺點。主要優點是這種實現在不同操作系統間是可移植的。因爲lwIP被設計爲運行在小的操作系統上,這些操作系統不支持交換進出進程和虛擬內存,所以由不得不等待磁盤操作(假如部分lwIP進程被交換出到磁盤中)引起的延遲不再是個問題。在有機會服務一個請求前必須等待一定的調度這仍然是個問題,但在lwIP的設計中並沒有什麽去排除將來會在操作系統內核中實現。

5 操作系統仿真層

爲了使lwIP可移植,操作系統特定函數調用及數據結構並沒直接在代碼中使用。當需要這樣的函數時,操作系統仿真層就被使用。操作系統仿真層向操作系統服務提供了統一的接口,這些服務有定時器,進程同步,消息傳遞機制,等等。原理上,要移植lwIP到其他操作系統時,只需實現該特定操作系統的仿真層就可以了。

操作系統仿真層提供了一個功能性定時器讓TCP使用。該定時器是一個時間間隔至少200ms的一次性定時,它在定時結束時將調用一個已注冊的函數。

信號量是進程同步機制的唯一一個實現。即使下層的操作系統並不提供信號量實現,它也能由其他的同步原語如臨界變量或鎖機制實現。

消息傳遞的實現是一個抽象爲“郵箱”的簡單機制。一個郵箱有兩種操作:郵遞和收取。郵遞操作不會阻塞該進程,而郵遞給一個郵箱的信息會由操作系統仿真層列入隊列,直到另外的進程收取該信息。即使下層操作系統不支持郵箱機制,它也能容易地由信號量實現。

(待續)

1 介紹 近幾年來,對計算機互連及裝備有無線聯網設備的計算機的興趣越來越流行。計算機和日常設備越來越無縫集成在一起並且價格也在下降。同時無線網絡技術,如藍牙和IEEE 802。11b無線局域網也相繼出現。這將在很多領域如健康保健,安全,保險,運輸及處理産業等引發更多令人振奮的前景。小設備如傳感器等能接入一些已經存在的網絡基礎設施如全球因特網,也能在任何地方被監測到。 互聯網技術已經被證實足夠靈活的適應過去幾十年來不斷變化的網絡環境。互聯網技術起初是在如ARPANET的慢速網絡上發展起來的,但它現在卻運行在大量的連接技術及許多不同特征的帶寬和比特錯誤率上。由于大量使用互聯網技術的應用已被廣泛應用,在不久的無線網絡中使用現有互聯網技術有很大的益處。同時,全球互聯網的巨大互聯性是個很大的激勵。 由于小設備如傳感器經常被要求小型且便宜,網絡協議的實現必須處理受限制的計算資源及內存。這篇文章描述了一個成爲lwIP的小TCP/IP協議棧的設計及實現,它足夠小便于在最小限度的系統中使用。 文章的安排如下:2,3和4部分給出了lwIP協議棧的概要,第5部分描述了操作系統仿真層,第6部分描述了內存及緩沖區管理,第7部分介紹了lwIP網絡層的抽象接口,第8,9和10部分描述了IP,UDP和TCP協議的實現,第11,12部分描述了怎樣使用lwIP及API介紹,第13,14部分分析了實現,最後,第15部分提供了lwIP API的使用手冊,並且第17,18部分給出了幾個代碼實例。 2 協議分層 TCP/IP協議族設計成分層模式,每個協議層解決不同的通信問題。分層思想主導了協議實現的設計,各個協議能被分開實現。以一種嚴格分層的方式實現協議導致了這麽一種情況:協議層之間的通信降低了總體的性能。爲了克服這個問題,一個協議的某些方面應當被其他協議所了解。必須小心,那樣只有重要的信息在協議層間共享。 許多的TCP/IP實現都嚴格區分開應用層及其底下的協議層,不管這些層是否可以或多或少的交叉實現。在許多操作系統中,這些底層的協議被實現爲操作系統內核的一部分,而只提供給應用層進程一些通信調用點。應用程序只知道TCP/IP實現的一個抽象方式,網絡通信同進程間通信或文件I/O的差異很少。這樣實現的原因是應用程序不會意識到底層使用緩沖區的機制,它不能使用該信息拒絕經常使用數據的緩沖區。同時,當應用程序發送數據時,該數據必須在被網絡代碼執行前從應用進程內存空間複制到內部緩沖區。 在最小限度系統上的操作系統通常不會維護內核及應用進程之間的嚴格界限保護。這就允許通過共享內存在應用層及底層協議間使用更爲靈活的通信機制。特別地,應用層能意識到底層使用緩沖區的機制。因此應用程序能更高效地重用這些緩沖區。同時,由于應用進程可以使用網絡層代碼同樣的內存,應用進程能直接讀寫那些內部緩沖區,因此也節省了複制的代價。 3 概要 正如許多其他的TCP/IP實現一樣,已有的分層協議設計給lwIP的設計實現提供了向導。每個協議實現了自己的模塊,以一些函數做爲進入該協議的入口。盡管大多數協議被分開實現,但有些層卻違背了這個思想,爲的是上面提到的在處理速度及內存使用上提高性能。例如,當要驗證到達的TCP報文段檢驗和,或者當要分組轉發(demultiplexing)一個報文段時,TCP模塊必須知道該報文段的源IP地址和目的IP地址。TCP模塊清楚IP頭部結構,因此能自己析取出所需的信息,而不是通過函數調用來傳遞這些地址。 lwIP包含好幾個模塊,除了那些實現TCP/IP協議族(IP,ICMP,UDP,TCP)的模塊外,也實現了其他一些支持的模塊。這些支持的模塊包括操作系統仿真層(在第5部分描述),緩沖及內存管理子系統(在第6部分描述),網絡接口函數(在第7部分描述),和計算檢驗和的函數。lwIP在第12部分也描述了一個抽象的API。 4 進程模型 一個協議實現的進程模型是這樣描述的:系統被分開爲不同的進程。一種已經被用于實現通信協議的進程模型是讓每個進程作爲一個獨立的進程運行。在這種模型中,協議分層是嚴格的,並且協議層間的通信接口也被嚴格定義。盡管這種方法有其優點,如協議能在運行是加入進來,清楚代碼且容易調試,它也有些缺點。前面提到過,嚴格分層並不是實現協議的最好方法。同時,更重要的是,層間交互會引起上下文切換。對一個到達的TCP報文段意味著三個上下文切換,從網絡接口層的設備驅動,到IP進程,再到TCP進程,最後才到應用進程。大多數操作系統的上下文切換是相當昂貴的。 另一個通常的方法是讓通信協議駐留在操作系統的內核中。在這種內核級實現通信協議的情況下,應用進程通過系統調用和這些協議進行通信。這些通信協議並不嚴格區分彼此,反而會使用某些技術來跨過協議分分層。 lwIP使用了進程模型。在這個模型中,所有的協議駐留在單一的進程中,顯然和操作系統內核是分開的。應用進程可以駐留在lwIP進程中,也可以在分開的不同進程中。應用程序和TCP/IP協議棧之間的通信有兩種:一個是當應用程序和lwIP共享一個進程時可以通過函數調用;另一種是使用一個更爲抽象的API。 讓lwIP實現爲用戶空間的進程而不是駐留操作系統內核有其優缺點。主要優點是這種實現在不同操作系統間是可移植的。因爲lwIP被設計爲運行在小的操作系統上,這些操作系統不支持交換進出進程和虛擬內存,所以由不得不等待磁盤操作(假如部分lwIP進程被交換出到磁盤中)引起的延遲不再是個問題。在有機會服務一個請求前必須等待一定的調度這仍然是個問題,但在lwIP的設計中並沒有什麽去排除將來會在操作系統內核中實現。 5 操作系統仿真層 爲了使lwIP可移植,操作系統特定函數調用及數據結構並沒直接在代碼中使用。當需要這樣的函數時,操作系統仿真層就被使用。操作系統仿真層向操作系統服務提供了統一的接口,這些服務有定時器,進程同步,消息傳遞機制,等等。原理上,要移植lwIP到其他操作系統時,只需實現該特定操作系統的仿真層就可以了。 操作系統仿真層提供了一個功能性定時器讓TCP使用。該定時器是一個時間間隔至少200ms的一次性定時,它在定時結束時將調用一個已注冊的函數。 信號量是進程同步機制的唯一一個實現。即使下層的操作系統並不提供信號量實現,它也能由其他的同步原語如臨界變量或鎖機制實現。 消息傳遞的實現是一個抽象爲“郵箱”的簡單機制。一個郵箱有兩種操作:郵遞和收取。郵遞操作不會阻塞該進程,而郵遞給一個郵箱的信息會由操作系統仿真層列入隊列,直到另外的進程收取該信息。即使下層操作系統不支持郵箱機制,它也能容易地由信號量實現。 (待續)
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有