若天明 发表于 2015-1-18 11:22:51

Linux编程之Linux 上的基本收集设备详解仓酷云

当你经过一段时间的学习后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令。
Linux笼统收集设备简介

和磁盘设备相似,Linux用户想要利用收集功效,不克不及经由过程间接操纵硬件完成,而必要间接或直接的操纵一个Linux为我们笼统出来的设备,既通用的Linux收集设备来完成。一个罕见的情形是,体系里装有一个硬件网卡,Linux会在体系里为其天生一个收集设备实例,如eth0,用户必要对eth0收回命令以设置或利用它了。更多的硬件会带来更多的设备实例,假造的硬件也会带来更多的设备实例。跟着收集手艺,假造化手艺的开展,更多的初级收集设备被到场了到了Linux中,使得情形变得加倍庞大。在以下章节中,将逐一剖析在假造化手艺中常常利用的几种Linux收集设备笼统范例:Bridge、802.1.qVLANdevice、VETH、TAP,具体注释怎样用它们共同Linux中的Routetable、IPtable复杂的创立出当地假造收集。
相干收集设备事情道理

Bridge

Bridge(桥)是Linux上用来做TCP/IP二层协定互换的设备,与实际天下中的互换机功效类似。Bridge设备实例能够和Linux上其他收集设备实例毗连,既attach一个从设备,相似于在实际天下中的互换机和一个用户终端之间毗连一根网线。当无数据抵达时,Bridge会依据报文中的MAC信息举行播送、转发、抛弃处置。
.Bridge设备事情历程


<br>
如图所示,Bridge的功效次要在内核里完成。当一个从设备被attach到Bridge上时,相称于实际天下里互换机的端口被拔出了一根连有终真个网线。这时候在内核程序里,netdev_rx_handler_register()被挪用,一个用于承受数据的回调函数被注册。今后每当这个从设备收到数据时城市挪用这个函数能够把数据转发到Bridge上。当Bridge吸收到此数据时,br_handle_frame()被挪用,举行一个和实际天下中的互换机相似的处置历程:判别包的种别(播送/单点),查找外部MAC端口映照表,定位方针端标语,将数据转发到方针端口或抛弃,主动更新外部MAC端口映照表以自我进修。
Bridge和实际天下中的二层互换机有一个区分,图中左边画出了这类情形:数据被间接发到Bridge上,而不是从一个端口承受。这类情形能够看作Bridge本人有一个MAC能够自动发送报文,大概说Bridge自带了一个埋没端口和寄主Linux体系主动毗连,Linux上的程序能够间接从这个端口向Bridge上的其他端口发数据。以是当一个Bridge具有一个收集设备时,如bridge0到场了eth0时,实践上bridge0具有两个无效MAC地点,一个是bridge0的,一个是eth0的,他们之间能够通信。由此带来一个成心思的事变是,Bridge能够设置IP地点。一般来讲IP地点是三层协定的内容,不该该呈现在二层设备Bridge上。可是Linux里Bridge是通用收集设备笼统的一种,只需是收集设备就可以够设定IP地点。当一个bridge0具有IP后,Linux即可以经由过程路由表大概IP表划定规矩在三层定位bridge0,此时相称于Linux具有了别的一个埋没的假造网卡和Bridge的埋没端口相连,这个网卡就是名为bridge0的通用收集设备,IP能够当作是这个网卡的。当有切合此IP的数据抵达bridge0时,内核协定栈以为收到了一包方针为本机的数据,此时使用程序能够经由过程Socket吸收到它。一个更好的对照例子是实际天下中的领路由的互换机设备,它也具有一个埋没的MAC地点,供设备中的三层协定处置程序和办理程序利用。设备里的三层协定处置程序,对应名为bridge0的通用收集设备的三层协定处置程序,即寄主Linux体系内核协定栈程序。设备里的办理程序,对应bridge0寄主Linux体系里的使用程序。
Bridge的完成以后有一个限定:当一个设备被attach到Bridge上时,谁人设备的IP会变的有效,Linux不再利用谁人IP在三层承受数据。举比方下:假如eth0原本的IP是192.168.1.2,此时假如收到一个方针地点是192.168.1.2的数据,Linux的使用程序能经由过程Socket操纵承受到它。而当eth0被attach到一个bridge0时,只管eth0的IP还在,但使用程序是没法承受到上述数据的。此时应当把IP192.168.1.2付与bridge0。
别的必要注重的是数据流的偏向。关于一个被attach到Bridge上的设备来讲,只要它收到数据时,此包数据才会被转发到Bridge上,进而完成查表播送等后续操纵。当哀求是发送范例时,数据是不会被转发到Bridge上的,它会寻觅下一个发送出口。用户在设置收集时常常疏忽这一点从而形成收集妨碍。
VLANdevicefor802.1.q

