日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--11.網(wǎng)絡(luò)( 七 )



10.5.2接收IP包
第dd-chapter 章描述了Linux的網(wǎng)絡(luò)設(shè)備是如何置入內(nèi)核并初始化的 。一系列 device 數(shù)據(jù)結(jié)構(gòu)在 dev_base 表中相互連接起來(lái) 。每個(gè) device 結(jié)構(gòu)描述了它的設(shè)備并提供回調(diào)例程,當(dāng)需要網(wǎng)絡(luò)驅(qū)動(dòng)來(lái)執(zhí)行工作時(shí),網(wǎng)絡(luò)協(xié)議層調(diào)用這些例程 。這些函數(shù)與傳輸?shù)臄?shù)據(jù)及網(wǎng)絡(luò)設(shè)備地址緊密相關(guān) 。當(dāng)一個(gè)網(wǎng)絡(luò)設(shè)備從網(wǎng)上接收包時(shí),它必須將接收的數(shù)據(jù)轉(zhuǎn)換成 sk_buff 結(jié)構(gòu) 。這些 sk_buff 則被網(wǎng)絡(luò)驅(qū)動(dòng)加入到了 backlog 隊(duì)列中 。

如果 backlog 隊(duì)列太長(zhǎng),則丟棄接收的 sk_buff 。準(zhǔn)備好要運(yùn)行時(shí),網(wǎng)絡(luò)底層將被設(shè)置標(biāo)志 。

當(dāng)網(wǎng)絡(luò)底層按計(jì)劃開(kāi)始運(yùn)行后,處理 backlog 隊(duì)列之前,任何等待著被傳輸?shù)木W(wǎng)絡(luò)包都由它來(lái)處理 。sk_buff 決定哪些層處理被接收的包 。

Linux網(wǎng)絡(luò)層初始化時(shí),每一協(xié)議通過(guò)將 packet_type 結(jié)構(gòu)加入到 ptype_all列表或ptype_base hash表中來(lái) 注冊(cè)它自己 。packet_type 結(jié)構(gòu)包含了協(xié)議類型,一個(gè)指向網(wǎng)絡(luò)設(shè)備的指針,一個(gè)指向協(xié)議的接收數(shù)據(jù)處理例程的指針,最后還包括一個(gè)指向列表鏈或hash鏈中下一個(gè) packet_type 結(jié)構(gòu)的指針 。ptype_all 鏈用于監(jiān)聽(tīng)從網(wǎng)絡(luò)設(shè)備上接收的所有包,通常不使用它 。ptype_base hash表是被協(xié)議標(biāo)識(shí)符弄亂的,用于決定哪個(gè)協(xié)議將接收傳入的網(wǎng)絡(luò)包 。網(wǎng)絡(luò)底層通過(guò)兩個(gè)表中的一個(gè)或多個(gè) packet_type 項(xiàng)來(lái)匹配傳入 sk_buff 的協(xié)議類型 。協(xié)議可以和多于一個(gè)的項(xiàng)相匹配,如在監(jiān)聽(tīng)網(wǎng)上所有的傳輸時(shí)要復(fù)制多個(gè) sk_buff。sk_buff 將通過(guò)被匹配協(xié)議處理例程 。

10.5.3發(fā)送IP包
應(yīng)用程序交換數(shù)據(jù)時(shí)要傳輸包,否則由網(wǎng)絡(luò)協(xié)議在建立連接或支持一個(gè)已建立的連接時(shí)來(lái)生成 。無(wú)論數(shù)據(jù) 是由哪種方法生成的,都要建立一個(gè) sk_buff 來(lái)包含數(shù)據(jù),當(dāng)通過(guò)協(xié)議層時(shí),這些協(xié)議層會(huì)加上各種頭 。

sk_buff 需要通過(guò)網(wǎng)絡(luò)設(shè)備傳輸 。首先協(xié)議,如IP,需要確定是哪個(gè)網(wǎng)絡(luò)設(shè)備在用 。這有賴于包的最佳路 由 。對(duì)于通過(guò)modem連入一個(gè)簡(jiǎn)單網(wǎng)絡(luò),如通過(guò)PPP協(xié)議,的計(jì)算機(jī)來(lái)說(shuō),路由的選擇是很簡(jiǎn)單的 。包應(yīng)該通過(guò) 本地環(huán)路設(shè)備發(fā)送給本地主機(jī),或發(fā)送給PPP modem連接的網(wǎng)關(guān) 。對(duì)于連在以在網(wǎng)上的計(jì)算機(jī)來(lái)說(shuō),連接在網(wǎng) 絡(luò)上的計(jì)算機(jī)越多,路由越復(fù)雜 。

對(duì)于每一個(gè)被傳輸?shù)腎P包,IP用路由表來(lái)為目的IP地址解析路由 。從路由表中成功地找到目的IP時(shí)將返回一個(gè)描述了要使用的路由的 rtable 結(jié)構(gòu) 。這包括要用到的源IP地址,網(wǎng)絡(luò) device 結(jié)構(gòu)的地址,有時(shí)還有預(yù)建立的硬件頭 。這些硬件頭是網(wǎng)絡(luò)設(shè)備特定的,包含了源和目的的物理地址和其它的特定媒體信息 。如果網(wǎng)絡(luò)設(shè)備是一個(gè)以太網(wǎng)設(shè)備,硬件頭則應(yīng)如圖10.1 所示,并且源和目的地址應(yīng)是物理的以太網(wǎng)地址 。硬件頭在路由的時(shí)候會(huì)緩存起來(lái),因?yàn)楸仨殞⑺拥矫恳粋€(gè)要傳輸?shù)腎P包中 。硬件頭包含的物理地址要用ARP協(xié)議來(lái)解析 。傳出的包在地址被解析后才會(huì)發(fā)出 。解析了地址后,硬件頭被緩存起來(lái)以便以后的IP包在使用這一接口時(shí)不需要再使用ARP 。

10.5.4數(shù)據(jù)分塊

每個(gè)網(wǎng)絡(luò)設(shè)備都有一個(gè)包大小的最大值,發(fā)送或接收數(shù)據(jù)包不能比這一值大 。IP協(xié)議允許將數(shù)據(jù)分成更小單元以便網(wǎng)絡(luò)設(shè)備能處理 。IP協(xié)議頭有分塊字段,它里面包含了一個(gè)標(biāo)志和分割偏移量 。

當(dāng)IP包準(zhǔn)備要傳輸時(shí),IP找到網(wǎng)絡(luò)設(shè)備來(lái)將IP包發(fā)送出去 。這個(gè)設(shè)備是從IP路由表中找到的 。每一 device 結(jié)構(gòu)中有一項(xiàng) mtu,用來(lái)描述最大傳輸單元(以字節(jié)為單位) 。如果設(shè)備的 mtu 比要傳輸?shù)腎P包的包大小要小,則IP包必須被分割成更小的單元 。每一單元用一個(gè) sk_buff 結(jié)構(gòu)來(lái)表征;它的IP頭會(huì)被做上標(biāo)記以標(biāo)識(shí)它是一個(gè)分塊了的包,其中還包含分割偏移量 。最后一個(gè)包被標(biāo)識(shí)為最后IP單元 。如果在分塊過(guò)程中,IP不能分配 sk_buff,則傳輸失敗 。

推薦閱讀