當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 嵌入式linux tcpip協(xié)議棧概述
1. 概述
TCP/IP協(xié)議棧可以實(shí)現(xiàn)不同型號、不同操作系統(tǒng)的計算機(jī)之間的通信,它并不是某個具體的協(xié)議,而是一組協(xié)議。我們都知道OSI七層模型中有物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層、應(yīng)用層共七層,每一層都對應(yīng)多個相關(guān)的協(xié)議。同樣,TCP/IP網(wǎng)絡(luò)協(xié)議也進(jìn)行了層次的劃分,分為四層,分別規(guī)定了每層的作用以及它們的協(xié)議。
網(wǎng)絡(luò)接口層:通常包括操作系統(tǒng)中的設(shè)備驅(qū)動程序和計算機(jī)中對應(yīng)的網(wǎng)卡,它們一起處理與電纜的物理接口細(xì)節(jié)。
網(wǎng)絡(luò)層:有時也稱作網(wǎng)際層或互聯(lián)網(wǎng)層,處理分組在網(wǎng)絡(luò)中的活動,例如分組的選路。在
T C P / I P協(xié)議族中,網(wǎng)絡(luò)層協(xié)議包括I P協(xié)議(網(wǎng)際協(xié)議),ICMP協(xié)議(I n t e r n e t互聯(lián)網(wǎng)控制報文協(xié)議),以及IGMP協(xié)議(I n t e r n e t組管理協(xié)議)。
運(yùn)輸層:主要為兩臺主機(jī)上的應(yīng)用程序提供端到端的通信。在TCP/IP協(xié)議族中,有兩個互不相同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。TCP為兩臺主機(jī)提供高可靠性的數(shù)據(jù)通信。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組,設(shè)置發(fā)送后確認(rèn)分組的超時時鐘等。由于運(yùn)輸層提供了高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)。而另一方面,UDP則為應(yīng)用層提供一種非常簡單的服務(wù)。它只是把稱作數(shù)據(jù)報的分組從一臺主機(jī)發(fā)送到另一臺主機(jī),但并不保證該數(shù)據(jù)報能到達(dá)另一端。任何必需的可靠性必須由應(yīng)用層來提供。這兩種運(yùn)輸層協(xié)議分別在不同的應(yīng)用程序中有不同的用途,這一點(diǎn)將在后面看到。
應(yīng)用層:負(fù)責(zé)處理特定的應(yīng)用程序細(xì)節(jié)
假設(shè)在一個局域網(wǎng)(LAN)如以太網(wǎng)中有兩臺主機(jī),二者都運(yùn)行FTP協(xié)議,如圖列出了該過程所涉及到的所有協(xié)議。
這里,我們列舉了一個FTP客戶程序和另一個FTP服務(wù)器程序。大多數(shù)的網(wǎng)絡(luò)應(yīng)用程序都被設(shè)計成客戶-服務(wù)器模式。服務(wù)器為客戶提供某種服務(wù),在該圖中就是訪問服務(wù)器所在主機(jī)上的文件。在遠(yuǎn)程登錄應(yīng)用程序Telnet中,為客戶提供的服務(wù)是登錄到服務(wù)器主機(jī)上。在同一層上,雙方都有對應(yīng)的一個或多個協(xié)議進(jìn)行通信。例如,某個協(xié)議允許TCP層進(jìn)行通信,而另一個協(xié)議則允許兩個IP層進(jìn)行通信。在圖的右邊,我們可以看出應(yīng)用程序通常是一個用戶進(jìn)程,而下三層則一般在linux操作系統(tǒng)內(nèi)核中執(zhí)行。頂層與下三層之間還有另一個關(guān)鍵的不同之處。應(yīng)用層關(guān)心的是應(yīng)用程序的細(xì)節(jié),而不是數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸活動。下三層對應(yīng)用程序一無所知,但它們要處理所有的通信細(xì)節(jié)。在圖中列舉了四種不同層次上的協(xié)議。FTP是一種應(yīng)用層協(xié)議, TCP是一種運(yùn)輸層協(xié)議,IP是一種網(wǎng)絡(luò)層協(xié)議,而以太網(wǎng)協(xié)議則應(yīng)用于鏈路層上。TCP/IP協(xié)議族是一組不同的協(xié)議組合在一起構(gòu)成的協(xié)議族。盡管通常稱該協(xié)議族為TCP/IP,但TCP和IP只是其中的兩種協(xié)議而已(該協(xié)議族的另一個名字是I n t e r n e t協(xié)議族(Internet Protocol Suite))。網(wǎng)絡(luò)接口層和應(yīng)用層的目的是很顯然的—前者處理有關(guān)通信媒介的細(xì)節(jié)(以太網(wǎng)、令牌環(huán)網(wǎng)等),而后者處理某個特定的用戶應(yīng)用程序( FT P、Telnet等)。但是,從表面上看,網(wǎng)絡(luò)層和運(yùn)輸層之間的區(qū)別不那么明顯。
2.數(shù)據(jù)封裝
數(shù)據(jù)從應(yīng)用層到物理層要經(jīng)過一系列的加包頭過程,反之,從物理層到應(yīng)用層要進(jìn)行拆包,每經(jīng)過一層就要進(jìn)行相應(yīng)的去數(shù)據(jù)包包頭。
3. 數(shù)據(jù)傳輸
數(shù)據(jù)的傳輸使用了一個非常重要的結(jié)構(gòu)體sk_buff,該結(jié)構(gòu)體用來實(shí)現(xiàn)數(shù)據(jù)在各個層次的數(shù)據(jù)傳輸。該數(shù)據(jù)結(jié)構(gòu)在linux內(nèi)核源碼的
struct sk_buff {
struct sk_buff *next;
struct sk_buff *prev;
struct net_device *dev; //數(shù)據(jù)包屬于哪個網(wǎng)卡
unsigned int len, //有效數(shù)據(jù)長度
data_len; //分片數(shù)據(jù)段的長度
__u16 mac_len,
hdr_len;
sk_buff_data_t tail;
sk_buff_data_t end;
unsigned char *head, //緩存區(qū)的頭指針
*data; //有效數(shù)據(jù)頭指針
...
};
sk_buff相關(guān)操作函數(shù):
/*********************************************************
*功能:分配sk_buff結(jié)構(gòu)體
*參數(shù):size :緩存區(qū)大小
* priority:分配標(biāo)志GFP_KERNEL,GFP_ATOMIC...
*返回值:成功返回skb指針
* 失敗返回NULL
********************************************************/
struct sk_buff *alloc_skb(unsigned int size,gfp_t priority)
/**********************************************************
*功能:釋放sk_buff
*參數(shù):skb:skb指針
*返回值:void
**********************************************************/
void kfree_skb(struct sk_buff *skb)
/*tail下移,有效數(shù)據(jù)區(qū)增大*/
unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
/*data上移,有效數(shù)據(jù)區(qū)增大*/
unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
/*data tail下移,有效數(shù)據(jù)區(qū)不變*/
void skb_reserve(struct sk_buff *skb, int len)