VLAN又称假造收集,是一个被普遍利用的观点,有些使用程序把本人的外部收集也称为VLAN。此处次要说的是在物理天下中存在的,必要协定撑持的VLAN。它的品种良多,依照协定道理一样平常分为:MACVLAN、802.1.qVLAN、802.1.qbgVLAN、802.1.qbhVLAN。个中呈现较早,使用普遍而且对照成熟的是802.1.qVLAN,其基础道理是在二层协定里拔出分外的VLAN协定数据(称为802.1.qVLANTag),同时坚持和传统二层设备的兼容性。Linux里的VLAN设备是对802.1.q协定的一种外部软件完成,摹拟实际天下中的802.1.q互换机。
.VLAN设备事情历程


<br>
如图所示,Linux里802.1.qVLAN设备是以母子干系成对呈现的,母设备相称于实际天下中的互换机TRUNK口,用于毗连下级收集,子设备相称于一般接口用于毗连上级收集。当数据在母子设备间传送时,内核将会依据802.1.qVLANTag举行对应操纵。母子设备之间是一对多的干系,一个母设备能够有多个子设备,一个子设备只要一个母设备。当一个子设备有一包数据必要发送时,数据将被到场VLANTag然后从母设备发送进来。当母设备收到一包数据时,它将会剖析个中的VLANTag,假如有对应的子设备存在,则把数据转发到谁人子设备上并依据设置移除VLANTag,不然抛弃该数据。在某些设置下,VLANTag能够不被移除以满意某些监听程序的必要,如DHCP服务程序。举例申明以下:eth0作为母设备创立一个ID为100的子设备eth0.100。此时假如有程序请求从eth0.100发送一包数据,数据将被打上VLAN100的Tag从eth0发送进来。假如eth0收到一包数据,VLANTag是100,数据将被转发到eth0.100上,并依据设置决意是不是移除VLANTag。假如eth0收到一包包括VLANTag101的数据,其将被抛弃。上述历程隐含以下现实:关于寄主Linux体系来讲,母设备只能用来收数据,子设备只能用来发送数据。和Bridge一样,母子设备的数据也是无方向的,子设备收到的数据不会进进母设备,一样母设备上哀求发送的数据不会被转到子设备上。能够把VLAN母子设备作为一个全体设想为实际天下中的802.1.q互换机,上级接口经由过程子设备毗连到寄主Linux体系收集里,下级接口同过主设备毗连到下级收集,当母设备是物理网卡时下级收集是外界实在收集,当母设备是别的一个Linux假造收集设备时下级收集仍旧是寄主Linux体系收集。
必要注重的是母子VLAN设备具有不异的MAC地点,能够把它当做实际天下中802.1.q互换机的MAC,因而多个VLAN设备会共享一个MAC。当一个母设备具有多个VLAN子设备时,子设备之间是断绝的,不存在Bridge那样的互换转发干系,缘故原由以下:802.1.qVLAN协定的次要目标是从逻辑上断绝子网。实际天下中的802.1.q互换机存在多个VLAN,每一个VLAN具有多个端口,统一VLAN端口之间能够互换转发,分歧VLAN端口之距离离,以是其包括两层功效:互换与断绝。LinuxVLANdevice完成的是断绝功效,没有互换功效。一个VLAN母设备不成能具有两个不异ID的VLAN子设备,因而也就不成能呈现数据互换情形。假如想让一个VLAN里接多个设备,就必要互换功效。在Linux里Bridge专门完成互换功效,因而将VLAN子设备attach到一个Bridge上就可以完成后续的互换功效。总结起来,Bridge加VLANdevice能在功效层面完全摹拟实际天下里的802.1.q互换机。
Linux撑持VLAN硬件减速,在安装有特定硬件情形下,图中所述内核处置历程能够被放到物理设备上完成。
TAP设备与VETH设备

