国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

國(guó)內(nèi) 設(shè)計(jì)網(wǎng)站的公司網(wǎng)站3000行業(yè)關(guān)鍵詞

國(guó)內(nèi) 設(shè)計(jì)網(wǎng)站的公司網(wǎng)站,3000行業(yè)關(guān)鍵詞,黃頁網(wǎng)品種大全2021,新疆維吾爾自治區(qū)建設(shè)廳網(wǎng)站什么是Netlink 關(guān)于Netlink的理解,需要把握幾個(gè)關(guān)鍵點(diǎn): 1、面向數(shù)據(jù)報(bào)的無連接消息子系統(tǒng) 2、基于通用的BSD Socket架構(gòu)而實(shí)現(xiàn) 關(guān)于第一點(diǎn)使我們很容易聯(lián)想到UDP協(xié)議,能想到這一點(diǎn)就非常棒了。按著UDP協(xié)議來理解Netlink不是不無道理&…

什么是Netlink

關(guān)于Netlink的理解,需要把握幾個(gè)關(guān)鍵點(diǎn):

1、面向數(shù)據(jù)報(bào)的無連接消息子系統(tǒng)

2、基于通用的BSD Socket架構(gòu)而實(shí)現(xiàn)

關(guān)于第一點(diǎn)使我們很容易聯(lián)想到UDP協(xié)議,能想到這一點(diǎn)就非常棒了。按著UDP協(xié)議來理解Netlink不是不無道理,只要你能觸類旁通,做到“活學(xué)”,善于總結(jié)歸納、聯(lián)想,最后實(shí)現(xiàn)知識(shí)遷移這就是學(xué)習(xí)的本質(zhì)。Netlink可以實(shí)現(xiàn)內(nèi)核->用戶以及用戶->內(nèi)核的雙向、異步的數(shù)據(jù)通信,同時(shí)它還支持兩個(gè)用戶進(jìn)程之間、甚至兩個(gè)內(nèi)核子系統(tǒng)之間的數(shù)據(jù)通信。本文中,對(duì)后兩者我們不予考慮,焦點(diǎn)集中在如何實(shí)現(xiàn)用戶<->內(nèi)核之間的數(shù)據(jù)通信。

看到第二點(diǎn)腦海中是不是瞬間閃現(xiàn)了下面這張圖片呢?如果是,則說明你確實(shí)有慧根;當(dāng)然,不是也沒關(guān)系,慧根可以慢慢長(zhǎng)嘛,呵呵。

?在后面實(shí)戰(zhàn)Netlink套接字編程時(shí)我們主要會(huì)用到socket(),bind(),sendmsg()

和 recvmsg()等系統(tǒng)調(diào)用,當(dāng)然還有socket提供的輪訓(xùn)(polling)機(jī)制。

Netlink通信類型

Netlink支持兩種類型的通信方式:單播和多播。

? ? ? 單播:經(jīng)常用于一個(gè)用戶進(jìn)程和一個(gè)內(nèi)核子系統(tǒng)之間1:1的數(shù)據(jù)通信。用戶空間發(fā)送命令到內(nèi)核,然后從內(nèi)核接受命令的返回結(jié)果。

? ? ? 多播:經(jīng)常用于一個(gè)內(nèi)核進(jìn)程和多個(gè)用戶進(jìn)程之間的1:N的數(shù)據(jù)通信。內(nèi)核作為會(huì)話的發(fā)起者,用戶空間的應(yīng)用程序是接收者。為了實(shí)現(xiàn)這個(gè)功能,內(nèi)核空間的程序會(huì)創(chuàng)建一個(gè)多播組,然后所有用戶空間的對(duì)該內(nèi)核進(jìn)程發(fā)送的消息感興趣的進(jìn)程都加入到該組即可接收來自內(nèi)核發(fā)送的消息了。如下:

? ? ? ?其中進(jìn)程A和子系統(tǒng)1之間是單播通信,進(jìn)程B、C和子系統(tǒng)2是多播通信。上圖還向我們說明了一個(gè)信息。從用戶空間傳遞到內(nèi)核的數(shù)據(jù)是不需要排隊(duì)的,即其操作是同步完成;而從內(nèi)核空間向用戶空間傳遞數(shù)據(jù)時(shí)需要排隊(duì),是異步的。了解了這一點(diǎn)在開發(fā)基于Netlink的應(yīng)用模塊時(shí)可以使我們少走很多彎路。假如,你向內(nèi)核發(fā)送了一個(gè)消息需要獲取內(nèi)核中某些信息,比如路由表,或其他信息,如果路由表過于龐大,那么內(nèi)核在通過Netlink向你返回?cái)?shù)據(jù)時(shí),你可以好生琢磨一下如何接收這些數(shù)據(jù)的問題,畢竟你已經(jīng)看到了那個(gè)輸出隊(duì)列了,不能視而不見啊。

Netlink的消息格式

? ? ? ?Netlink消息由兩部分組成:消息頭和有效數(shù)據(jù)載荷,且整個(gè)Netlink消息是4字節(jié)對(duì)齊,一般按主機(jī)字節(jié)序進(jìn)行傳遞。消息頭為固定的16字節(jié),消息體長(zhǎng)度可變:

Netlink的消息頭

? ? ? ? 消息頭定義在<include/linux/netlink.h>文件里,由結(jié)構(gòu)體nlmsghdr表示:????????

struct nlmsghdr
{__u32        nlmsg_len;    /* Length of message including header */__u16        nlmsg_type;    /* Message content */__u16        nlmsg_flags;    /* Additional flags */__u32        nlmsg_seq;    /* Sequence number */__u32        nlmsg_pid;    /* Sending process PID */
};

消息頭中各成員屬性的解釋及說明:

nlmsg_len:整個(gè)消息的長(zhǎng)度,按字節(jié)計(jì)算。包括了Netlink消息頭本身。

nlmsg_type:消息的類型,即是數(shù)據(jù)還是控制消息。目前(內(nèi)核版本2.6.21)Netlink僅支持四種類型的控制消息,如下:

?????NLMSG_NOOP-空消息,什么也不做;

?????NLMSG_ERROR-指明該消息中包含一個(gè)錯(cuò)誤;

?????NLMSG_DONE-如果內(nèi)核通過Netlink隊(duì)列返回了多個(gè)消息,那么隊(duì)列的最后一條消息的類型為NLMSG_DONE,其余所有消息的nlmsg_flags屬性都被設(shè)置NLM_F_MULTI位有效。

?????NLMSG_OVERRUN-暫時(shí)沒用到。

nlmsg_flags:附加在消息上的額外說明信息,如上面提到的NLM_F_MULTI。摘錄如下:

標(biāo)記

作用及說明

NLM_F_REQUEST

如果消息中有該標(biāo)記位,說明這是一個(gè)請(qǐng)求消息。所有從用戶空間到內(nèi)核空間的消息都要設(shè)置該位,否則內(nèi)核將向用戶返回一個(gè)EINVAL無效參數(shù)的錯(cuò)誤

NLM_F_MULTI

消息從用戶->內(nèi)核是同步的立刻完成,而從內(nèi)核->用戶則需要排隊(duì)。如果內(nèi)核之前收到過來自用戶的消息中有NLM_F_DUMP位為1的消息,那么內(nèi)核就會(huì)向用戶空間發(fā)送一個(gè)由多個(gè)Netlink消息組成的鏈表。除了最后個(gè)消息外,其余每條消息中都設(shè)置了該位有效。

NLM_F_ACK

該消息是內(nèi)核對(duì)來自用戶空間的NLM_F_REQUEST消息的響應(yīng)

NLM_F_ECHO

如果從用戶空間發(fā)給內(nèi)核的消息中該標(biāo)記為1,則說明用戶的應(yīng)用進(jìn)程要求內(nèi)核將用戶發(fā)給它的每條消息通過單播的形式再發(fā)送給用戶進(jìn)程。和我們通常說的“回顯”功能類似。

