資源描述:
《linux tcpip協(xié)議棧分析.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、sk_buff結(jié)構(gòu)可能是linux網(wǎng)絡(luò)代碼中最逍要的數(shù)據(jù)結(jié)構(gòu),它表示接收或發(fā)送數(shù)據(jù)包的包頭信息。它在中定義,并包含很多成員變量供網(wǎng)絡(luò)代碼中的各子系統(tǒng)使用。這個(gè)結(jié)構(gòu)在linux內(nèi)核的發(fā)展過(guò)程屮改動(dòng)過(guò)很多次,或者是增加新的選項(xiàng),或者是乖新組織已存在的成員變最以使得成員變最的布局更加清晰。它的成員變量可以大致分為以下幾類:?Layout布局?General通用?Feature-specific功能相關(guān)?Managementfunctions管理函數(shù)這個(gè)結(jié)構(gòu)被不同的網(wǎng)絡(luò)層(MAC或者其他二層鏈路協(xié)議,三層的IP,四層的TCP或
2、UDP等)使用,并且其中的成員變最在結(jié)構(gòu)從一層向另一層傳遞時(shí)改變。L4向L3傳遞前會(huì)添加一個(gè)L4的頭部,同樣,L3向L2傳遞前,會(huì)添加一個(gè)L3的頭部。添加頭部比在不同層之間拷貝數(shù)據(jù)的效率更高。山于在緩沖區(qū)的頭部添加數(shù)據(jù)意味著要修改指向緩沖區(qū)的指針,這是個(gè)復(fù)雜的操作,所以內(nèi)核提供了一個(gè)函數(shù)skb.reserve(在后面的章節(jié)中描述)來(lái)完成這個(gè)功能。協(xié)議棧中的毎一層在往下一層傳遞緩沖區(qū)前,第一件申就是調(diào)用skb_reserve在緩沖區(qū)的頭部給協(xié)議頭預(yù)留一定的空間。skb_reserve同樣被設(shè)備驅(qū)動(dòng)使用來(lái)對(duì)齊接收到包的包頭。如果緩沖區(qū)向上層協(xié)議傳遞,I口的協(xié)議層的頭部信
3、息就沒什么用了。例如,L2的頭部只有在網(wǎng)絡(luò)驅(qū)動(dòng)處理L2的協(xié)議時(shí)有用,L3是不會(huì)關(guān)心它的信息的。但是,內(nèi)核并沒有把L2的頭部從緩沖區(qū)中刪除,而是把有效荷載的指針指向L3的頭部,這樣做,可以節(jié)省CPU時(shí)間。1.網(wǎng)絡(luò)參數(shù)和內(nèi)核數(shù)據(jù)結(jié)構(gòu)就像你在瀏覽TCP/1P規(guī)范或者配置內(nèi)核時(shí)所看到的一樣,網(wǎng)絡(luò)代碼提供了很多有用的功能,但是這些功能并不是必須的,比如說(shuō),防火墻,多播,還有其他一些功能。大部分的功能都需要在內(nèi)核數(shù)據(jù)結(jié)構(gòu)中添加自己的成員變量。因此,sk.buff里面包含了很多像#ifdef這樣的預(yù)編譯指令。例如,在sk_buff結(jié)構(gòu)的最后,你可以找到:structskbuff{
4、ttifdefCONFIGNETSCHEDu32tcindex;#ifdefC07FIG_NET_CLS_ACTu32tcverd;u32tc_classid;ttendifttendif}sk_buff結(jié)構(gòu)可能是linux網(wǎng)絡(luò)代碼中最逍要的數(shù)據(jù)結(jié)構(gòu),它表示接收或發(fā)送數(shù)據(jù)包的包頭信息。它在中定義,并包含很多成員變量供網(wǎng)絡(luò)代碼中的各子系統(tǒng)使用。這個(gè)結(jié)構(gòu)在linux內(nèi)核的發(fā)展過(guò)程屮改動(dòng)過(guò)很多次,或者是增加新的選項(xiàng),或者是乖新組織已存在的成員變最以使得成員變最的布局更加清晰。它的成員變量可以大致分為以下幾類:?Layout布
5、局?General通用?Feature-specific功能相關(guān)?Managementfunctions管理函數(shù)這個(gè)結(jié)構(gòu)被不同的網(wǎng)絡(luò)層(MAC或者其他二層鏈路協(xié)議,三層的IP,四層的TCP或UDP等)使用,并且其中的成員變最在結(jié)構(gòu)從一層向另一層傳遞時(shí)改變。L4向L3傳遞前會(huì)添加一個(gè)L4的頭部,同樣,L3向L2傳遞前,會(huì)添加一個(gè)L3的頭部。添加頭部比在不同層之間拷貝數(shù)據(jù)的效率更高。山于在緩沖區(qū)的頭部添加數(shù)據(jù)意味著要修改指向緩沖區(qū)的指針,這是個(gè)復(fù)雜的操作,所以內(nèi)核提供了一個(gè)函數(shù)skb.reserve(在后面的章節(jié)中描述)來(lái)完成這個(gè)功能。協(xié)議棧中的毎一層在往下一層傳遞緩沖
6、區(qū)前,第一件申就是調(diào)用skb_reserve在緩沖區(qū)的頭部給協(xié)議頭預(yù)留一定的空間。skb_reserve同樣被設(shè)備驅(qū)動(dòng)使用來(lái)對(duì)齊接收到包的包頭。如果緩沖區(qū)向上層協(xié)議傳遞,I口的協(xié)議層的頭部信息就沒什么用了。例如,L2的頭部只有在網(wǎng)絡(luò)驅(qū)動(dòng)處理L2的協(xié)議時(shí)有用,L3是不會(huì)關(guān)心它的信息的。但是,內(nèi)核并沒有把L2的頭部從緩沖區(qū)中刪除,而是把有效荷載的指針指向L3的頭部,這樣做,可以節(jié)省CPU時(shí)間。1.網(wǎng)絡(luò)參數(shù)和內(nèi)核數(shù)據(jù)結(jié)構(gòu)就像你在瀏覽TCP/1P規(guī)范或者配置內(nèi)核時(shí)所看到的一樣,網(wǎng)絡(luò)代碼提供了很多有用的功能,但是這些功能并不是必須的,比如說(shuō),防火墻,多播,還有其他一些功能。大
7、部分的功能都需要在內(nèi)核數(shù)據(jù)結(jié)構(gòu)中添加自己的成員變量。因此,sk.buff里面包含了很多像#ifdef這樣的預(yù)編譯指令。例如,在sk_buff結(jié)構(gòu)的最后,你可以找到:structskbuff{ttifdefCONFIGNETSCHEDu32tcindex;#ifdefC07FIG_NET_CLS_ACTu32tcverd;u32tc_classid;ttendifttendif}它表明.tcjndex只有在編譯時(shí)定義了CONFIG_NET_SCHED符號(hào)才有效。這個(gè)符號(hào)可以通過(guò)選擇特定的編譯選項(xiàng)來(lái)定義(例如:"DeviceDriversNetworkingsupp