TUN/TAP设备是一种让用户态程序向内核协定栈注进数据的设备,一个事情在三层,一个事情在二层,利用较多的是TAP设备。VETH设备呈现较早,它的感化是反转通信数据的偏向,必要发送的数据会被转换成必要收到的数据从头送进内核收集层举行处置,从而直接的完成数据的注进。
.TAP设备和VETH设备事情历程


<br>
如图所示,当一个TAP设备被创立时,在Linux设备文件目次下将会天生一个对应char设备,用户程序能够像翻开一般文件一样翻开这个文件举行读写。当实行write()操纵时,数据进进TAP设备,此时关于Linux收集层来讲,相称于TAP设备收到了一包数据,哀求内核承受它,好像一般的物理网卡从外界收到一包数据一样,分歧的是实在数据来自Linux上的一个用户程序。Linux收到此数据后将依据收集设置举行后续处置,从而完成了用户程序向Linux内核收集层注进数据的功效。当用户程序实行read()哀求时,相称于向内核对询TAP设备上是不是有必要被发送进来的数据,有的话掏出到用户程序里,完成TAP设备的发送数据功效。针对TAP设备的一个抽象的比方是:利用TAP设备的使用程序相称于别的一台盘算机,TAP设备是本机的一个网卡,他们之间互相毗连。使用程序经由过程read()/write()操纵,和本机收集中心举行通信。
VETH设备老是成对呈现,送到一端哀求发送的数据老是从另外一端以哀求承受的情势呈现。该设备不克不及被用户程序间接操纵,但利用起来对照复杂。创立并设置准确后,向其一端输出数据,VETH会改动数据的偏向并将其送进内核收集中心,完成数据的注进。在另外一端能读到此数据。
收集设置举例申明

为了更好的申明Linux收集设备的用法,上面将用一系列的例子,申明在一个庞大的Linux收集元素组合出的假造收集里,数据的流向。收集设置简介以下:一其中心Bridge:bridge0下attach了4个收集设备,包含2个VETH设备,1个TAP设备tap0,1个物理网卡eth0。在VETH的别的一端又创立了VLAN子设备。Linux上共存在2个VLAN收集,既vlan100与vlan200。物理网卡和内部收集相连,而且在它之下创立了一个VLANID为200的VLAN子设备。
从vlan100子设备发送ARP报文

.ARPfromvlan100childdevice


<br>
如图所示,当用户实验ping192.168.100.3时,Linux将会依据路由表,从vlan100子设备收回ARP报文,详细历程以下:
1)用户ping192.168.100.3
2)Linux向vlan100子设备发送ARP信息。
3)ARP报文被打上VLANID100的Tag成为ARP@vlan100,转发到母设备上。
4)VETH设备将这一发送哀求变化偏向,成为一个必要承受处置的报文送进内核收集模块。
5)因为对真个VETH设备被到场到了bridge0上,而且内核发明它收到一个报文,因而报文被转发到bridge0上。
6)bridge0处置此ARP@vlan100信息,依据TCP/IP二层协定发明是一个播送哀求,因而向它所晓得的一切端口播送此报文,个中一起进进另外一对VETH设备的一端,一起进进TAP设备tap0,一起进进物理网卡设备eth0。此时在tap0上,用户程序能够经由过程read()操纵读到ARP@vlan100,eth0将会向外界发送ARP@vlan100,但eth0的VLAN子设备不会收到它,由于此数据偏向为哀求发送而不是哀求吸收。
7)VETH将哀求偏向转换,此时在另外一端失掉哀求承受的ARP@vlan100报文。
8)对端VETH设备发明无数据必要承受,而且本人有两个VLAN子设备,因而实行VLAN处置逻辑。个中一个子设备是vlan100,与ARP@vlan100符合,因而往除VLANID100的Tag转发到这个子设备上,从头成为尺度的以太网ARP报文。另外一个子设备因为ID不符合,不会失掉此报文。
9)此VLAN子设备又被attach到另外一个桥bridge1上,因而转发本人收到的ARP报文。
10)bridge1播送ARP报文。
11)终极别的一个TAP设备tap1收到此哀求发送报文,用户程序经由过程read()能够失掉它。
从vlan200子设备发送ARP报文

.ARPfromvlan200childdevice


<br>
和后面情形相似,区分是VLANID是200,对真个vlan200子设备设置为reorder_hdr=0,暗示此设备被请求保存收到的报文中的VLANTag。此时子设备会收到ARP报文,可是带了VLANID200的Tag,既ARP@vlan200。
从中央bridge发送ARP报文