......

大家只要知道nlmsg_flags有多種取值就可以,至于每種值的作用和意義,通過谷歌和源代碼一定可以找到答案,這里就不展開了。上一張2.6.21內(nèi)核中所有的取值情況:

nlmsg_seq:消息序列號(hào)。因?yàn)镹etlink是面向數(shù)據(jù)報(bào)的,所以存在丟失數(shù)據(jù)的風(fēng)險(xiǎn),但是Netlink提供了如何確保消息不丟失的機(jī)制,讓程序開發(fā)人員根據(jù)其實(shí)際需求而實(shí)現(xiàn)。消息序列號(hào)一般和NLM_F_ACK類型的消息聯(lián)合使用,如果用戶的應(yīng)用程序需要保證其發(fā)送的每條消息都成功被內(nèi)核收到的話,那么它發(fā)送消息時(shí)需要用戶程序自己設(shè)置序號(hào),內(nèi)核收到該消息后對(duì)提取其中的序列號(hào),然后在發(fā)送給用戶程序回應(yīng)消息里設(shè)置同樣的序列號(hào)。有點(diǎn)類似于TCP的響應(yīng)和確認(rèn)機(jī)制。

注意:當(dāng)內(nèi)核主動(dòng)向用戶空間發(fā)送廣播消息時(shí),消息中的該字段總是為0。

nlmsg_pid?:當(dāng)用戶空間的進(jìn)程和內(nèi)核空間的某個(gè)子系統(tǒng)之間通過Netlink建立了數(shù)據(jù)交換的通道后,Netlink會(huì)為每個(gè)這樣的通道分配一個(gè)唯一的數(shù)字標(biāo)識(shí)。其主要作用就是將來自用戶空間的請(qǐng)求消息和響應(yīng)消息進(jìn)行關(guān)聯(lián)。說得直白一點(diǎn),假如用戶空間存在多個(gè)用戶進(jìn)程,內(nèi)核空間同樣存在多個(gè)進(jìn)程,Netlink必須提供一種機(jī)制用于確保每一對(duì)“用戶-內(nèi)核”空間通信的進(jìn)程之間的數(shù)據(jù)交互不會(huì)發(fā)生紊亂。

? ???即,進(jìn)程A、B通過Netlink向子系統(tǒng)1獲取信息時(shí),子系統(tǒng)1必須確?;厮徒o進(jìn)程A的響應(yīng)數(shù)據(jù)不會(huì)發(fā)到進(jìn)程B那里。主要適用于用戶空間的進(jìn)程從內(nèi)核空間獲取數(shù)據(jù)的場(chǎng)景。通常情況下,用戶空間的進(jìn)程在向內(nèi)核發(fā)送消息時(shí)一般通過系統(tǒng)調(diào)用getpid()將當(dāng)前進(jìn)程的進(jìn)程號(hào)賦給該變量,即用戶空間的進(jìn)程希望得到內(nèi)核的響應(yīng)時(shí)才會(huì)這么做。從內(nèi)核主動(dòng)發(fā)送到用戶空間的消息該字段都被設(shè)置為0。

?Netlink的消息體

? ? ? ? Netlink的消息體采用TLV(Type-Length-Value)格式:

? ? ? ? ?Netlink每個(gè)屬性都由<include/linux/netlink.h>文件里的struct nlattr{}來表示:

Netlink提供的錯(cuò)誤指示消息

? ? ? 當(dāng)用戶空間的應(yīng)用程序和內(nèi)核空間的進(jìn)程之間通過Netlink通信時(shí)發(fā)生了錯(cuò)誤,Netlink必須向用戶空間通報(bào)這種錯(cuò)誤。Netlink對(duì)錯(cuò)誤消息進(jìn)行了單獨(dú)封裝,<include/linux/netlink.h>:

struct nlmsgerr
{int        error; //標(biāo)準(zhǔn)的錯(cuò)誤碼,定義在errno.h頭文件中??梢杂胮error()來解釋struct nlmsghdr msg; //指明了哪條消息觸發(fā)了結(jié)構(gòu)體中error這個(gè)錯(cuò)誤值
};

Netlink編程需要注意的問題

基于Netlink的用戶-內(nèi)核通信,有兩種情況可能會(huì)導(dǎo)致丟包:

? ? ? 1、內(nèi)存耗盡;

? ? ? 2、用戶空間接收進(jìn)程的緩沖區(qū)溢出。導(dǎo)致緩沖區(qū)溢出的主要原因有可能是:用戶空間的進(jìn)程運(yùn)行太慢;或者接收隊(duì)列太短。

? ? ? 如果Netlink不能將消息正確傳遞到用戶空間的接收進(jìn)程,那么用戶空間的接收進(jìn)程在調(diào)用recvmsg()系統(tǒng)調(diào)用時(shí)就會(huì)返回一個(gè)內(nèi)存不足(ENOBUFS)的錯(cuò)誤,這一點(diǎn)需要注意。換句話說,緩沖區(qū)溢出的情況是不會(huì)發(fā)送在從用戶->內(nèi)核的sendmsg()系統(tǒng)調(diào)用里,原因前面我們也說過了,請(qǐng)大家自己思考一下。

Netlink的地址結(jié)構(gòu)體

在TCP博文中我們提到過在Internet編程過程中所用到的地址結(jié)構(gòu)體和標(biāo)準(zhǔn)地址結(jié)構(gòu)體,它們和Netlink地址結(jié)構(gòu)體的關(guān)系如下:

? ??struct sockaddr_nl{}的詳細(xì)定義和描述如下:

struct sockaddr_nl
{sa_family_t    nl_family;    /*該字段總是為AF_NETLINK    */unsigned short    nl_pad;        /* 目前未用到,填充為0*/__u32        nl_pid;        /* process pid    */__u32        nl_groups;    /* multicast groups mask */
};

?nl_pid:該屬性為發(fā)送或接收消息的進(jìn)程ID,前面我們也說過,Netlink不僅可以實(shí)現(xiàn)用戶-內(nèi)核空間的通信還可使現(xiàn)實(shí)用戶空間兩個(gè)進(jìn)程之間,或內(nèi)核空間兩個(gè)進(jìn)程之間的通信。該屬性為0時(shí)一般適用于如下兩種情況:

? ? ? ? 第一,我們要發(fā)送的目的地是內(nèi)核,即從用戶空間發(fā)往內(nèi)核空間時(shí),我們構(gòu)造的Netlink地址結(jié)構(gòu)體中nl_pid通常情況下都置為0。這里有一點(diǎn)需要跟大家交代一下,在Netlink規(guī)范里,PID全稱是Port-ID(32bits),其主要作用是用于唯一的標(biāo)識(shí)一個(gè)基于netlink的socket通道。通常情況下nl_pid都設(shè)置為當(dāng)前進(jìn)程的進(jìn)程號(hào)。然而,對(duì)于一個(gè)進(jìn)程的多個(gè)線程同時(shí)使用netlink socket的情況,nl_pid的設(shè)置一般采用如下這個(gè)樣子來實(shí)現(xiàn):

pthread_self() << 16 | getpid();

? ? ? ? 第二,從內(nèi)核發(fā)出的多播報(bào)文到用戶空間時(shí),如果用戶空間的進(jìn)程處在該多播組中,那么其地址結(jié)構(gòu)體中nl_pid也設(shè)置為0

nl_groups:如果用戶空間的進(jìn)程希望加入某個(gè)多播組,則必須執(zhí)行bind()系統(tǒng)調(diào)用。該字段指明了調(diào)用者希望加入的多播組號(hào)的掩碼(注意不是組號(hào),后面我們會(huì)詳細(xì)講解這個(gè)字段)。如果該字段為0則表示調(diào)用者不希望加入任何多播組。對(duì)于每個(gè)隸屬于Netlink協(xié)議域的協(xié)議,最多可支持32個(gè)多播組(因?yàn)閚l_groups的長(zhǎng)度為32比特),每個(gè)多播組用一個(gè)比特來表示。?

