IP组播基础及工作原理实战——3

                                    PIM基础及工作原理

PIM(协议无关组播)中的“协议无关”指的是与单播路由协议无关,即PIM不需要维护专门的单播路由信息,而是直接利用单播路由表的路由信息(注意:还有自己的组播路由表),对组播报文执行RPF(Reverse Path Forwarding,逆向路径转发)检查,检查通过后创建组播路由表项,从而转发组播报文。

目前在实际网络中,PIM主要有两种模式:PIM-DMPIM-DenseModePIM密集模式)、PIM-SMPIM-Sparse ModePIM稀疏模式),均可用于IPv4和IPv6网络。由PIM路由器所组成的网络称为PIM网络。通常一个大的PIM网络可以划分为多个PIM来管理和控制组播报文的转发,这里的域内组播协议即是指PIM域内组播协议

在目前的PIM协议中,主要实现方式包括PIM-DMPIM-SMASM模型)、PIM-SMSSM模型)3。SSM模型与ASM模型之间的最大差异就是是否指定了组播源


1、PIM路由器

接口上使能了PIM协议的路由器即为PIM路由器。在建立组播分发树的过程中,PIM路由器又分为以下几种:

(1)第一跳路由器:在组播转发路径上与组播源相连且负责转发该组播源发出的组播数据的PIM路由器。如上图的RouterE。

(2)叶子路由器与用户主机相连的PIM路由器,但连接的用户主机不一定为组成员,如上图中的RouterA、RouterB、RouterC。

(3)最后一跳路由器:在组播转发路径上与组播组成员相连,且负责向该组成员转发组播数据的PIM路由器。如上图中的RouterA、RouterB

(4)中间路由器:在组播转发路径上第一跳路由器与最后一跳路由器之间的PIM路由器。如上图RouterD

2、组播分发树

“组播分发树”是PIM网络中以组播组为单位PIM路由器上建立的点到多点的组播转发路径。由于组播转发路径呈现树型结构,也称为组播分发树(MDTMulticast Distribution Tree

组播分发树主要包括以下几种:

(1)以组播源为根以组播成员为叶子的组播分发树称为SPTShortest Path Tree,最短路径树)。SPT同时适用于PIM-DM网络和PIM-SM网络。如上图的RouterE——>RouterD——>RouterA/RouterB/RouterC就是一棵以Source为根,以HostA、HostB和HostC为叶子的SPT。

(2)RPRendezvousPoint,汇集点)为根,以组播组成员为叶子的组播分发树称为RPTRP Tree,汇集点树)。RPT仅适用于PIM-SM网络。RP是通过手动配置的。

关于组播分发树:

组播分发树是用来描述IP组播报文在网络中经过的路径,分为两个基本类型:源路径树(如SPT)和共享树(如RPT)。

组播路由形成了一个从数据源到多个接收端的单向无环数据传输路径,即组播分发树。
l 组播分发树的两个基本类型:源路径树和共享树。
l 源路径树:以组播源作为树根,将组播源到每一个接收者的最短路径结合起来构成的转发树。由于源路径树使用的是从组播源到接收者的最短路径,因此也称为最短路径树(Shortest Path TreeSPT)。对于某个组,网络要为任何一个向该组发送报文的组播源建立一棵树。
l 共享树:以某个路由器作为路由树的树根,该路由器称为汇集点(Rendezvous PointRP),将 RP 到所有接收者的最短路径结合起来构成转发树。
l 使用共享树时,对应某个组,网络中只有一棵树。所有的组播源和接收者都使用这棵树来收发报文,组播源先向树根发送数据报文,之后报文又向下转发到达所有的接收者。

本例中有两个组播源(源S1和源S2),接收者R1RT2。所以本例中有两棵源路径树,分别是:
l S1—A---CR1-----ER2
l S2---F----D---CR1------ER2

共享树以某个路由器作为路由树的树根,该路由器称为汇集点(Rendezvous Point, RP),将 RP 到所有接收者的最短路径结合起来构成转发树。使用共享树时,对应某个组,网络中只有一棵树所有的组播源和接收者都使用这棵树来收发报文组播源先向树根发送数据报文,之后报文又向下转发到达所有的接收者

本例中两个源S1S2共享一颗树 DRP----CR1----ER2

3、PIM路由表项

PIM路由表项通过PIM协议建立的组播路由表项。PIM路由表项中主要用于指导转发的信息,包括组播源IP地址(是一个单播IP地址)、组播组IP地址(是一个组播IP地址)、上游接口(本地路由器上接收到组播数据的接口,如上图中RouterDGE3/0/0接口)和下游接口(将组播数据转发出去的接口,如上图中RouterDGE1/0/0GE2/0/0接口)

PIM网络中存在两种路由表项SG)路由表项或(*G)路由表项。S表示组播源IP地址,G表示组播组IP地址,*表示任意组播源。其中,SG)路由表项中明确指定了组播源S的位置,主要用于在PIM路由器上建立SPT(最短路径树),同时适用于PIM-DM和PIM-SM网络;而*G)路由表项中代表不知道组播源位置,只知道组播组IP地址,主要用于在PIM路由器上建立RPT(汇集点树),仅适用于PIM-SM网络

PIM路由器上可能同时存在以上两种路由表项。当收到源地址为S,组地址为G的组播报文,且通过RPF(逆向路径转发)检查的情况下,按照如下的规则转发:

(1)如果存在(S,G)路由表项,则由(S,G)路由表项指导报文转发。

(2)如果不存在(S,G)路由表项,只存在(*,G)路由表项,则先依照(*G)路由表项创建(S,G)路由表项,再由(S,G)路由表项指导报文转发

组播数据转发

● 组播路由和单播路由是相反的

☆ 单播路由关心数据报文要到哪里去。

☆ 组播路由关心数据报文从哪里来。

● 组播路由使用“反向路径转发”机制(RPF,Reverse Path Forwarding)

单播报文的转发过程中,路由器并不关心源地址,只关心报文中的目的地址通过目的地址决定向哪个接口转发

 在组播中,报文是发送给一组接收者的,这些接收者用一个逻辑地址标识。路由器在接收到报文后,必须根据源和目的地址确定出上游(指向组播源)和下游方向,把报文沿着远离组播源的方向进行转发。这个过程称作 RPFReverse Path Forwarding,逆向路径转发)

什么是逆向路径转发RPF??——路由器收到组播数据报文后,只有确认这个数据报文是从自己到组播源的出接口上到来的,才进行转发,否则丢弃报文。

RPF检查——在单播路由表中查找到组播报文源地址的路由:如果该路由的出接口就是组播报文的入接口,RPF成功;否则RPF失败,报文丢弃。

● RPF 执行过程中会用到原有的单播路由表以确定上游和下游的邻接结点。只有当报文是从上游邻接结点对应的接口(称作 RPF 接口)到达时,才向下游转发

● RPF 的作用除了可以正确地按照组播路由的配置转发报文外,还能避免由于各种原因造成的环路,环路避免在组播路由中是一个非常重要的问题

● RPF 的主体是 RPF 检查,路由器收到组播报文后,先对报文进行 RPF 检查,只有检查通过才转发,否则丢弃。 RPF 检查过程如下:

 1)路由器在单播路由表中查找组播源或 RP 对应的 RPF 接口(当使用信源树时,查找组播源对应的 RPF 接口,使用共享树时查找 RP 对应的RPF 接口),某个地址对应的 RPF 接口是指从路由器向该地址发送报文时的出接口

 2)如果组播报文是从 RPF 接口接收下来的,则 RPF 检查通过,报文向下游接口转发;

 3)否则,丢弃该报文

● RPF检查的过程实际上是查找单播路由表的过程。

● 路由器接收到组播报文后,后查找单播路由表,检查到达组播源的出接口是否与接收到组播报文接口一致。如果一致则认为合法,如果不一致则认为从错误接口收到报文, RFP检查失败,丢弃报文。

● 如图所示的本例中,路由器的S0接口接收到组播报文。于是启动RPF检查。通过查找单播路由表,发现到达路由源151.10.0.0/16的出接口为S1,与接收口S0不一致,于是RPF失败,并认为是从错误接口收到组播报文,丢弃该报文。

● 与前一例相同的组网图,路由器从S1接口接收到组播报文,同样进行RPF检查。对比单播路由表,发现到达组播源的出接口是S1,与接收口一致,于是正常接收该报文,并向组播分树中的下游接口转发组播报文

——通过这里的讲解描述,所谓的RPF逆向路径检测,是针对单播路由表来说的,本来单播路由表是按照数据流从源到目的的顺序查找转发的,就是查找的是目的,或说是下游(下一站)的路径(或是接口,或是地址),而组播则是查找的源,或者说是上游的路由,所以叫做逆向路径查找

二、PIM-DM基本工作原理

PIM-DM(PIM密集模式)使用“推”(Push)模式转发组播报文,一般应用于组播组成员规模相对较小、相对密集的网络。在实现过程中,它会假设网络中的组成员分布非常稠密,每个网段都可能存在组成员。当有活跃的组播源出现时,PIM-DM会将组播源发来的组播报文扩散到整个网络的PIM路由器上,再裁剪掉不存在组播报文转发的分支。——先扩散,再裁剪

