网桥知识总结.docx
- 文档编号:10163015
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:57
- 大小:370.24KB
网桥知识总结.docx
《网桥知识总结.docx》由会员分享,可在线阅读,更多相关《网桥知识总结.docx(57页珍藏版)》请在冰豆网上搜索。
网桥知识总结
Linux网桥知识总结(beta1)
——bymoonflow
qq:
171932120
(总结自互联网)
前言
此文档是本人这段时间内学习Linux网络协议栈网桥功能相关知识,总结并且整理出来的文档。
本文中的参考内核代码为2.6.24(相关的资料较多,便于开展),当然也是对互联网资源的整合。
参考了锐捷的一份文档,并且参考了网上很多资源。
可以说基本上总结自互联网。
参考中附上我学习时参考的资料,很多,而且他们写的都非常好,导致我都不知道写啥了。
不过仅仅只是为了借这次总结的机会,让个人对Linux网桥部分更加深入。
因为本人初学Linux协议栈,对很多部分都还很迷茫,所以很多地方会出现失误或者不够清楚。
我接触Linux时间很短,但是非常喜爱Linux,同时对网络部分非常喜爱,希望大家喜欢并且与我交流,共同进步。
第一章网桥的基本概念
1.1网桥的作用
网桥工作在ISO层次结构中的二层,通过mac地址来区分,实现几个网络或主机之间的互联。
1.2网桥的工作原理
Figure(b)showswhatiscalledastore-and-forwardbridge,whichistheschemeusedbyLinux:
Ethernetframesarecopiedoutoftherightportsonlyaftertheyhavebeenreceivedintheirentirety.(转自ULNI)
网桥的工作原理其实很简单,就是:
某个主机的消息从哪个端口进来,那么这个主机必定位与这个端口这一侧,从这个端口一定能找到这个主机,给这个主机的消息也就应该从这个端口转发。
比如,一个网桥连接主机A和主机B。
当主机A连接到网桥时,会告诉网桥,它在端口A。
网桥会维持一个映射表,让端口A与主机A的mac地址对应。
当有其他主机试图通过网桥转发目的mac地址为主机A的mac地址的消息时,网桥会通过查表来指导应该由端口A转发。
同理,当网桥连接两个或两个以上主机或主机构成的网络时,也按照这个原则,维持一个记录端口和mac地址的映射表,需要转发消息的时候通过查找这个表来找到应该去的地址。
当然,如果收到的消息是发给网桥本身的,就要交给上层协议来处理。
这就是网桥的工作原理。
第二章重要数据结构
2.1net_bridge
在/net/bridge/br_private.h,这个结构体描述一个网桥。
dev是这个桥对应的设备。
port_list是net_bridge_port的链表头。
hash[BR_HASH_SIZE]是net_bridge_fdb_entry的散列表,也是网桥MAC地址和端口的映射表CAM。
structnet_bridge
{
//自旋锁
spinlock_tlock;
//桥组中的端口列表
structlist_headport_list;
//网桥会建立一个虚拟设备来进行管理,这个设备的MAC地址是动态指定的,通常就是桥组中一个物理端口的MAC地址
structnet_device*dev;
//网桥中虚拟网卡的统计数据
structnet_device_statsstatistics;
//hash列表自旋锁
spinlock_thash_lock;
//存放的是net_bridge_fdb_entry的哈希表,实际上就是mac和port的对应表
structhlist_headhash[BR_HASH_SIZE];
structlist_headage_list;
unsignedlongfeature_mask;
//以下定义了STP协议所使用的信息
bridge_iddesignated_root;//DR
bridge_idbridge_id;//这个成员一下是stp相关的信息
u32root_path_cost;
unsignedlongmax_age;
unsignedlonghello_time;
unsignedlongforward_delay;
unsignedlongbridge_max_age;
unsignedlongageing_time;
unsignedlongbridge_hello_time;
unsignedlongbridge_forward_delay;
u8group_addr[ETH_ALEN];
u16root_port;
enum{
BR_NO_STP,/*nospanningtree*/
BR_KERNEL_STP,/*oldSTPinkernel*/
BR_USER_STP,/*newRSTPinuserspace*/
}stp_enabled;
unsignedchartopology_change;
unsignedchartopology_change_detected;
structtimer_listhello_timer;
structtimer_listtcn_timer;
structtimer_listtopology_change_timer;
structtimer_listgc_timer;
structkobjectifobj;
};
2.2net_bridge_port
在/net/bridge/br_private.h,这是网桥端口的结构体。
br指向它属于的网桥。
port_no是端口ID,唯一的标识。
//网桥中的端口,它实际上表示的是接收该数据包的网桥的端口的相关信息
structnet_bridge_port
{
//当前端口所在的briage
structnet_bridge*br;
//此端口对应的物理端口
structnet_device*dev;
//同一桥内的端口链表
structlist_headlist;
//以下定义了STP协议所使用的信息
u8priority;
u8state;
u16port_no;
unsignedchartopology_change_ack;
unsignedcharconfig_pending;
port_idport_id;
port_iddesignated_port;
bridge_iddesignated_root;
bridge_iddesignated_bridge;
u32path_cost;
u32designated_cost;
structtimer_listforward_delay_timer;
structtimer_listhold_timer;
structtimer_listmessage_age_timer;
structkobjectkobj;
structrcu_headrcu;
};
2.3net_bridge_fdb_entry
在/net/bridge/br_private.h,这是散列表的中间链接结构体,net_bridge中的hash,通过这个结构链入net_bridge_port。
其中包含了端口的一些信息,最重要的是local,从它可以知道这个端口信息是本地的,还是其他相连主机的。
structnet_bridge_fdb_entry
{
//用于CAM表连接的链表指针
structhlist_nodehlist;
//对应的物理接口指针,其中包含一个net_device的指针指向该物理网口
structnet_bridge_port*dst;
//RCU锁
structrcu_headrcu;
//当前引用计数
atomic_tuse_count;
//超时时间
unsignedlongageing_timer;
//MAC地址
mac_addraddr;
//标明是否为本机MAC地址
unsignedcharis_local;
//标明是否为静态地址
unsignedcharis_static;
};
2.4net_device
在/include/linux/netdevice.h,这是一个庞大的结构体,定义了网络设备
structnet_device
{
/*
*Thisisthefirstfieldofthe"visible"partofthisstructure
*(i.e.asseenbyusersinthe"Space.c"file).Itisthename
*theinterface.
*/
//设备名称
charname[IFNAMSIZ];
/*devicenamehashchain*/
structhlist_nodename_hlist;
/*
*I/Ospecificfields
*FIXME:
Mergetheseandstructifmapintoone
*/
//共享内存的起始,结束地址
unsignedlongmem_end;/*sharedmemend*/
unsignedlongmem_start;/*sharedmemstart*/
//网络设备的I/0基地址
unsignedlongbase_addr;/*deviceI/Oaddress*/
//被赋予的中断号
unsignedintirq;/*deviceIRQnumber*/
/*
*Somehardwarealsoneedsthesefields,buttheyarenot
*partoftheusualsetspecifiedinSpace.c.
*/
//在多端口设备上使用哪一个端口
unsignedcharif_port;/*SelectableAUI,TP,..*/
//为设备分配的DMA通道
unsignedchardma;/*DMAchannel*/
//设备的状态
unsignedlongstate;
structlist_headdev_list;
#ifdefCONFIG_NETPOLL
structlist_headnapi_list;
#endif
/*Thedeviceinitializationfunction.Calledonlyonce.*/
int(*init)(structnet_device*dev);
/*-------FieldspreinitializedinSpace.cfinishhere-------*/
/*Netdevicefeatures*/
unsignedlongfeatures;
#defineNETIF_F_SG1/*Scatter/gatherIO.*/
#defineNETIF_F_IP_CSUM2/*CanchecksumTCP/UDPoverIPv4.*/
#defineNETIF_F_NO_CSUM4/*Doesnotrequirechecksum.F.e.loopack.*/
#defineNETIF_F_HW_CSUM8/*Canchecksumallthepackets.*/
#defineNETIF_F_IPV6_CSUM16/*CanchecksumTCP/UDPoverIPV6*/
#defineNETIF_F_HIGHDMA32/*CanDMAtohighmemory.*/
#defineNETIF_F_FRAGLIST64/*Scatter/gatherIO.*/
#defineNETIF_F_HW_VLAN_TX128/*TransmitVLANhwacceleration*/
#defineNETIF_F_HW_VLAN_RX256/*ReceiveVLANhwacceleration*/
#defineNETIF_F_HW_VLAN_FILTER512/*ReceivefilteringonVLAN*/
#defineNETIF_F_VLAN_CHALLENGED1024/*DevicecannothandleVLANpackets*/
#defineNETIF_F_GSO2048/*EnablesoftwareGSO.*/
#defineNETIF_F_LLTX4096/*LockLessTX-deprecated.Please*/
/*donotuseLLTXinnewdrivers*/
#defineNETIF_F_NETNS_LOCAL8192/*Doesnotchangenetworknamespaces*/
#defineNETIF_F_MULTI_QUEUE16384/*HasmultipleTX/RXqueues*/
#defineNETIF_F_LRO32768/*largereceiveoffload*/
/*Segmentationoffloadfeatures*/
#defineNETIF_F_GSO_SHIFT16
#defineNETIF_F_GSO_MASK0xffff0000
#defineNETIF_F_TSO(SKB_GSO_TCPV4< #defineNETIF_F_UFO(SKB_GSO_UDP< #defineNETIF_F_GSO_ROBUST(SKB_GSO_DODGY< #defineNETIF_F_TSO_ECN(SKB_GSO_TCP_ECN< #defineNETIF_F_TSO6(SKB_GSO_TCPV6< /*Listoffeatureswithsoftwarefallbacks.*/ #defineNETIF_F_GSO_SOFTWARE(NETIF_F_TSO|NETIF_F_TSO_ECN|NETIF_F_TSO6) #defineNETIF_F_GEN_CSUM(NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) #defineNETIF_F_V4_CSUM(NETIF_F_GEN_CSUM|NETIF_F_IP_CSUM) #defineNETIF_F_V6_CSUM(NETIF_F_GEN_CSUM|NETIF_F_IPV6_CSUM) #defineNETIF_F_ALL_CSUM(NETIF_F_V4_CSUM|NETIF_F_V6_CSUM) structnet_device*next_sched; /*Interfaceindex.Uniquedeviceidentifier*/ //设备在内核中对应的序号 intifindex; intiflink; //获得接口状态的函数指针 structnet_device_stats*(*get_stats)(structnet_device*dev); structnet_device_statsstats; #ifdefCONFIG_WIRELESS_EXT /*ListoffunctionstohandleWirelessExtensions(insteadofioctl). *See conststructiw_handler_def*wireless_handlers; /*InstancedatamanagedbythecoreofWirelessExtensions.*/ structiw_public_data*wireless_data; #endif conststructethtool_ops*ethtool_ops; /*Hardwareheaderdescription*/ conststructheader_ops*header_ops; /* *Thismarkstheendofthe"visible"partofthestructure.All *fieldshereafterareinternaltothesystem,andmaychangeat *will(read: maybecleanedupatwill). */ //接口标志 unsignedintflags;/*interfaceflags(alaBSD)*/ unsignedshortgflags; unsignedshortpriv_flags;/*Like'flags'butinvisibletouserspace.*/ unsignedshortpadded;/*Howmuchpaddingaddedbyalloc_netdev()*/ unsignedcharoperstate;/*RFC2863operstate*/ unsignedcharlink_mode;/*mappingpolicytooperstate*/ unsignedmtu;/*interfaceMTUvalue*/ unsignedshorttype;/*interfacehardwaretype*/ unsignedshorthard_header_len;/*hardwarehdrlength*/ structnet_device*master;/*Pointertomasterdeviceofagroup, *whichthisdeviceismemberof. */ /*Interfaceaddressinfo.*/ unsignedcharperm_addr[MAX_ADDR_LEN];/*permanenthwaddress*/ unsignedcharaddr_len;/*hardwareaddresslength*/ unsignedshortdev_id;/*forsharednetworkcards*/ structdev_addr_list*uc_list;/*Secondaryunicastmacaddresses*/ intuc_count;/*Numberofinstalleducasts*/ intuc_promisc; structdev_addr_list*mc_list;/*Multicastmacaddresses*/ intmc_count;/*Numberofinstalledmcasts*/ intpromiscuity; intallmulti; /*Protocolspecificpointers*/ void*atalk_ptr;/*AppleTalklink*/ void*ip_ptr;/*IPv4specificdata*/ void*dn_ptr;/*DECnetspecificdata*/ void*ip6_ptr;/*IPv6specificdata*/ void*ec_ptr;/*Econetspecificdata*/ void*ax25_ptr;/*AX.25specificdata*/ structwireless_dev*ieee80211_ptr;/*IEEE802.11specificdata, assignbeforeregistering*/ /* *Cachelinemostlyusedonreceivepath(includingeth_type_trans()) */ unsignedlonglast_rx;/*TimeoflastRx*/ /*Interfaceaddressinfousedineth_type_trans()*/ unsignedchardev_addr[MAX_ADDR_LEN];/*hwaddress,(beforebcast becausemostpacketsareunicast)*/ unsignedcharbroadcast[MAX_ADDR_LEN];/*hwbcastadd*/ /* *Cachelinemostlyusedonqueuetransmitpath(qdisc) */ /*devicequeuelock*/ spinlock_tqueue_lock____cacheline_aligned_in_smp; structQdisc*qdisc; structQdisc*qdisc_sleeping; structlist_headqdisc_list; unsignedlongtx_queue_len;/*Maxframesperqueueallowed*/ /*PartiallytransmittedGSOpacket.*/ structsk_buff*gso_skb; /*ingresspathsynchronizer*/ spinlock_tingress_lock; structQdisc*qdisc_ingress; /* *Onepartismostlyusedonxmitpath(device) */ /*h
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 知识 总结