NetLink實(shí)踐

android 是如何通過netlink獲取網(wǎng)卡地址的?

不管是ip命令行還是Java的network接口,最終都是調(diào)用到ifaddrs.cpp -> getifaddrs

getifaddrs方法介紹

NetlinkConnection這個(gè)結(jié)構(gòu)體是一個(gè)netlink的封裝類

重點(diǎn)看一下ReadResponses的實(shí)現(xiàn)過程

?

使用流程:

通過遍歷拿到我們需要的內(nèi)容,輸出即可。

?

http://m.aloenet.com.cn/news/32810.html

相關(guān)文章:

  • 手機(jī)網(wǎng)站開發(fā)教程?hào)|莞做網(wǎng)站哪家公司好
  • 網(wǎng)站有沒有做網(wǎng)站地圖怎么看今天國(guó)際新聞大事
  • 想做一個(gè)自己設(shè)計(jì)公司的網(wǎng)站怎么做的網(wǎng)站推廣公司電話
  • 電腦做系統(tǒng)網(wǎng)站鄭州網(wǎng)站優(yōu)化培訓(xùn)
  • 軟件工程師是程序員嗎電腦優(yōu)化工具
  • 建設(shè)一個(gè)大型網(wǎng)站大概費(fèi)用磁力王
  • 主流門戶網(wǎng)站百度關(guān)鍵詞搜索推廣
  • 怎樣設(shè)計(jì)網(wǎng)頁教程關(guān)鍵詞優(yōu)化外包
  • 鄭州電力高等??茖W(xué)校哪個(gè)專業(yè)好重慶seo和網(wǎng)絡(luò)推廣
  • 可視化網(wǎng)站制作軟件站長(zhǎng)之家ppt素材
  • 深圳html5網(wǎng)站建設(shè)搜索引擎營(yíng)銷sem
  • 遼寧網(wǎng)站推廣的目的網(wǎng)絡(luò)運(yùn)營(yíng)是做什么的工作
  • 做外國(guó)網(wǎng)站買域名推廣賺錢一個(gè)2元
  • 網(wǎng)站建設(shè)后期維護(hù)小魔仙網(wǎng)絡(luò)廣告宣傳平臺(tái)
  • 企業(yè)網(wǎng)絡(luò)營(yíng)銷策劃方案范文免費(fèi)seo教程資源
  • wordpress 添加搜索引擎北京網(wǎng)絡(luò)seo
  • 三合一網(wǎng)站建設(shè)方案深圳市網(wǎng)絡(luò)營(yíng)銷推廣服務(wù)公司
  • b2b網(wǎng)站建設(shè)開發(fā)china東莞seo
  • 網(wǎng)站的服務(wù)有哪些seo外鏈工具有用嗎
  • 南陽網(wǎng)站建設(shè)大旗電商電商網(wǎng)站訂煙
  • wordpress投訴功能qq群怎么優(yōu)化排名靠前
  • 多媒體網(wǎng)站開發(fā)實(shí)驗(yàn)報(bào)告做企業(yè)網(wǎng)站建設(shè)的公司
  • 網(wǎng)頁搜索工具新站seo優(yōu)化快速上排名
  • wordpress推廣升級(jí)vipseo做什么網(wǎng)站賺錢
  • 學(xué)網(wǎng)站建設(shè)怎么樣tool站長(zhǎng)工具
  • 網(wǎng)站的懲罰期要怎么做廣告安裝接單app
  • 國(guó)外設(shè)計(jì)網(wǎng)站dooor企業(yè)營(yíng)銷策劃書模板
  • 網(wǎng)站中qq跳轉(zhuǎn)怎么做的推廣公司經(jīng)營(yíng)范圍
  • 網(wǎng)站文化建設(shè)石家莊百度seo代理
  • 設(shè)計(jì)師論壇seo包年優(yōu)化