PIM-DM通过周期性的进行“扩散(Flooding)——剪枝(Prune)”过程来构建并维护一棵连接组播源和组成员的单向无环SPTSource Specific Shortest Path Tree,源指定最短路径树)。如果在下一次“扩散——剪枝”进行前,被裁剪掉的分支由于其叶子路由器上有新的组成员加入而希望提前恢复转发状态,也可通过嫁接(Graft机制主动恢复其对组播报文的转发。

PIM-DM的关键工作机制包括邻居发现、扩散、剪枝、嫁接、断言和状态刷新。其中,扩散、剪枝、嫁接是构建SPT的主要方法。

1、邻居发现(Neighbor Discovery)

PIM路由器每个使能了PIM协议的接口上都会对外发送Hello报文。封装Hello报文的组播报文的目的地址是224.0.0.13(代表同一网段中所有PIM路由器,是一个永久组播地址)、源地址为接口的IP地址、TTL数值为1

Hello报文的作用:发现PIM邻居、协调各项PIM协议报文参数,并维持邻居关系。

发现PIM邻居的过程中,同一网段中的PIM路由器都必须接收目的地址为224.0.0.13的组播报文。这样直接相连的PIM路由器之间通过交互Hello报文后就可以彼此知道自己的邻居信息,建立邻居关系。只有邻居关系建立成功后,PIM路由器之间才能相互接收PIM协议报文,从而创建组播路由表项。

Hello报文中携带多项PIM协议报文参数,主要用于PIM邻居之间PIM协议报文的控制,协调各项PIM协议报文参数。具体参数包括:

(1)DR_Priority:表示各路由器接口竞选DR(指定路由器)的优先级,优先级越高越容易获胜,担当IGMPv1的查询器(注意,如果是运行IGMPv2或IGMPv3则采用专门的查询器选举机制)。

(2)Holdtime:表示保持邻居为可达状态的超时时间,超过这个时间没收到邻居发来的Hello报文即认为该邻居不可达。这与RIP、OSPF等动态路由协议中的Hello报文是一样的。

(3)LAN_Delay:表示共享网段内传输Prune(剪枝)报文的延迟时间,超过这个时间,这个报文将被丢弃。

(4)Neighbor-Tracking:表示邻居跟踪功能

(5)Override-Interval:表示Hello报文中携带的否决剪枝的时间间隔。当超过这个时间后原来的剪枝状态就要被中止,恢复对应接口的组播转发功能。

2、维持邻居关系

PIM路由器之间周期性地发送Hello报文。如果Holdtime超时还没有接收到该PIM邻居发出的新的Hello报文,则认为该邻居不可达,将其从邻居列表中清除。

PIM邻居的变化将导致网络中组播拓扑的变化。如果组播分发树上的某上游邻居或下游邻居不可达,将导致组播路由器重新收敛,组播分发树迁移。

3、扩散

当PIM-DM网络总出现活跃的组播源之后,组播源发送的组播报文将在全网内扩散(Flooding)。“扩散”的目的其实就是为了下一步的“剪枝”和“断言”操作。当PIM路由器接收到组播报文,并根据单播路由表进行RPF检查通过后,就会在该路由器上创建(S,G)表项。PIM路由器的下游接口列表中包括了除上游接口之外,与所有PIM邻居相连的接口,到达的组播报文将从各个下游接口转发出去。最后组播报文扩散到达叶子路由器,此时会出现以下两种情况:

(1)如果与该叶子路由器相连用户网段上存在组成员,则将与该网段相连的接口加入(S,G)表项的下游接口列表中,后续的组播报文会向组成员转发。

(2)如果与该叶子路由器相连用户网段上不存在组成员,且不需要向其下游PIM邻居转发组播报文,则执行“剪枝”机制,从组播路径中去掉这部分路径。

有时组播报文扩散到一个连着多台PIM路由器的共享网段时,会出现这种情况:这些PIM路由器上进行的RPF检查都能通过,从而有多份相同报文转发到这个网段。此时,需要执行“断言”机制,保证只有一个PIM路由器向该网段转发组播报文。

如上图,在PIM-DM网络中,RouterA、RouterB和RouterC之间通过发送Hello报文建立了PIM邻居关系。HostA通过RouterA与HostA之间运行的IGMP协议加入了组播组G,HostB没有加入任何组播组。则扩散的具体过程如下,从中也反映了扩散的目的之一——“剪枝”。

(1)组播源S开始向组播组G发送组播报文。

(2)RouterC接收到源发送的组播报文后根据单播路由表进行RPF检查。RPF检查通过后创建(S,G)表项,下游接口列表包括与RouterA和RouterB相连的接口,后续到达的报文向RouterA和RouterB转发。

(3)RouterA接收来自RouterC的组播报文,通过RPF成功检查后在本地创建对应(S,G)表项,并在下游接口列表添加与组成员HostA相连的接口,后续到达的报文向HostA转发。

(4)RouterB接收来自RouterC的组播报文,由于与RouterB相连下游网段不存在组成员和PIM邻居,所以执行剪枝操作,不会发送组播数据到HostB上。

4、剪枝(Prune)

通过“扩散”特性可了解“剪枝”的目的,剪枝的原理如下:

当PIM路由器接收到组播报文后,通过RPF检查,但是下游网段没有组播报文需求时,PIM路由器会向上游发送剪枝报文通知上游路由器禁止相应下游接口的转发将其从(S,G)表项的下游接口列表中删除。剪枝操作由叶子路由器发起逐跳向上,最终组播转发路径上只存在与组成员相连的分支。

路由器为被裁剪的下游接口启动一个剪枝定时器,定时器超时后接口恢复转发。这时,组播报文又会重新在全网范围内扩散,新加入的组成员可以接收到组播报文。随后,下游不存在组成员的叶子路由器再次将向上发起剪枝操作。通过这种周期性地扩散——剪枝,PIM-DM周期性的刷新SPT。当下游接口被剪枝后会执行以下操作:

(1)如果下游叶子路由器有组成员加入,并且希望在下次“扩散——剪枝”前就恢复组播报文转发,则执行“嫁接”机制

(2)如果下游叶子路由器一直没有组成员加入,希望该接口保持抑制转发状态,则执行“状态刷新机制”

——从上面的描述,可以得出,组播路由表项的数据结构除了包括(S,G)外,还包括一个下游接口列表,可设想如下(S,G<GE0/0/1,GE0/0/2,...>,而接口列表的确定依赖邻居关系表,所谓的剪枝Prune,就是对(S,G<>的项进行删除,也就是没有下游接口的组播路由项进行删除。如叶子路由器因为没有组成员,相应的组播路由表项后面就没有接口列表,进行组播路由表项的删除,同时,向上游路由器发送剪枝报文,上游路由器的(S,G)表项将对应的接口列表中的这个接口删除,再判断(S,G)表项的接口列表是否为空,不为空,说明还有其他分支上需要转发(S,G)的组播报文,剪枝到此为止,如果(S,G)表项的接口列表为空,在删除此组播路由表项,同时再次上传剪枝报文到它的上游路由器进行剪枝

如下图,RouterB上未连接组成员。在这种情况下,RouterB会向上游发起剪枝请求。过程如下:

(1)RouterB向上游RouterC发送Prune报文,通知RouterC不用再转发数据到该下游网段。

(2)RouterC收到Prune报文后,停止该下游接口(也就是与RouterB相连的出接口)转发,将该下游接口从(S,G)表项中删除,后续到达的报文只向RouterA转发。

5、嫁接(Graft)

PIM-DM通过“嫁接机制”可使有新组成员加入的网段快速得到组播报文。叶子路由器通过IGMP了解到与其相连的用户网段上,组播组G有新的组成员加入。随后叶子路由器会向上游发送Graft报文,请求上游路由器恢复相应出接口转发,将其添加在(S,G)表项下游接口列表中

嫁接过程从叶子路由器开始,到有组播报文到达的路由器结束。如下图所示为具体的嫁接过程:

(1)RouterB希望立即恢复对HostB组播报文的转发,于是向上游路由器RouterC发送Graft报文,请求恢复相应出接口转发组播报文。

(2)RouterC收到Graft报文后,恢复与RouterB相连的出接口转发,将该接口添加到(S,G)表项中的下游接口列表中,这样后续到达的报文向RouterB转发,直达HostB。

——也就是说,作为组播路由器,对于建立的组播路由表项不删除,只是对接口进行管理

6、状态刷新(StateRefresh)

在PIM-DM网络中,为了避免被剪枝的接口因为“剪枝定时器”超时而恢复转发,离组播源最近的第一跳路由器会周期性地触发State Refresh报文在全网内扩散。收到状态刷新(State Refresh)报文的PIM路由器会刷新剪枝定时器的状态,其目的就是查找原来被剪枝的路径上是否有组播成员要加入,要恢复转发状态,是一种被动中止剪枝状态的操作。在原来被剪枝接口的下游叶子路由器上,如果有新的组成员加入,则立即中止剪枝状态,对应路径的组播转发;如果仍没有组成员加入,则该接口将一直处于抑制转发状态。

——状态刷新报文就是为了保持全网的剪枝效果,使其一直为剪枝状态,剪枝定时器只在非叶子路由器上存在,这样,剪枝后,因为配置了状态刷新,所以就只能一直是剪枝状态,这时想要恢复转发,只能由叶子路由器主动发送嫁接Graft报文,来主动要求上游路由器在组播路由表项中的接口列表中添加相应接口,启动转发。配置了状态刷新,那么就需要叶子路由器主动发送嫁接报文来主动加入转发路径中;如果不设置状态刷新,那么就需要叶子路由器不断发送剪枝Prune报文,不停的对上游路由器进行剪枝

7、断言(Assert)

当一个网段内有多个相连的PIM路由器通过RPF检查后向该网段转发相同的组播报文时,则需要通过“断言机制”来保证只有一个PIM路由器向该网段转发组播报文,以保证组成员不接收多份相同的组报文。

“断言机制”是PIM路由器接收到邻居路由器发送的相同组播报文后,以组播的方式向本网段的所有PIM路由器发送Assert报文目的地址为224.0.0.13(代表所有PIM路由器)。其他PIM路由器在接收到Assert报文后,将自身参数与对方报文中携带的参数做比较,进行Assert竞选。竞选规则如下:

(1)单播路由协议优先级较高者获胜

(2)如果优先级相同,则到组播源的路径开销较小者获胜

(3)如果以上都相同,则下游接口IP地址最大者获胜

根据Assert竞选结果,路由器将执行不同的操作:

(1)获胜一方的下游接口称为AssertWinner,将负责后续对该网段组播报文的转发。

(2)失败一方的下游接口称为AssertLoser,后续不会对该网段转发组播报文,PIM路由器也会将其从(S,G)表项下游接口列表中删除

Assert竞选结束后,该网段上只存在一个下游接口,只传输一份组播报文。所有Asser Loser可以周期性地恢复组播报文转发,从而引发周期性的Assert竞选。

如上图,RouterB和RouterC均通过了RPF检查,创建了(S,G)表项,并且两者的下游接口连接在同一网段,RouterB和RouterC都向该网段发送组播报文。具体断言过程如下:

(1)RouterB和RouterC从各自上游接口接收到RouterA发来的组播报文,RPF检查都失败,报文被丢弃。这时,RouterB和RouterC就会分别向该网段发送Assert报文。——这里是不太明白的,为什么RPF检查会都失败?其(S,G)表项的创建是因为RPF成功才能创建,这里又说失败,很矛盾

(2)RouterB在收到RouterC发来的Assert报文后,将自身的路由信息与Assert报文中携带的路由信息进行比较,由于RouterB自身到组播源的开销较小而获胜。于是后续组播报文仍然向该网段转发,RouterC在接收到组播报文后仍然由于RPF检查失败而丢弃。

(3)同样,RouterC在收到RouterB发来的Assert报文,也将自身的路由信息与报文中携带的路由信息进行比较,由于RouterC自身到组播源的开销较大而落败。于是禁止相应下游接口向该网段转发组播报文,将其从(S,G)表项的下游接口列表中删除。

● PIM(Protocol Independent Multicast)称为协议无关组播,表示为IP组播提供路由信息的可以是静态路由、 RIP、 OSPF、 IS-IS、 BGP等任何一种单播路由协议。组播路由和单播路由协议无关,只要通过单播路由协议能够产生相应组播路由表项即可。

● PIM-DM(Protocol Independent Multicast Dense Mode)称为协议独立组播-密集模式,属于密集模式的组播路由协议,适用于小型网络。在这种网络环境下,组播组的成员相对比较密集。

● PIM-DM假设网络中的每个子网都存在至少一个对组播源感兴趣的接收站点,因此组播数据包被扩散到网络中的所有点,与此伴随着相关资源(带宽和路由器的CPU等)的消耗。

● 为了减少这些宝贵网络资源的消耗,密集模式组播路由协议对没有组播数据转发的分支进行Prune剪枝操作,只保留包含接收者的分支。

● 剪掉的有组播数据转发需求的分支也可以重新接收组播数据流。 PIM-DM使用Graft嫁接机制主动恢复组播报文的转发。

● 周期性的扩散和剪枝现象是密集模式协议的特征,只能适合规模较小的局域网

● DM模式下数据包的转发路径是一颗“有源树”。

● “有源树”以“组播源”为根、组播组成员为枝叶的一棵树。有源树使用的是从组播源到接收者的最短路径,因此也称为最短路径树SPT(Shortest Path Tree) 。如图中箭头所示的从Source到接收者的路径。

● PIM-DM不依赖于特定的单播路由协议,而是使用现存的单播路由表进行RPF检查。

● 数据包的转发中会出现上游和下游两个概念。路由器收到组播数据的接口称为上游。转发组播数据的接口称为下游数据包的转发是从上游至下游方向的转发。

● PIM协议报文中的协议号都是103。——这里说的是IP报头中的protocol字段的值。PIM协议数据报文是封装在IP报文中的,IP报文中以protocol字段值为103来标识其封装的是协议无关组播协议数据

● 本页列出的几种报文类型是于PIM-DM协议相关的。

● PIM-DM协议的报文类型有: Hello报文、加入/剪枝消息、 Assert报文(Assert消息使用组播方式发送,目的地是224.0.0.13的所有PIM路由器)、嫁接消息、嫁接回应消息。这几类报文主要用于周期的建立、维护SPT树。

● 在PIM-DM网络中, 刚启动的组播路由器需要使用Hello消息来发现邻居, 并维护邻居关系。 通过各路由器之间周期性地使用Hello消息保持联系, 从而构建和维护了SPT树。

● pim timer hello interval, 在接口视图下配置发送Hello消息的时间间隔。 Hello消息默认周期是30秒。

● 除了维护邻居关系外, Hello消息还具有一个重要的功能就是在多路由器网段中选举DR指定路由器。 DR充当IGMPv1查询器。 在IGMP概述中已经提到过IGMPv1中查询器的选举由组播路由协议决定。

● 在PIM-DM中通过比较Hello消息上携带的优先级和IP地址, 各路由器为多路由器网段选举指定路由器DR, 充当IGMPv1的查询器。

● 当DR出现故障时, 接收Hello消息将会超时, 邻居路由器之间会触发新的DR选举过程。

pim hello-option holdtime interval 在接口视图下配置Hello消息超时时间值。默认情况超时时间值为105秒。

● PIM-DM假设网络上的所有主机都准备接收组播数据,当某组播源S开始向组播组G发送数据时,具过程如下:

● 路由器接收到组播报文后,首先根据单播路由表进行RPF检查。

 ☆ 如果检查通过则创建一个(S, G)表项,然后将数据向网络上所有下游PIM-DM节点转发,这个过程称为扩散(Flooding

 ☆ 如果没有通过RPF(Reverse Path Forwarding)检查,即组播报文从错误的接口输入,则将报文丢弃。

● 经过这个过程, PIM-DM组播域内每个路由器上都会创建(S, G)表项

● 无论下游有没有组播成员,组播报文都会被扩散出去,因此会导致宽带资源的浪费。为避免宽带的浪费PIM-DM使用剪枝机制。

● 当下游节点没有组播组成员,则路由器向上游节点发Prune剪枝消息,通知上游节点不用再转发数据到该分支。上游节点收到Prune剪枝消息后,就将相应的接口从其组播转发表项(S G)对应的输出接口列表中删除。剪枝过程继续直到PIM-DM中仅剩下了必要的分支,这就建立了一个以组播源S为根的SPT(一种组播转发树,被称为:源路径树或最短路径树)。

● 各个被剪枝的节点同时提供超时机制,当剪枝超时时重新开始扩散—剪枝过程。剪枝状态超时器的默认值为210秒。

● PIM-DM的扩散—剪枝机制周期性进行

● 组播路由器根据剪树消息剪去多余的分枝,形成一棵新的SPT树。虽然剪枝消息让路由器再不再向没有组播成员的分枝转发组播报文。但是每个路由器上的(SG)表项仍然存的,其目的是为了一旦有组播成员加入时可以快速加入并转发组播报文

● 被剪枝的下游节点可以在剪枝超时器超时会恢复到转发状态,但是剪枝超时器要等待210秒。如果在这期间有组播成员相加入时必须等待,这个时间是比较长的。为了减少反应的时间,当被剪枝的下游节点需要恢复到转发状态时,该节点可以使用Graft嫁接消息主动通知上游节点。

● 如上所示:网络中一个接收者恢复接收组播数据, Graft嫁接消息逐跳向组播源S传递,中间节点接收到Graft嫁接消息后回应确认,从而先前被剪掉的分支恢复信息传输。

● 剪枝路径重新恢复为转为路径,生成一颗新的SPT树。

● PIM-DM采用RPF检查机制, 利用现存的单播路由表、 组播静态路由表、 MBGP路由表来构建一棵从数据源S始发的组播转发树。

● 当一个组播包到达时,路由器首先判断到达路径的正确性。如果到达接口是单播路由指示的通往组播源S的接口, 就认为这个组播包是从正确路径而来;否则,将组播包作为冗余报文丢弃。

● 作为路径判断依据之一的单播路由信息可以来源于任何一种单播路由协议,如RIP、 OSPF发现的路由信息, 不依赖于特定的单播路由协议。

● 在共享网络(如Ethernet)中会出现相同报文的重复发送。如上图所示: LAN网段上包含多台组播路由器A、 B、 C和D,各自都有到组播源S的接收途径。当路由器A、 B和C都从上游接收到组播源发出的组播数据报文后,都会向Ethernet网络上转发该组播报文,这时下游节点组播路由器D就会收到三份完全相同的组播报文。

● 为了避免这种情况,就需要通过Assert机制来选定一个唯一的转发者。网络中的各路由器通过发送Assert报文选出一条最优的路径。

● 选举机制如下:如果两条或两条以上路径的优先级和到组播源的开销相同,则IP地址最大的路由器获胜成为该(S, G)项的上游邻居,由它负责该(S, G)组播报文的转发,而其他落选路由器则剪掉对应的接口以禁止转发信息。

——这里不明白的是断言机制启动的触发机制,从上图看,路由器在向下游转发组播报文的同时,监控接口是否接收了同样的组播报文,或者说只要路由器发现本路由器发送了(S,G)组播报文,而转发接口又收到了(S,G)组播报文,就发起断言。上图中RouterD因为只是接收了相同的三份组播报文,而本身(这个端口)没有发送(转发)组播报文,所以不参与断言

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
因pdf的容量过大分4个压缩包打包,还有一个源码另外下载。 《.NET深入体验与实战精要》作者身为从事.NET一线开发的资深开发专家,常年耕耘技术博客,惠及无数.NET新知。此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习路线。本书既考虑到实际开发中经常遇到的困惑和难题,也分析了解决问题的思路和方法,更总结出项目开发中不可或缺的技术点及思想。读者可以在欣赏一个个有趣例子的过程中,不知不觉具备开发真正商业项目的能力。 本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例代码及独家披露的商业系统,供读者参考学习。 本书适合于.NET初、中级开发人员参考学习,特别有助于.NET从业者进入实战层次,也可作为相关培训机构的参考教材,还可以作为高等院校相关专业师生的参考书。 目录 第1篇 技术基础总结 第1章 .NET,你真的知道了吗 3 1.1 搞清自己是干什么的 4 1.2 .NET的几个特性 7 1.3 万丈高楼平地起:面试者必会 9 1.3.1 C#介绍 10 1.3.2 命名空间 10 1.3.3 C#语法格式要点 10 1.3.4 变量 12 1.3.5 类型推断 12 1.3.6 变量的作用域 13 1.3.7 常量 16 1.3.8 流程控制 16 1.3.9 字符串常见操作 21 1.3.10 几个常用的数学函数 27 1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 事件——“年终分红” 42 1.4.4 反射——“解剖” 49 1.5 .NET开发几把小刀 52 1.5.1 using之多变身 52 1.5.2 @符号的妙用 54 1.5.3 预处理指令,有你更轻松 55 1.6 Visual Studio.NET 2008 实战 58 1.6.1 如何创建ASP.NET项目 58 1.6.2 如何创建Windows项目 61 1.6.3 Visual Studio.NET 2008 操作与使用技巧 61 1.6.4 常见开发调试技巧 66 1.6.5 错误异常处理方法 70 本章常见技术面试题 76 常见面试技巧之面试前的准备 76 本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运算符==的区别 80 2.2 const和readonly的区别 82 2.3 private、protected、public和internal的区别 86 2.4 sealed、new、virtual、abstract与override 87 2.5 abstract class与interface 91 2.6 公共变量与属性的区别 93 2.7 参数修饰符params、out和ref的区别 96 2.8 值类型和引用类型的区别 100 2.9 结构与类的区别 103 2.10 Dispose()和Close()、Finalize()的 区别 106 2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和Release版本的 区别 108 本章常见技术面试题 111 常见面试技巧之细节决定成败 111 本章小结 112 第3章 ASP.NET开发大杂烩 113 3.1 页面生命周期 114 3.1.1 独立页面生命周期事件顺序 114 3.1.2 具有Master页的生命周期事件顺序 116 3.1.3 ASP.NET生命周期详解 118 3.2 页面状态管理 120 3.2.1 Cookie 121 3.2.2 HtmlInputHidden隐藏域 123 3.2.3 ViewState 123 3.2.4 查询字符串Request 124 3.2.5 Aplication对象 125 3.2.6 Session对象 125 3.2.7 示例项目:在线用户列表统计 128 3.3 服务器和客户端数据交互 131 3.3.1 页面数据绑定全攻略 131 3.3.2 Bind和Eval的区别 140 3.4 ASP.NET编程中的技巧 142 3.4.1 页面之间传值的7种方法 142 3.4.2 get与post方法的区别 146 3.4.3 ASP.NET服务器控件和 HTML控件的区别 146 3.4.4 Server.Transfer和Response.Redirect的区别 148 3.4.5 刷新页面的方法汇总 149 3.4.6 页面事件控制 150 3.4.7 在URL中传递中文的解决方案 152 3.4.8 增强用户体验的一些技巧 153 3.4.9 XHTML与HTML的区别 156 3.5 打造自己的页面基类PageBase 161 本章常见技术面试题 164 常见面试技巧之如何做好自我介绍 164 本章小结 165 第4章 Windows窗体编程你也行 167 4.1 创建简单的WinForm项目 168 4.2 创建MDI窗体应用 170 4.3 获取应用程序路径信息 174 4.4 回车跳转控件焦点 175 4.5 窗体间传递复杂数据 176 4.5.1 构造传递 176 4.5.2 公有字段传递 177 4.5.3 委托与事件传递 179 4.6 实现个性化窗体界面 181 4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的区别 190 4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何设置运行时窗体的起始位置 194 4.12.2 如何使一个窗体在屏幕的最顶端 194 4.12.3 实现窗体渐显效果 194 4.12.4 设置窗口背景为渐变色 195 4.12.5 模态窗口和非模态窗口 196 4.12.6 屏蔽窗口右上角的关闭 操作 196 4.12.7 调用执行外部的程序 197 本章常见技术面试题 197 常见面试技巧之经典问题巧回答 198 本章小结 198 第5章 数据库开发 199 5.1 ADO.NET与抽水的故事 200 5.1.1 ADO.NET的定义 200 5.1.2 趣味理解ADO.NET对象模型 202 5.1.3 进水笼头——建立Connection 204 5.1.4 抽水机——Command 206 5.1.5 输水管——DataAdapter 209 5.1.6 输水管——DataReader 210 5.1.7 随用随关,释放资源 212 5.1.8 水库管理——DataSet 212 5.1.9 水池子——DataTable 214 5.2 数据库操作类的封装详解 217 5.2.1 执行命令方法的封装 217 5.2.2 查询数据方法的封装 220 5.2.3 数据统计方法的封装 221 5.2.4 实现SqlParameter方式 222 5.2.5 实现多数据库的访问 223 5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 5.4.4 企业级服务COM+事务 231 5.4.5 System.Transactions 事务处理 236 5.5 Oracle开发常见问题 240 5.5.1 Oracle和SQL Server的常用函数对比 240 5.5.2 Oracle和SQL Server的语句区别 244 5.5.3 ASP.NET连接Oracle失败的解决方法 245 本章常见技术面试题 246 常见面试技巧之经典问题巧回答 246 本章小结 247 第6章 关于XML 249 6.1 XML概述 250 6.1.1 XML和HTML有什么区别 250 6.1.2 XML的优势 250 6.2 文档结构与基本语法 251 6.3 XML操作 253 6.3.1 XmlDocument创建XML文档 253 6.3.2 XmlTextWriter创建XML文档 254 6.3.3 XmlDocument读取XML文档 256 6.3.4 XmlTextReader读取XML文档 257 6.3.5 在HTML中显示XML中的数据 258 6.3.6 JavaScript获取XML内容 259 6.3.7 项目案例:通用自定义XML配置类 263 6.4 ADO.NET与XML 266 6.4.1 读XML文档到DataSet 266 6.4.2 DataSet转为XML文档 267 6.5 项目案例1:实现网站的RSS应用 267 6.6 项目案例2:在线实现RSS阅读器 270 本章常见技术面试题 275 常见面试技巧之经典问题巧回答 275 本章小结 276 第7章 Web Service开发详解 277 7.1 Web Service基本概念 278 7.2 Web Service的应用场景 278 7.3 创建简单的Web Service项目应用 280 7.4 Web Service属性介绍 282 7.5 ASP.NET如何调用Web Service 286 7.6 JavaScript如何调用Web Service 288 7.6.1 通过webbehavior.htc调用Web Service 288 7.6.2 通过Microsoft.XMLDOM调用Web Service 291 7.6.3 XMLHTTP POST调用Web Service 293 7.6.4 SOAP调用Web Service 293 7.7 WinForm如何调用Web Service 295 7.7.1 .NET的WinForm调用Web Service 295 7.7.2 手动发送HTTP请求调用Web Service 295 7.8 实现异步调用Web Service 297 7.9 如何保证Web Service的安全 299 7.9.1 通过SoapHeader来增强 Web Service的安全性 299 7.9.2 采用SSL实现加密传输 302 7.9.3 访问IP限制 315 7.10 Web Service开发中需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1 Ajax概述 324 8.1.1 什么是Ajax 324 8.1.2 Ajax技术的核心 325 8.1.3 Ajax的工作原理 326 8.1.4 Ajax的优点 326 8.1.5 Ajax的问题 327 8.1.6 Ajax适用场景 327 8.1.7 Ajax不适用场景 329 8.1.8 XMLHttpRequest开发实例 329 8.2 微软VS.NET的Ajax开发 333 8.2.1 安装ASP.NET 2.0 Ajax Extensions 333 8.2.2 创建ASP.NET Ajax应用程序 333 8.2.3 ScriptManager控件使用技巧 335 8.2.4 UpdaetPanel控件使用技巧 336 8.2.5 AsyncPostBackTrigger实现 外部控件引发局部刷新 338 8.2.6 Ajax错误处理 341 8.2.7 告诉用户你正在做什么—— UpdateProgress控件 342 8.2.8 ASP.NET AjaxControToolKit简介 345 8.3 使用第三方组件 Ajax.dll 开发 347 8.4 使用第三方组件AjaxPro的开发 351 8.5 使用第三方组件MagicAjax的开发 351 8.6 Ajax开发原则 352 本章常见技术面试题 353 常见面试技巧之经典问题巧回答 353 本章小结 354 第9章 系统与文件操作 355 9.1 获取系统信息 356 9.1.1 用SystemInformation类获取系统信息 356 9.1.2 用Environment 类获取系统信息 357 9.1.3 通过WMI获取系统信息 358 9.1.4 用RegistryKey 类读取系统信息 361 9.1.5 用API函数获取系统信息 363 9.1.6 获取系统服务信息 365 9.2 文件操作 368 9.2.1 StreamWriter类实现写文件 368 9.2.2 通过File类创建文件 369 9.2.3 通过FileStream类创建文件 370 9.2.4 通过FileInfo类创建文件 370 9.2.5 追加文本 370 9.2.6 读取文本文件 371 9.2.7 读写二进制文件 372 9.2.8 文件复制、移动、删除 374 9.3 文件夹目录操作 375 9.4 读写INI文件 376 9.5 读写注册表 379 本章常见技术面试题 381 常见面试技巧之经典问题巧回答 381 本章小结 382 第10章 网络应用开发 383 10.1 Socket基本编程 384 10.1.1 Socket基本知识 384 10.1.2 Socket服务端开发步骤 386 10.1.3 Socket客户端开发步骤 388 10.2 异步Socket通信——实现MSN机器人 390 10.2.1 机器人服务端 390 10.2.2 客户端实现步骤 395 10.3 基于TCP协议的客户端和服务端 398 10.3.1 TcpListener 实现网络服务端 398 10.3.2 TcpClient实现网络客户端 399 本章常见技术面试题 401 常见面试技巧之经典问题巧回答 401 本章小结 402 第11章 Windows Service开发 403 11.1 什么是Windows服务 404 11.2 创建Windows服务 404 11.3 Windows服务开发常见问题 408 11.4 安装/卸载Windows服务 409 11.4.1 安装Windows服务 409 11.4.2 卸载Windows服务 410 11.4.3 Windows服务应用程序体系结构 411 11.5 调试Windows服务 414 11.5.1 日志调试法 414 11.5.2 附加进程断点调试法 414 本章常见技术面试题 416 职场智慧之初入江湖 416 本章小结 418 第12章 新技术初探 419 12.1 WPF 421 12.1.1 WPF简介 421 12.1.2 WPF何以令人佩服 422 12.1.3 XAML概述 422 12.1.4 WPF开发环境配置 423 12.1.5 项目示例:开发一个简单的WPF应用程序 424 12.2 WCF 427 12.2.1 SOA是什么 427 12.2.2 WCF是什么 428 12.2.3 WCF的优势是什么 428 12.2.4 WCF开发环境 431 12.2.5 项目示例:订票服务WCF开发步骤 431 12.3 LINQ 440 12.3.1 LINQ的架构 441 12.3.2 传统的查询 441 12.3.3 LINQ查询实例 444 12.3.4 LINQ查询语法 448 本章常见技术面试题 449 职场智慧之学习方法 449 本章小结 450 第2篇 系统架构设计思想 第13章 面向对象思想 453 13.1 为什么要面向对象 454 13.2 什么是面向对象 456 13.3 面向对象的特点 458 13.3.1 封装 459 13.3.2 继承 459 13.3.3 多态 460 13.4 面向对象设计和开发实例 466 13.4.1 传统过程化设计实现放器功能 466 13.4.2 基于面向对象设计实现放器功能 467 13.4.3 面向对象封装、继承、多态的应用 468 13.4.4 设计模式、条件外置及反射技术的应用 471 13.5 面向对象分析(OOA)的方法 475 13.6 面向对象设计的原则 478 13.6.1 优先使用(对象)组合,而非(类)继承 478 13.6.2 针对接口编程,而非(接口的)实现 481 13.6.3 开放-封闭法则(OCP) 482 13.6.4 Liskov替换法则(LSP) 485 13.6.5 单一职责原则(SRP) 486 13.6.6 依赖倒置原则(DIP) 486 13.6.7 接口分离原则(ISP) 489 13.6.8 面向对象设计时需要注意的 问题 490 本章常见技术面试题 491 本章小结 491 第14章 三层架构项目开发 493 14.1 什么是三层架构 494 14.1.1 常用的三层架构设计 494 14.1.2 趣味理解:三层架构与养猪 496 14.2 为什么要用三层架构 497 14.3 三层架构项目开发示例 500 14.3.1 数据库设计 500 14.3.2 创建整体解决方案 501 14.3.3 业务实体Model的实现 502 14.3.4 数据访问层的实现 504 14.3.5 业务逻辑层的实现 509 14.3.6 表示层的实现 510 14.4 实现基于工厂模式的三层架构 512 14.4.1 扩展新增数据访问层 512 14.4.2 IDAL抽象接口的实现 513 14.4.3 创建DAL对象的封装 517 14.4.4 实现抽象工厂模式 519 14.4.5 工厂模式的三层架构图 521 本章常见技术面试题 522 职场智慧之程序员的职业规划 523 本章小结 524 第15章 大型网站的性能优化与安全 525 15.1 高效C#编码优化 526 15.2 页面(HTML)优化的方法 534 15.3 ASP.NET开发性能优化 540 15.3.1 如没必要,尽量使用静态HTML页面 540 15.3.2 避免不必要的回送操作 541 15.3.3 尽量在客户端进行用户输入验证 541 15.3.4 关闭不必要的Session状态 542 15.3.5 优先使用HTML控件,而非服务器控件 542 15.3.6 不必要时关闭ViewState 542 15.3.7 禁用调试模式 543 15.4 系统缓存管理 543 15.4.1 缓存的分类 544 15.4.2 传统缓存方式 545 15.4.3 页面输出缓存 545 15.4.4 页面输出缓存API 548 15.4.5 页面局部缓存 549 15.4.6 应用程序数据缓存 554 15.4.7 文件缓存依赖 555 15.4.8 数据库缓存依赖 557 15.4.9 Memcached——分布式缓存系统 560 15.4.10 Cacheman——.NET架构 下的分布式缓存项目 561 15.5 数据库访问性能优化 562 15.5.1 选择合适的.NET数据供应器 563 15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪监视SQL Server当前链接池状态 564 15.5.4 善用数据库的存储过程 567 15.5.5 SqlDataRead和Dataset的选择 567 15.5.6 ExecuteNonQuery和 ExecuteScalar的选择 568 15.5.7 数据的绑定DataBinder 568 15.5.8 使用DataReader的注意事项 568 15.5.9 Command对象的使用 569 15.5.10 反复地执行SQL语句用 Prepare() 569 15.5.11 分页的数据访问 570 15.5.12 SQL命令的优化 570 15.5.13 tempdb的使用技巧 572 15.5.14 使用视图代替跨库操作 572 15.5.15 尽量避免大事务操作 572 15.5.16 尽量避免使用游标 573 15.5.17 为你的表建立适当的索引 573 15.6 网站安全防护 573 15.6.1 什么是SQL注入式攻击 573 15.6.2 如何防范SQL注入式攻击 574 15.6.3 实现页面验证码 575 15.6.4 实现文件防盗链 579 15.6.5 采用HTTPS进行访问 584 15.7 IIS优化 584 15.7.1 如何监测IIS服务器并发数 584 15.7.2 采用Gzip压缩页面优化 585 15.7.3 网站应用程序池配置 588 15.8 网站架构优化策略 593 本章常见技术面试题 596 职场智慧之独善其身 596 本章小结 599 第16章 系统设计的原则和技巧 601 16.1 系统设计的一些原则 602 16.1.1 最适合的才是最好的 602 16.1.2 以不变应万变 603 16.1.3 可扩展性 603 16.1.4 可复用性 604 16.2 系统设计的常用方法 604 16.3 敏捷软件开发12条原则 608 16.4 系统架构师成长之路 611 本章常见技术面试题 615 职场智慧之职场政治 615 本章小结 616 第3篇 项目实战解析 第17章 权限角色管理项目解析 619 17.1 权限角色管理概述 620 17.2 项目概述 623 17.3 数据库设计 624 17.3.1 数据库实体关系模型 624 17.3.2 表结构设计 625 17.4 数据访问层 627 17.4.1 类设计 627 17.4.2 代码实现 629 17.5 业务逻辑层 629 17.5.1 类设计 630 17.5.2 扩展.NET Framework用户处理机制 632 17.6 接口调用与Web管理实现 638 17.6.1 Web.config配置 638 17.6.2 用户身份和权限验证 638 17.6.3 用户验证接口方式:权限验证用户控件 640 17.6.4 用户验证接口方式:页面基类 642 17.6.5 用户和角色权限的后台管理 644 职场智慧之如何提升自己在公司的价值 652 本章小结 653 第18章 单点登录系统的设计与实现 655 18.1 项目概述 656 18.1.1 名词定义 656 18.1.2 项目需求描述 656 18.2 业务流程设计 657 18.2.1 用户认证流程 657 18.2.2 安全验证流程 658 18.3 功能与接口设计 659 18.3.1 接口交互设计 659 18.3.2 应用系统接口 660 18.3.3 认证服务器功能和接口 660 18.4 数据库设计 660 18.4.1 数据库实体关系模型 661 18.4.2 表结构设计 661 18.5 实现认证服务器 662 18.5.1 SSO解决方案 663 18.5.2 系统管理后台 664 18.5.3 用户通行证管理中心 665 18.5.4 认证服务器接口开发 673 18.6 应用系统接入接口开发 675 18.6.1 用户身份认证 675 18.6.2 接收状态同步 676 18.6.3 用户注销 678 18.6.4 更新认证服务器状态 679 18.7 接口封装及调用 679职场智慧之晋升之道 682 本章小结 684 第19章 常用.NET开发工具介绍 685 19.1 源码版本管理: Visual SourceSafe 2005 686 19.1.1 安装和配置VSS 2005服务端 686 19.1.2 安装和配置VSS客户端 691 19.1.3 将项目加入VSS版本控制 692 19.1.4 客户端连接VSS 服务器获取源代码 694 19.1.5 设置VSS支持通过 Internet访问 696 19.1.6 版本控制的几个概念 701 19.1.7 VSS项目权限管理 703 19.1.8 VSS数据备份 705 19.1.9 VSS 2005的使用规范 707 19.2 单元测试工具:NUnit 708 19.2.1 NUnit简介 708 19.2.2 手把手教你在.NET中应用NUnit 708 19.3 日志工具——Log4net 714 19.3.1 Log4net简介 714 19.3.2 使用步骤 717 19.3.3 单独配置文件的使用 719 19.4 代码规范检查工具: Microsoft Source Analysis for C# 721 19.5 生成文档注释工具:GhostDoc 723 19.6 反编译工具:Reflector for .NET 732 19.7 动软.NET代码生成器 733 19.8 帮助文档生成工具:Sandcastle 737 19.8.1 Sandcastle介绍 737 19.8.2 生成方式 738 19.8.3 具体生成步骤 740 本章小结 748 附录A 软件编码规范 A.1 概述 750 A.1.1 规范基本原则 750 A.1.2 术语定义 750 A.1.3 文件命名组织 750 A.2 代码外观 751 A.2.1 列宽 751 A.2.2 换行 751 A.2.3 缩进 751 A.2.4 空行 751 A.2.5 空格 752 A.2.6 括号——() 753 A.2.7 花括号——{} 753 A.3 程序注释 754 A.3.1 注释概述 754 A.3.2 文档型注释 755 A.3.3 类注释 755 A.3.4 单行注释 755 A.3.5 注释标签 756 A.4 声明 758 A.4.1 每行声明数 758 A.4.2 初始化 758 A.4.3 位置 758 A.4.4 类和接口的声明 759 A.4.5 字段的声明 759 A.5 命名规范 759 A.5.1 命名概述 759 A.5.2 大写规则 760 A.5.3 缩写 761 A.5.4 命名空间 761 A.5.5 类 762 A.5.6 接口 762 A.5.7 属性(Attribute) 763 A.5.8 枚举(Enum) 763 A.5.9 参数 763 A.5.10 方法 764 A.5.11 属性(property) 764 A.5.12 事件 765 A.5.13 常量(const) 766 A.5.14 字段 767 A.5.15 静态字段 768 A.5.16 集合 768 A.5.17 措词 768 A.6 语句 769 A.6.1 每行一个语句 769 A.6.2 复合语句 769 A.6.3 return语句 769 A.6.4 if、if-else、if else-if语句 770 A.6.5 for、foreach 语句 770 A.6.6 while语句 771 A.6.7 do-while语句 771 A.6.8 switch-case语句 771 A.6.9 try-catch语句 772 A.6.10 using块语句 772 A.6.11 goto语句 772 A.7 其他 773 A.7.1 表达式 773 A.7.2 类型转换 773 A.8 匈牙利命名法 773 A.9 控件命名规则 774 A.9.1 一般命名方法 774 A.9.2 主要控件名简写对照表 774 &hellip;&hellip;
因pdf的容量过大分4个压缩包打包,还有一个源码另外下载。 《.NET深入体验与实战精要》作者身为从事.NET一线开发的资深开发专家,常年耕耘技术博客,惠及无数.NET新知。此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习路线。本书既考虑到实际开发中经常遇到的困惑和难题,也分析了解决问题的思路和方法,更总结出项目开发中不可或缺的技术点及思想。读者可以在欣赏一个个有趣例子的过程中,不知不觉具备开发真正商业项目的能力。 本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例代码及独家披露的商业系统,供读者参考学习。 本书适合于.NET初、中级开发人员参考学习,特别有助于.NET从业者进入实战层次,也可作为相关培训机构的参考教材,还可以作为高等院校相关专业师生的参考书。 目录 第1篇 技术基础总结 第1章 .NET,你真的知道了吗 3 1.1 搞清自己是干什么的 4 1.2 .NET的几个特性 7 1.3 万丈高楼平地起:面试者必会 9 1.3.1 C#介绍 10 1.3.2 命名空间 10 1.3.3 C#语法格式要点 10 1.3.4 变量 12 1.3.5 类型推断 12 1.3.6 变量的作用域 13 1.3.7 常量 16 1.3.8 流程控制 16 1.3.9 字符串常见操作 21 1.3.10 几个常用的数学函数 27 1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 事件——“年终分红” 42 1.4.4 反射——“解剖” 49 1.5 .NET开发几把小刀 52 1.5.1 using之多变身 52 1.5.2 @符号的妙用 54 1.5.3 预处理指令,有你更轻松 55 1.6 Visual Studio.NET 2008 实战 58 1.6.1 如何创建ASP.NET项目 58 1.6.2 如何创建Windows项目 61 1.6.3 Visual Studio.NET 2008 操作与使用技巧 61 1.6.4 常见开发调试技巧 66 1.6.5 错误异常处理方法 70 本章常见技术面试题 76 常见面试技巧之面试前的准备 76 本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运算符==的区别 80 2.2 const和readonly的区别 82 2.3 private、protected、public和internal的区别 86 2.4 sealed、new、virtual、abstract与override 87 2.5 abstract class与interface 91 2.6 公共变量与属性的区别 93 2.7 参数修饰符params、out和ref的区别 96 2.8 值类型和引用类型的区别 100 2.9 结构与类的区别 103 2.10 Dispose()和Close()、Finalize()的 区别 106 2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和Release版本的 区别 108 本章常见技术面试题 111 常见面试技巧之细节决定成败 111 本章小结 112 第3章 ASP.NET开发大杂烩 113 3.1 页面生命周期 114 3.1.1 独立页面生命周期事件顺序 114 3.1.2 具有Master页的生命周期事件顺序 116 3.1.3 ASP.NET生命周期详解 118 3.2 页面状态管理 120 3.2.1 Cookie 121 3.2.2 HtmlInputHidden隐藏域 123 3.2.3 ViewState 123 3.2.4 查询字符串Request 124 3.2.5 Aplication对象 125 3.2.6 Session对象 125 3.2.7 示例项目:在线用户列表统计 128 3.3 服务器和客户端数据交互 131 3.3.1 页面数据绑定全攻略 131 3.3.2 Bind和Eval的区别 140 3.4 ASP.NET编程中的技巧 142 3.4.1 页面之间传值的7种方法 142 3.4.2 get与post方法的区别 146 3.4.3 ASP.NET服务器控件和 HTML控件的区别 146 3.4.4 Server.Transfer和Response.Redirect的区别 148 3.4.5 刷新页面的方法汇总 149 3.4.6 页面事件控制 150 3.4.7 在URL中传递中文的解决方案 152 3.4.8 增强用户体验的一些技巧 153 3.4.9 XHTML与HTML的区别 156 3.5 打造自己的页面基类PageBase 161 本章常见技术面试题 164 常见面试技巧之如何做好自我介绍 164 本章小结 165 第4章 Windows窗体编程你也行 167 4.1 创建简单的WinForm项目 168 4.2 创建MDI窗体应用 170 4.3 获取应用程序路径信息 174 4.4 回车跳转控件焦点 175 4.5 窗体间传递复杂数据 176 4.5.1 构造传递 176 4.5.2 公有字段传递 177 4.5.3 委托与事件传递 179 4.6 实现个性化窗体界面 181 4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的区别 190 4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何设置运行时窗体的起始位置 194 4.12.2 如何使一个窗体在屏幕的最顶端 194 4.12.3 实现窗体渐显效果 194 4.12.4 设置窗口背景为渐变色 195 4.12.5 模态窗口和非模态窗口 196 4.12.6 屏蔽窗口右上角的关闭 操作 196 4.12.7 调用执行外部的程序 197 本章常见技术面试题 197 常见面试技巧之经典问题巧回答 198 本章小结 198 第5章 数据库开发 199 5.1 ADO.NET与抽水的故事 200 5.1.1 ADO.NET的定义 200 5.1.2 趣味理解ADO.NET对象模型 202 5.1.3 进水笼头——建立Connection 204 5.1.4 抽水机——Command 206 5.1.5 输水管——DataAdapter 209 5.1.6 输水管——DataReader 210 5.1.7 随用随关,释放资源 212 5.1.8 水库管理——DataSet 212 5.1.9 水池子——DataTable 214 5.2 数据库操作类的封装详解 217 5.2.1 执行命令方法的封装 217 5.2.2 查询数据方法的封装 220 5.2.3 数据统计方法的封装 221 5.2.4 实现SqlParameter方式 222 5.2.5 实现多数据库的访问 223 5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 5.4.4 企业级服务COM+事务 231 5.4.5 System.Transactions 事务处理 236 5.5 Oracle开发常见问题 240 5.5.1 Oracle和SQL Server的常用函数对比 240 5.5.2 Oracle和SQL Server的语句区别 244 5.5.3 ASP.NET连接Oracle失败的解决方法 245 本章常见技术面试题 246 常见面试技巧之经典问题巧回答 246 本章小结 247 第6章 关于XML 249 6.1 XML概述 250 6.1.1 XML和HTML有什么区别 250 6.1.2 XML的优势 250 6.2 文档结构与基本语法 251 6.3 XML操作 253 6.3.1 XmlDocument创建XML文档 253 6.3.2 XmlTextWriter创建XML文档 254 6.3.3 XmlDocument读取XML文档 256 6.3.4 XmlTextReader读取XML文档 257 6.3.5 在HTML中显示XML中的数据 258 6.3.6 JavaScript获取XML内容 259 6.3.7 项目案例:通用自定义XML配置类 263 6.4 ADO.NET与XML 266 6.4.1 读XML文档到DataSet 266 6.4.2 DataSet转为XML文档 267 6.5 项目案例1:实现网站的RSS应用 267 6.6 项目案例2:在线实现RSS阅读器 270 本章常见技术面试题 275 常见面试技巧之经典问题巧回答 275 本章小结 276 第7章 Web Service开发详解 277 7.1 Web Service基本概念 278 7.2 Web Service的应用场景 278 7.3 创建简单的Web Service项目应用 280 7.4 Web Service属性介绍 282 7.5 ASP.NET如何调用Web Service 286 7.6 JavaScript如何调用Web Service 288 7.6.1 通过webbehavior.htc调用Web Service 288 7.6.2 通过Microsoft.XMLDOM调用Web Service 291 7.6.3 XMLHTTP POST调用Web Service 293 7.6.4 SOAP调用Web Service 293 7.7 WinForm如何调用Web Service 295 7.7.1 .NET的WinForm调用Web Service 295 7.7.2 手动发送HTTP请求调用Web Service 295 7.8 实现异步调用Web Service 297 7.9 如何保证Web Service的安全 299 7.9.1 通过SoapHeader来增强 Web Service的安全性 299 7.9.2 采用SSL实现加密传输 302 7.9.3 访问IP限制 315 7.10 Web Service开发中需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1 Ajax概述 324 8.1.1 什么是Ajax 324 8.1.2 Ajax技术的核心 325 8.1.3 Ajax的工作原理 326 8.1.4 Ajax的优点 326 8.1.5 Ajax的问题 327 8.1.6 Ajax适用场景 327 8.1.7 Ajax不适用场景 329 8.1.8 XMLHttpRequest开发实例 329 8.2 微软VS.NET的Ajax开发 333 8.2.1 安装ASP.NET 2.0 Ajax Extensions 333 8.2.2 创建ASP.NET Ajax应用程序 333 8.2.3 ScriptManager控件使用技巧 335 8.2.4 UpdaetPanel控件使用技巧 336 8.2.5 AsyncPostBackTrigger实现 外部控件引发局部刷新 338 8.2.6 Ajax错误处理 341 8.2.7 告诉用户你正在做什么—— UpdateProgress控件 342 8.2.8 ASP.NET AjaxControToolKit简介 345 8.3 使用第三方组件 Ajax.dll 开发 347 8.4 使用第三方组件AjaxPro的开发 351 8.5 使用第三方组件MagicAjax的开发 351 8.6 Ajax开发原则 352 本章常见技术面试题 353 常见面试技巧之经典问题巧回答 353 本章小结 354 第9章 系统与文件操作 355 9.1 获取系统信息 356 9.1.1 用SystemInformation类获取系统信息 356 9.1.2 用Environment 类获取系统信息 357 9.1.3 通过WMI获取系统信息 358 9.1.4 用RegistryKey 类读取系统信息 361 9.1.5 用API函数获取系统信息 363 9.1.6 获取系统服务信息 365 9.2 文件操作 368 9.2.1 StreamWriter类实现写文件 368 9.2.2 通过File类创建文件 369 9.2.3 通过FileStream类创建文件 370 9.2.4 通过FileInfo类创建文件 370 9.2.5 追加文本 370 9.2.6 读取文本文件 371 9.2.7 读写二进制文件 372 9.2.8 文件复制、移动、删除 374 9.3 文件夹目录操作 375 9.4 读写INI文件 376 9.5 读写注册表 379 本章常见技术面试题 381 常见面试技巧之经典问题巧回答 381 本章小结 382 第10章 网络应用开发 383 10.1 Socket基本编程 384 10.1.1 Socket基本知识 384 10.1.2 Socket服务端开发步骤 386 10.1.3 Socket客户端开发步骤 388 10.2 异步Socket通信——实现MSN机器人 390 10.2.1 机器人服务端 390 10.2.2 客户端实现步骤 395 10.3 基于TCP协议的客户端和服务端 398 10.3.1 TcpListener 实现网络服务端 398 10.3.2 TcpClient实现网络客户端 399 本章常见技术面试题 401 常见面试技巧之经典问题巧回答 401 本章小结 402 第11章 Windows Service开发 403 11.1 什么是Windows服务 404 11.2 创建Windows服务 404 11.3 Windows服务开发常见问题 408 11.4 安装/卸载Windows服务 409 11.4.1 安装Windows服务 409 11.4.2 卸载Windows服务 410 11.4.3 Windows服务应用程序体系结构 411 11.5 调试Windows服务 414 11.5.1 日志调试法 414 11.5.2 附加进程断点调试法 414 本章常见技术面试题 416 职场智慧之初入江湖 416 本章小结 418 第12章 新技术初探 419 12.1 WPF 421 12.1.1 WPF简介 421 12.1.2 WPF何以令人佩服 422 12.1.3 XAML概述 422 12.1.4 WPF开发环境配置 423 12.1.5 项目示例:开发一个简单的WPF应用程序 424 12.2 WCF 427 12.2.1 SOA是什么 427 12.2.2 WCF是什么 428 12.2.3 WCF的优势是什么 428 12.2.4 WCF开发环境 431 12.2.5 项目示例:订票服务WCF开发步骤 431 12.3 LINQ 440 12.3.1 LINQ的架构 441 12.3.2 传统的查询 441 12.3.3 LINQ查询实例 444 12.3.4 LINQ查询语法 448 本章常见技术面试题 449 职场智慧之学习方法 449 本章小结 450 第2篇 系统架构设计思想 第13章 面向对象思想 453 13.1 为什么要面向对象 454 13.2 什么是面向对象 456 13.3 面向对象的特点 458 13.3.1 封装 459 13.3.2 继承 459 13.3.3 多态 460 13.4 面向对象设计和开发实例 466 13.4.1 传统过程化设计实现放器功能 466 13.4.2 基于面向对象设计实现放器功能 467 13.4.3 面向对象封装、继承、多态的应用 468 13.4.4 设计模式、条件外置及反射技术的应用 471 13.5 面向对象分析(OOA)的方法 475 13.6 面向对象设计的原则 478 13.6.1 优先使用(对象)组合,而非(类)继承 478 13.6.2 针对接口编程,而非(接口的)实现 481 13.6.3 开放-封闭法则(OCP) 482 13.6.4 Liskov替换法则(LSP) 485 13.6.5 单一职责原则(SRP) 486 13.6.6 依赖倒置原则(DIP) 486 13.6.7 接口分离原则(ISP) 489 13.6.8 面向对象设计时需要注意的 问题 490 本章常见技术面试题 491 本章小结 491 第14章 三层架构项目开发 493 14.1 什么是三层架构 494 14.1.1 常用的三层架构设计 494 14.1.2 趣味理解:三层架构与养猪 496 14.2 为什么要用三层架构 497 14.3 三层架构项目开发示例 500 14.3.1 数据库设计 500 14.3.2 创建整体解决方案 501 14.3.3 业务实体Model的实现 502 14.3.4 数据访问层的实现 504 14.3.5 业务逻辑层的实现 509 14.3.6 表示层的实现 510 14.4 实现基于工厂模式的三层架构 512 14.4.1 扩展新增数据访问层 512 14.4.2 IDAL抽象接口的实现 513 14.4.3 创建DAL对象的封装 517 14.4.4 实现抽象工厂模式 519 14.4.5 工厂模式的三层架构图 521 本章常见技术面试题 522 职场智慧之程序员的职业规划 523 本章小结 524 第15章 大型网站的性能优化与安全 525 15.1 高效C#编码优化 526 15.2 页面(HTML)优化的方法 534 15.3 ASP.NET开发性能优化 540 15.3.1 如没必要,尽量使用静态HTML页面 540 15.3.2 避免不必要的回送操作 541 15.3.3 尽量在客户端进行用户输入验证 541 15.3.4 关闭不必要的Session状态 542 15.3.5 优先使用HTML控件,而非服务器控件 542 15.3.6 不必要时关闭ViewState 542 15.3.7 禁用调试模式 543 15.4 系统缓存管理 543 15.4.1 缓存的分类 544 15.4.2 传统缓存方式 545 15.4.3 页面输出缓存 545 15.4.4 页面输出缓存API 548 15.4.5 页面局部缓存 549 15.4.6 应用程序数据缓存 554 15.4.7 文件缓存依赖 555 15.4.8 数据库缓存依赖 557 15.4.9 Memcached——分布式缓存系统 560 15.4.10 Cacheman——.NET架构 下的分布式缓存项目 561 15.5 数据库访问性能优化 562 15.5.1 选择合适的.NET数据供应器 563 15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪监视SQL Server当前链接池状态 564 15.5.4 善用数据库的存储过程 567 15.5.5 SqlDataRead和Dataset的选择 567 15.5.6 ExecuteNonQuery和 ExecuteScalar的选择 568 15.5.7 数据的绑定DataBinder 568 15.5.8 使用DataReader的注意事项 568 15.5.9 Command对象的使用 569 15.5.10 反复地执行SQL语句用 Prepare() 569 15.5.11 分页的数据访问 570 15.5.12 SQL命令的优化 570 15.5.13 tempdb的使用技巧 572 15.5.14 使用视图代替跨库操作 572 15.5.15 尽量避免大事务操作 572 15.5.16 尽量避免使用游标 573 15.5.17 为你的表建立适当的索引 573 15.6 网站安全防护 573 15.6.1 什么是SQL注入式攻击 573 15.6.2 如何防范SQL注入式攻击 574 15.6.3 实现页面验证码 575 15.6.4 实现文件防盗链 579 15.6.5 采用HTTPS进行访问 584 15.7 IIS优化 584 15.7.1 如何监测IIS服务器并发数 584 15.7.2 采用Gzip压缩页面优化 585 15.7.3 网站应用程序池配置 588 15.8 网站架构优化策略 593 本章常见技术面试题 596 职场智慧之独善其身 596 本章小结 599 第16章 系统设计的原则和技巧 601 16.1 系统设计的一些原则 602 16.1.1 最适合的才是最好的 602 16.1.2 以不变应万变 603 16.1.3 可扩展性 603 16.1.4 可复用性 604 16.2 系统设计的常用方法 604 16.3 敏捷软件开发12条原则 608 16.4 系统架构师成长之路 611 本章常见技术面试题 615 职场智慧之职场政治 615 本章小结 616 第3篇 项目实战解析 第17章 权限角色管理项目解析 619 17.1 权限角色管理概述 620 17.2 项目概述 623 17.3 数据库设计 624 17.3.1 数据库实体关系模型 624 17.3.2 表结构设计 625 17.4 数据访问层 627 17.4.1 类设计 627 17.4.2 代码实现 629 17.5 业务逻辑层 629 17.5.1 类设计 630 17.5.2 扩展.NET Framework用户处理机制 632 17.6 接口调用与Web管理实现 638 17.6.1 Web.config配置 638 17.6.2 用户身份和权限验证 638 17.6.3 用户验证接口方式:权限验证用户控件 640 17.6.4 用户验证接口方式:页面基类 642 17.6.5 用户和角色权限的后台管理 644 职场智慧之如何提升自己在公司的价值 652 本章小结 653 第18章 单点登录系统的设计与实现 655 18.1 项目概述 656 18.1.1 名词定义 656 18.1.2 项目需求描述 656 18.2 业务流程设计 657 18.2.1 用户认证流程 657 18.2.2 安全验证流程 658 18.3 功能与接口设计 659 18.3.1 接口交互设计 659 18.3.2 应用系统接口 660 18.3.3 认证服务器功能和接口 660 18.4 数据库设计 660 18.4.1 数据库实体关系模型 661 18.4.2 表结构设计 661 18.5 实现认证服务器 662 18.5.1 SSO解决方案 663 18.5.2 系统管理后台 664 18.5.3 用户通行证管理中心 665 18.5.4 认证服务器接口开发 673 18.6 应用系统接入接口开发 675 18.6.1 用户身份认证 675 18.6.2 接收状态同步 676 18.6.3 用户注销 678 18.6.4 更新认证服务器状态 679 18.7 接口封装及调用 679职场智慧之晋升之道 682 本章小结 684 第19章 常用.NET开发工具介绍 685 19.1 源码版本管理: Visual SourceSafe 2005 686 19.1.1 安装和配置VSS 2005服务端 686 19.1.2 安装和配置VSS客户端 691 19.1.3 将项目加入VSS版本控制 692 19.1.4 客户端连接VSS 服务器获取源代码 694 19.1.5 设置VSS支持通过 Internet访问 696 19.1.6 版本控制的几个概念 701 19.1.7 VSS项目权限管理 703 19.1.8 VSS数据备份 705 19.1.9 VSS 2005的使用规范 707 19.2 单元测试工具:NUnit 708 19.2.1 NUnit简介 708 19.2.2 手把手教你在.NET中应用NUnit 708 19.3 日志工具——Log4net 714 19.3.1 Log4net简介 714 19.3.2 使用步骤 717 19.3.3 单独配置文件的使用 719 19.4 代码规范检查工具: Microsoft Source Analysis for C# 721 19.5 生成文档注释工具:GhostDoc 723 19.6 反编译工具:Reflector for .NET 732 19.7 动软.NET代码生成器 733 19.8 帮助文档生成工具:Sandcastle 737 19.8.1 Sandcastle介绍 737 19.8.2 生成方式 738 19.8.3 具体生成步骤 740 本章小结 748 附录A 软件编码规范 A.1 概述 750 A.1.1 规范基本原则 750 A.1.2 术语定义 750 A.1.3 文件命名组织 750 A.2 代码外观 751 A.2.1 列宽 751 A.2.2 换行 751 A.2.3 缩进 751 A.2.4 空行 751 A.2.5 空格 752 A.2.6 括号——() 753 A.2.7 花括号——{} 753 A.3 程序注释 754 A.3.1 注释概述 754 A.3.2 文档型注释 755 A.3.3 类注释 755 A.3.4 单行注释 755 A.3.5 注释标签 756 A.4 声明 758 A.4.1 每行声明数 758 A.4.2 初始化 758 A.4.3 位置 758 A.4.4 类和接口的声明 759 A.4.5 字段的声明 759 A.5 命名规范 759 A.5.1 命名概述 759 A.5.2 大写规则 760 A.5.3 缩写 761 A.5.4 命名空间 761 A.5.5 类 762 A.5.6 接口 762 A.5.7 属性(Attribute) 763 A.5.8 枚举(Enum) 763 A.5.9 参数 763 A.5.10 方法 764 A.5.11 属性(property) 764 A.5.12 事件 765 A.5.13 常量(const) 766 A.5.14 字段 767 A.5.15 静态字段 768 A.5.16 集合 768 A.5.17 措词 768 A.6 语句 769 A.6.1 每行一个语句 769 A.6.2 复合语句 769 A.6.3 return语句 769 A.6.4 if、if-else、if else-if语句 770 A.6.5 for、foreach 语句 770 A.6.6 while语句 771 A.6.7 do-while语句 771 A.6.8 switch-case语句 771 A.6.9 try-catch语句 772 A.6.10 using块语句 772 A.6.11 goto语句 772 A.7 其他 773 A.7.1 表达式 773 A.7.2 类型转换 773 A.8 匈牙利命名法 773 A.9 控件命名规则 774 A.9.1 一般命名方法 774 A.9.2 主要控件名简写对照表 774 &hellip;&hellip;
第一章、为什么工程师要掌握FPGA开发知识? 5 第二章、FPGA基本知识与发展趋势 7 2.1 FPGA结构和工作原理 7 2.1.1 梦想成就伟业 7 2.1.2 FPGA结构 8 2.1.3 软核、硬核以及固核的概念 15 2.1.4 从可编程器件发展看FPGA未来趋势 15 第三章、FPGA主要供应商与产品 17 3.1.1 赛灵思主要产品介绍 17 第四章、FPGA开发基本流程 29 4.1 典型FPGA开发流程与注意事项 29 4.2 基于FPGA的SOC设计方法 32 基于FPGA的典型SOC开发流程为 32 第五章、FPGA实战开发技巧 33 5.1 FPGA器件选型常识 33 5.1.1器件的供货渠道和开发工具的支持 33 5.1.2 器件的硬件资源 33 5.1.3 电气接口标准 34 5.1.4 器件的速度等级 35 5.1.5 器件的温度等级 35 5.1.6 器件的封装 35 5.1.7 器件的价格 35 5.2 如何进行FPGA设计早期系统规划 36 5.3.综合和仿真技巧 37 5.3.1 综合工具XST的使用 37 5.3.2 基于ISE的仿真 42 5.3.3 和FPGA接口相关的设置以及时序分析 45 5.3.4 综合高手揭秘XST的11个技巧 51 5.4 大规模设计带来的综合和布线问题 52 5.5 FPGA相关电路设计知识 54 FPGA开发全攻略—工程师创新设计宝典 上册基础篇 5.5.1 配置电路 54 5.5.2 主串模式——最常用的FPGA配置模式 56 5.5.3 SPI串行Flash配置模式 58 5.5.4 从串配置模式 62 5.5.5 JTAG配置模式 63 5.5.6 System ACE配置方案 64 5.6 大规模设计的调试经验 68 5.6.1 ChipScope Pro组件应用实例 68 5.7 FPGA设计的IP和算法应用 74 5.7.1 IP核综述 74 5.7.2 FFT IP核应用示例 75 5.8 赛灵思 FPGA的专用HDL开发技巧 79 5.8.1 赛灵思 FPGA的体系结构特点 79 5.8.2 赛灵思 FPGA 芯片专用代码风格 79 ISE与EDK开发技巧之时序篇 83 5.10 新一代开发工具ISE Design Suit10.1介绍 85 5.10.1 ISE Design Suit10.1综述 85 5.10.2 ISE Design Suit 10.1的创新特性 85 5.11 ISE与第三方软件的配合使用技巧 92 5.11.1 Synplify Pro软件的使用 92 5.11.2 ModelSim软件的使用 99 5.11.3 Synplify Pro、ModelSim和ISE的联合开发流程 104 5.11.4 ISE与MATLAB的联合使用 105 5.12 征服FPGA低功耗设计的三个挑战 108 5.13 高手之路——FPGA设计开发中的进阶路线 111 附录一、FPGA开发资源总汇 112 附录二、编委信息与后记 113
IPv6组是在IPv6网络中一种多点通信方式,它能够将一条数据包同时发送给多个主机。IPv6组的通信原理如下: 1. IPv6组地址 在IPv6中,组地址是以“FF00::/8”开头的地址。其中,“FF”是固定的,它表示这是一个组地址,“00”是保留位,用于以后的扩展,后面的位则是组地址的标识符,可以用于区分不同的组组。 2. 组路由 IPv6组需要使用组路由来实现多点通信。组路由是一种特殊的路由,它可以将数据包从源主机转发给多个目的主机。组路由的工作原理是将数据包复制多份,然后分别发送到所有需要接收该数据包的主机上。 3. 组成员 组成员是指加入了组组的主机。当一个主机需要接收某个组组的数据包时,它需要向网络中的组路由发送一个加入组组的请求。组路由收到请求后,就会将该成员加入组组,并将后续的组数据包转发给该成员。 4. 组数据包 组数据包是指发送给组地址的数据包。当一个主机发送一个组数据包时,它会将该数据包发送到目标组地址。组路由会将该数据包复制多份,并分别发送到所有需要接收该数据包的主机上。 综上所述,IPv6组的通信原理是通过使用组地址、组路由和组成员来实现多点通信。组路由将组数据包复制多份,并分别发送到所有需要接收该数据包的主机上,从而实现了多点通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值