.ARPfromcentralbridge


<br>
当bridge0具有IP时,经由过程Linux路由表用户程序能够间接将ARP报文发向bridge0。这时候tap0和内部收集都能收到ARP,但VLAN子设备因为VLANID过滤的缘故原由,将收不到ARP信息。
从内部收集向物理网卡发送ARP@vlan200报文

.ARPfromexternalnetwork


<br>
当内部收集毗连在一个撑持VLAN而且对应端口为vlan200时,此情形会产生。此时一切的VLANID为200的VLAN子设备都将承受到报文,假如设置reorder_hdr=0则会收到带Tag的ARP@vlan200。
从TAP设备以ping体例发送ARP

.pingfromTAPdevice


<br>
给tap0付与IP并到场路由,此时再Ping其对应网段的未知IP会发生ARP发送哀求。必要注重的是此时因为tap0上存在的是发送而不是吸收哀求,因而ARP报文不会被转发到桥上,从而甚么也不会产生。图中右侧画了一个相似情形:从vlan200子设备发送ARP哀求。因为短少VETH设备反转哀求偏向,因而报文也不会被转发到桥上,而是间接经由过程物理网卡发往内部收集。
以文件操纵体例从TAP设备发送报文

.fileoperationonTAPdevice


<br>
用户程序指定tap0设备发送报文有两种体例:socket和fileoperation。当用socket_raw标记新建socket并指定设备编号时,能够请求内核将报文从tap0发送。但和后面的pingfromtap0情形相似,因为报文偏向成绩,动静其实不会被转发到bridge0上。当用open()体例翻开tap设备文件时,情形有所分歧。当实行write()操纵时,内核以为tap0收到了报文,从而会触发转动员作,bridge0将收到它。假如发送的报文如图所示,是一个以A为目标地的照顾VLANID100Tag的单点报文,bridge0将会找到对应的设备举行转发,对应的VLAN子设备将收到没有VLANID100Tag的报文。

在学习初期,你一定会遇到很多困难,或者说各种困难,所以你最好先将你linux中的重要内容备份,因为,在你学习的过程中,很可能将系统搞废(eg:源混乱等);

老尸 发表于 2015-1-18 18:28:25

一些显而易见的小错误还是用vi改正比较方便。以后的大一点的程序就得在Linux下调试了,因为有的头文件在VC里面说找不到。?

若相依 发表于 2015-1-22 20:36:09

如果上面的措施没有解决问题,此时你就需要Linux社区的帮助了。 Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人。

变相怪杰 发表于 2015-1-25 16:15:47

对Linux命令熟悉后,你可以开始搭建一个小的Linux网络,这是最好的实践方法。Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。

山那边是海 发表于 2015-1-29 06:50:01

众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。

小妖女 发表于 2015-2-5 15:01:07

我学习Linux的心得体会 ,希望对大家的学习有所帮助,由于水平有限,本文难免有所欠缺,望请指正。

admin 发表于 2015-2-5 23:21:57

熟悉系统的基本操作,Linux的图形界面直观,操作简便,多加上机练习就可熟悉操作,在Linux下学习办公软件等常用软件。

小女巫 发表于 2015-2-8 20:30:47

我们自学,就这个循环的过程中,我们学习了基本操作,用vi,shell,模拟内存的分配过程等一些OS管理。

冷月葬花魂 发表于 2015-2-23 09:24:04

编程学习及开发,Linux是免费,开源的操作系统,并且可开发工具相当多,如果您支持自由软件,一定要同广大热爱自由软件人士一同为其不懈努力。

透明 发表于 2015-3-7 06:29:19

首先Linux是开源的,这也是最主要的原因,想学windows,Unix,对不起我们没源代码。也正是因为这样,Linux才能够像滚雪球一样越滚越大,发展到现在这种规模。

飘飘悠悠 发表于 2015-3-14 12:38:07

任何人都可以根据自己的喜好来定制适合自己的操作系统,Linux?是抢占式多任务多用户操作系统.

乐观 发表于 2015-3-21 07:49:26

学习Linux半年了~个人认为不会的多在网上找资料网上有很多资料可以搜索到,LS那位说放手去搞。
页: [1]
查看完整版本: Linux编程之Linux 上的基本收集设备详解仓酷云