第一篇:中南大学计算机网络课程设计
通信原理课程设计报告
专业班级
电子信息11xx
姓名学号
xxx(090911xxxx)
指导教师
陈科文、张金焕
设计时间
2014年7月
电子信息工程系 信息科学与工程学院
目录
第一章 课程设计要求和目的...........................................1 1.1 设计要求....................................................1 1.2 设计目的....................................................1 第二章 滑动窗口协议仿真.............................................1 2.1 设计要求....................................................1 2.2 设计思想....................................................1 2.3 编程实现过程................................................9 2.3.1 开发环境.............................................9 2.3.2 程序界面设计.........................................9 2.3.3 关键模块分析.........................................11 2.3.4 结果演示与分析.......................................18
第一章 课程设计要求和目的
1.1设计要求
通过本课程教学,要求学生熟悉 TCP/IP 协议工作机制、熟悉基于 Socket 的网络通信程序的设计方法,熟练掌握至少一种编程语言及工具的使用。通过设计和调试有关程序,掌握一种网络协议或算法的编程实现方法或具体应用,同时设计一个相对独立的网络应用程序。
1.2 设计目的
通过将理论与实践相结合,使学生进一步深入理解通信网的工作原理,掌握网络应用开发技术,学会应用所学理论知识来分析和解决实际问题,培养网络技术研究与开发的基本能力以及创新精神。
第二章 滑动窗口协议仿真
2.1设计要求
(1)程序按照滑动窗口协议实现端对端的数据传送。包括协议的各种策略,如包丢失、停等应答、超时等都应有所仿真实现。
(2)显示数据传送过程中的各项具体数据;双方帧的个数变化,帧序号,发送和接受速度,暂停或重传提示等。
(3)增加其它附加创新功能。程序应有图形化界面,显示直观、易操作。
2.2设计思想
滑动窗口机制
(1).窗口机制
滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些
可以被发送的帧。下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):
图2-2-1
分析:①初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧;②发送方打开0号窗口,表示已发出0帧但尚确认返回信息。此时接收窗口状态不变;③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变;④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。此时发送窗口状态不变;⑤发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。此时接收窗口状态仍不变;⑥发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;⑦接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。此时发送窗口状态不变;⑧发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。此时接收窗口状态仍不变。
若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退n协议:发窗口>1,接收窗口>1;选择重传协议:发送窗口>1,接收窗口>1。(2).1比特滑动窗口协议
当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stop-and-wait)。该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧。由于接收
方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号。由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因而只用一比特来编号就够了。其发送方和接收方运行的流程图如图所示。
图2-2-
2(3).后退n协议
由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退n协议。后退n协议中,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧。如:当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。
图2-2-3
从这里不难看出,后退n协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传(仅因这些数据帧之前有一个数据帧出了错),这种做法又使传送效率降低。由此可见,若传输信道的传输质量很差因而误码率较大时,连续测协议不一定优于停止等待协议。此协议中的发送窗口的大小为k,接收窗口仍是1。(4).选择重传协议
在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪费。另一种效率更高的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发(SELECTICE REPEAT),其工作过程如图所示。显然,选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。滑动窗口协议
仍然考虑链路的延迟与带宽的乘积为8 K B,帧尺寸为1 K B的情形。让发送方在收到第一帧的A C K的同时准备发送第九帧。允许我们这样做的算法称为滑动窗口(sliding window),时间线如图2-2-3所示。1.滑动窗口算法
滑动窗口算法工作过程如下。首先,发送方为每1帧赋一个序号(sequence number),记作S e q N u m。现在,让我们忽略S e q N u m是由有限大小的头部字段实现的事实,而假设它能无限增大。发送方维护3个变量:发送窗口大
小(send window size),记作S W S,给出发送方能够发送但未确认的帧数的上界; L A R表示最近收到的确认帧(last acknowledgement re c e i v e d)的序号;L F S表示最近发送的帧(last frame sent)的序号,发送方还维持如下的不变式: LAR-LFR≤RWS
当一个确认到达时,发送方向右移动L A R,从而允许发送方发送另一帧。同时,发送方为所发的每个帧设置一个定时器,如果定时器在A C K到达之前超时,则重发此帧。注意:发送方必须存储最多S W S个帧,因为在它们得到确认之前必须准备重发。
接收方维护下面3个变量:接收窗口大小(receive window size),记为RW S,给出接收方所能接收的无序帧数目的上界; L A F表示可接收帧(l a rgestacceptable frame)的序号;L F R表示最近收到的帧(last frame re ce i v e d)的序号。接收方也维持如下不变式: LFS-LAR≤SWS
当一个具有顺序号S e q N u m的帧到达时,接收方采取如下行动:如果S e q N u m≤L F R或S e q N u m > L A F,那么帧不在接收窗口内,于是被丢弃;如果L F R<Se q N u m≤L A F,那么帧在接收窗口内,于是被接收。现在接收方需要决定是否发送一个A C K。设S e q N u m To A C K表示未被确认帧的最大序号,则序号小于或等于S e q N u m To Ac k的帧都已收到。即使已经收到更高序号的分组,接收方仍确认S e q N u m To A c k的接收。这种确认被称为是累积的(c u m u l a t i v e)。然后它设置L F R = S e q Nu m To A c k,并调整L A F = L F R + RW S。例如,假设L F R= 5(即,上次接收方发送的A C K是为了确认顺序号5的),并且RWS = 4。这意味着L A F = 9。如果帧7和8到达,则存储它们,因为它们在接收窗口内。然而并不需要发送A C K,因为帧6还没有到达。帧7和8被称为是错序到达的。(从技术上讲,接收方可以在帧7和8到达时重发帧5的A C K。)如果帧6当时到达了(或许它在第一次丢失后又重发从而晚到,或许它只是被延迟了),接收方确认帧8,L F R置为8,L A F置为1 2。如果实际上帧6丢失了,则出现发送方超时,重发帧6。我们看到,当发生超时时,传输数据量减少,这是因为发送方在帧6确认之前不能向前移动窗口。这意味着分组丢失时,此方案将不再保证管道满载。注意:分组丢失时间越长,这个问题越严重。注意,在这个例子中,接收方可以在帧7刚一到达时就为帧6发送一个认帧N A K(negative acknowledgment)。然而,由于发送方的超时机制足
以发现这种情况,发送N A K反而为发送方增加了复杂性,因此不必这样做。正如我们已提到的,当帧7和8到达时为帧5发送一个额外的A C K是合理的;在某些情况下,发送方可以使用重复的A C K作为一个帧丢失的线索。这两种方法都允许早期的分组丢失检测,有助于改进性能。关于这个方案的另一个变种是使用选择确认(selective acknowledgements)。即,接收方能够准确地确认那些已收到的帧,而不只是确认按顺序收到最高序号的帧。因此,在上例中,接收方能够确认帧7、8的接收。如果给发送方更多的信息,就能使其较容易地保持管道满载,但增加了实现的复杂性。
发送窗口大小是根据一段给定时间内链路上有多少待确认的帧来选择的;对于一个给定的延迟与带宽的乘积,S W S是容易计算的。另一方面,接收方可以将RW S设置为任何想要的值。通常的两种设置是:RW S= 1,表示接收方不存储任何错序到达的帧; RW S=S W S,表示接收方能够缓存发送方传输的任何帧。由于错序到达的帧的数目不可能超过S W S个,所以设置RWS >S W S没有意义。
2.有限顺序号和滑动窗口
现在我们再来讨论算法中做过的一个简化,即假设序号是可以无限增大的。当然,实际上是在一个有限的头部字段中说明一个帧的序号。例如,一个3比特字段意味着有8个可用序号0 ~ 7。因此序号必须可重用,或者说序号能回绕。这就带来了一个问题:要能够区别同一序号的不同次发送实例,这意味着可用序号的数目必须大于所允许的待确认帧的数目。例如,停止等待算法允许一次有1个待确认帧,并有2个不同的序号。假设序号空间中的序号数比待确认的帧数大1,即S W S ≤ M A a xS e q N u m-1,其中M a x Seq N u m 是可用序号数。这就够了吗?答案取决于RW S。如果RW S = 1,那么MaxSeqNum≥SWS+1是足够了。如果RW S等于S W S,那么有一个只比发送窗口尺寸大1的M a x S e q N u m是不够的。为看清这一点,考虑有8个序号0 ~ 7的情况,并且S W S = RW S = 7。假设发送方传输帧0 ~ 6,并且接收方成功接收,但A C K丢失。接收方现在希望接收帧7,0 ~ 5,但发送方超时,然后发送帧0 ~ 6。不幸的是,接收方期待的是第二次的帧0 ~ 5,得到的却是第一次的帧0 ~ 5。这正是我们想避免的情况。结果是,当RW S = S W S时,发送窗口的大小不能大于可用序号数的一半,或更准确地说,SWS<(Maxseqnum+1)/2直观地,这说明滑动窗口协议是在序号空间的两半之间变换,就像停止等待协议的序号是在0和1之间变换一样。唯一的区别是,它在序号空间的两半之间连续滑动而不是离散的变换。注意,这条规则是特别针对RW S = S W S的。我们把确定适用于RW S和S W S的
任意值的更一般的规则留做一个练习。还要注意,窗口的大小和序号空间之间的关系依赖于一个很明显以至于容易被忽略的假设,即帧在传输中不重新排序。这在直连的点到点链路上不能发生,因为在传输过程中一个帧不可能赶上另一个帧。
3.滑动窗口的实现
下面的例程说明我们如何实现滑动窗口算法的发送和接收的两个方面。该例程取自一个正在使用的协议,称为滑动窗口协议S W P(Sliding Window Pro t o c o l)。为了不涉及协议图中的邻近协议,我们用H L P(高层协议)表示S W P上层的协议,用L I N K(链路层协议)表示S W P下层的协议。我们先定义一对数据结构。首先,帧头部非常简单:它包含一个序号(S e q N u m)和一个确认号(A c k N u m)。它还包含一个标志(F l a g s)字段,表明帧是一个A C K帧还是携带数据的帧。
其次,滑动窗口算法的状态有如下结构。对于协议发送方,该状态包括如上所述的变量L A R和L F S,以及一个存放已发出但尚未确认的帧的队列(s e n d Q)。发送方状态还包含一个计数信号量(counting semaphore),称为s e n d Wi n d o w N o t F u l l。下面我们将会看到如何使用它,但一般来说,信号量是一个支持s e m Wa i t和s e m S i g n a l操作的同步原语。每次调用S e m S i g n al,信号量加1,每次调用S e m Wa i t,信号量减1。如果信号量减小,导致它的值小于0,那么调用进程阻塞(挂起)。一旦执行了足够的s e m S i g n a l操作而使信号量的值增大到大于0,在调用s e m Wa i t的过程中阻塞的进程就允许被恢复。对于协议的接收方,如前所述,该状态包含变量L F R,加上一个存放已收到的错序帧的队列(r e c v Q)。最后,虽然未显示,发送方和接收方的滑动窗口的大小分别由常量S W S和RW S表示。
S W P的发送方是由s e n d S W P过程实现的。这个例程很简单。首先,s e m Wa i t使这个进程在一个信号量上阻塞,直到它可以发另一帧。一旦允许继续,s e n d S W P设置帧头部中的顺序号,将此帧的拷贝存储在发送队列(s e n d Q)中,调度一个超时事件以便处理帧未被确认的情况,并将帧发给低层协议。
值得注意的一个细节是刚好在调用m s g A d d H dr之前调用s t o r e _ s w p _ h d r。该例程将存有S W P头部的C语言结构(s t a t e-> h d r)转化为能够安全放在消息前面的字节串(h b u f)。该例程(未给出)必须将头部中的每一个整数字段转化为网络字节顺序,并且去掉编译程序加入C语言结构中的
任意填充。7.1节将详细讨论字节顺序的问题,但现在,假设该例程将多字整数中最高有效位放在最高地址字节就足够了。这个例程的另一个复杂性是使用s e m Wa i t 和s e n dW i n d ow N o t F u l l 信号量。S e n dWi n d o w N o t F u l l被初始化为发送方滑动窗口的大小S W S(未给出这一初始化)。发送方每传输一帧,s e m Wa i t操作将这个数减1,如果减小到0,则阻塞发送方进程。每收到一个A C K,在d e l i v e r SW P中调用s e m S i g n a l操作(见下面)将此数加1,从而激活正在等待的发送方进程。
在继续介绍S W P的接收方之前,需要调整一个看上去不一致的地方。一方面,我们说过,高层协议通过调用s e n d操作来请求低层协议的服务,所以我们就希望通过S W P发送消息的协议能够调用s e n d(S W P, p a c k e t)。另一方面,用来实现S W P的发送操作的过程叫做s e n d S W P,并且它的第一个参数是一个状态变量(S w p S t a t e)。结果怎样呢?答案是,操作系统提供了粘结代码将对s e n d的一般调用转化为对s e n d S W P的特定协议调用的粘结代码。这个粘结代码将s e n d的第一个参数(协议变量S W P)映射为一个指向s e n d S W P的函数指针和一个指向S W P工作时所需的协议状态的指针。我们之所以通过一般函数调用使高层协议间接调用特定协议函数,是因为我们想限制高层协议中对低层协议编码的信息量。这使得将来能够比较容易地改变协议图的配置。现在来看d e l i v e r操作的S W P的特定协议实现,它在过程d e l i v e r SW P中实现。这个例程实际上处理两种不同类型的输入消息:本结点已发出帧的A C K和到达这个结点的数据帧。在某种意义上,这个例程的ACK部分是与send SWP中所给算法的发送方相对应的。通过检验头部的F l a g s字段可以确定输入的消息是ACK还是一个数据帧。注意,这种特殊的实现不支持数据帧中捎带A C K。当输入帧是一个ACK时,delive rSWP仅仅在发送队列(send Q)中找到与此ACK相应的位置(slot),取消超时事件,并且释放保存在那一位置的帧。由于A C K可能是累积的,所以这项工作实际上是在一个循环中进行的。对于这种情况值得注意的另一个问题是子例程swp In Wind o w的调用。这个子例程在下面给出,它确保被确认帧的序号是在发送方当前希望收到的A C K的范围之内。当输入帧包含数据时,d e l i v e r S W P首先调用m s g S t r i pH d r和l o a d _ s w p _ h d r以便从帧中提取头部。例程l o a d _ s w p_ h d r对应着前面讨论的s t o r e _ s w p _ h d r,它将一个字节串转化为容纳S W P头部的C语言数据结构。然后d e l i v e r SW P调用s w p I n Wi n d o w以确保帧序号在期望的序号范围内。如果是这样,例程在已收到的连续的帧的集合上循环,并通过调用d e l i v e r HL P例程将它们传给上层协议。它也要向发送方发送累积的A C K,但却是通过在接收队列上循环来实现的(它没有使用本节前面给出的s e q N u m To Ac k变量)。
最后,s w p I n Window是一个简单的子例程,它检查一个给定的序号是否落在某个最大和最小顺序号之间。4.帧顺序和流量控制
滑动窗口协议可能是计算机网络中最著名的算法。然而,关于该算法易产生混淆的是,它可以有三个不同的功能,第一个功能是本节的重点,即在不可靠链路上可靠地传输帧。(一般来说,该算法被用于在一个不可靠的网络上可靠地传输消息。)这是该算法的核心功能。
滑动窗口算法的第二个功能是用于保持帧的传输顺序。这在接收方比较容易实现,因为每个帧有一个序号,接收方要保证已经向上层协议传递了所有序号比当前帧小的帧,才向上传送该当前帧。即,接收方缓存了(即没有传送)错序的帧。本节描述的滑动窗口算法确实保持了帧的顺序,尽管我们可以想象一个变异,即接收方没有等待更早传送的帧都到达就将帧传给下一个协议。我们可以提出的一个问题是:我们是否确实需要滑动窗口协议来保持帧的顺序,或者,这样的功能在链路层是否是不必要的。不幸的是,我们还没有看到足够多的网络体系结构来回答这个问题我们首先需要理解的是,点到点链路序列如何由交换机连接而形成一条端到端的路径。滑动窗口算法的第三个功能是,它有时支持流量控制(f l o w c o n t ro l),它是一种接收方能够控制发送方使其降低速度的反馈机制。这种机制用于抑制发送方发送速度过快,即抑制传输比接收方所能处理的更多的数据。这通常通过扩展滑动窗口协议完成,使接收方不仅确认收到的帧,而且通知发送方它还可接收多少帧。可接收的帧数对应着接收方空闲的缓冲区数。在按序传递的情况下,在将流量控制并入滑动窗口协议之前,我们应该确信流量控制在链路层是必要的。
2.3编程实现过程 2.3.1 开发环境 操作系统:Windows 7旗舰版
开发语言:C++ / MFC 编译环境:MS Visual C++6.0 2.3.2 程序界面设计
此程序由于功能需要,分别设计了发送端(图2-3-2-1)和接收端(图2-3-2-2)两个MFC界面,实例如下:
图2-3-2-1
图2-3-1-2
2.3.3 关键模块分析
1.窗口初始化
BOOL CSenderDlg::OnInitDialog(){
// Set the icon for this dialog.The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);
// Set big icon CMenu* pSysMenu = GetSystemMenu(FALSE);if(pSysMenu!= NULL){
} CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){
} pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0)== IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);// Add “About...” menu item to system menu.CDialog::OnInitDialog();
// Set small icon
// TODO: Add extra initialization here //初始化WinSock WSADATA wsa;if(WSAStartup(MAKEWORD(2, 2), &wsa)!= 0){
} AfxMessageBox(“Failed to initialize the winsock 2 stack”);return FALSE;//创建UDP Sender Socket if((m_UDPSndrSocket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED))== INVALID_SOCKET)
//绑定Sender UDP端口
if(bind(m_UDPSndrSocket,(sockaddr*)&UDPSndrAddr, sizeof(UDPSndrAddr))== //填充本地UDP Sender Socket地址结构 SOCKADDR_IN UDPSndrAddr;memset(&UDPSndrAddr, 0, sizeof(SOCKADDR_IN));UDPSndrAddr.sin_family = AF_INET;UDPSndrAddr.sin_port = htons(3073);UDPSndrAddr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”);{
} AfxMessageBox(“Failed to create UDPSocket”);return FALSE;SOCKET_ERROR)
{ AfxMessageBox(“Failed to bind UDPSndrAddr”);return FALSE;
} } //填充Receiver UDP地址
memset(&m_UDPRcvrAddr, 0, sizeof(SOCKADDR_IN));m_UDPRcvrAddr.sin_family = AF_INET;m_UDPRcvrAddr.sin_port = htons(3074);m_UDPRcvrAddr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”);//创建UDP数据包接收线程 DWORD dwThreadId;CreateThread(NULL, 0, UdpReceiveThread, this, 0, &dwThreadId);return TRUE;// return TRUE unless you set the focus to a control void CSenderDlg::OnSysCommand(UINT nID, LPARAM lParam){
} if((nID & 0xFFF0)== IDM_ABOUTBOX){
} else { } CDialog::OnSysCommand(nID, lParam);CAboutDlg dlgAbout;dlgAbout.DoModal();
2.数据发送
void CSenderDlg::OnStartSend()
{
// TODO: Add your control notification handler code here //获取对话框数据 if(!UpdateData(TRUE))return;//初始化所有参数 if(m_pOutBuf!= NULL)delete []m_pOutBuf;m_pOutBuf = new frame[m_SendWndSize];m_iBuffered = 0;
//当前滑动窗口大小
//发送窗口左侧 m_ackExpected = 0;
m_nextFrameToSend = 0;//发送窗口右侧+1 for(int i=0;i = “ ”;int iSeq;if(!m_strFrameLost.IsEmpty()){ strcpy(tmp, m_strFrameLost);token = strtok(tmp, seps);while(token!= NULL){ iSeq = atoi(token);token = strtok(NULL, seps);if(iSeq < 0 || iSeq > MAX_SEQ) } { } m_errArray[iSeq] = LOST_ERR;AfxMessageBox(“Invalid seqno in LostFrame box, ignore it”);continue;} if(!m_strChksumErr.IsEmpty()){ strcpy(tmp, m_strChksumErr);token = strtok(tmp, seps);while(token!= NULL){ } iSeq = atoi(token);token = strtok(NULL, seps);if(iSeq < 0 || iSeq > MAX_SEQ){ } m_errArray[iSeq] = CKSUM_ERR;AfxMessageBox(“Invalid seqno in ChksumErr box, ignore it”);continue;} //启动网络层数据发送定时器 SetTimer(ID_SEND_TIMER, m_SendInterval, NULL);//窗口界面控制 GetDlgItem(IDC_SEND_WND_SIZE)->EnableWindow(FALSE); } GetDlgItem(IDC_SEND_INTERVAL)->EnableWindow(FALSE);GetDlgItem(IDC_RESEND_TIMER)->EnableWindow(FALSE);GetDlgItem(IDC_RANDOM_ERR)->EnableWindow(FALSE);GetDlgItem(IDC_MANUAL_ERR)->EnableWindow(FALSE);GetDlgItem(IDC_CHKSUM_ERR)->EnableWindow(FALSE);GetDlgItem(IDC_FRAME_LOST)->EnableWindow(FALSE);GetDlgItem(IDC_START_SEND)->EnableWindow(FALSE);GetDlgItem(IDC_STOP_SEND)->EnableWindow();CString strMsg;strMsg.Format(“%d”, m_ackExpected);GetDlgItem(IDC_BOTTOM)->SetWindowText(strMsg);strMsg.Format(“%d”, m_nextFrameToSend);GetDlgItem(IDC_TOP)->SetWindowText(strMsg);GetDlgItem(IDC_CUR_FRAME)->SetWindowText(“0”); 3.数据接收 void CReceiverDlg::OnStartRecv(){ // TODO: Add your control notification handler code here //获取对话框数据 if(!UpdateData(TRUE))return;//初始化所有参数 if(m_pInBuf!= NULL)delete []m_pInBuf;m_pInBuf = new frame[m_RecvWndSize];if(m_pArrived!= NULL)delete []m_pArrived; m_pArrived = new BOOL[m_RecvWndSize];for(int i=0;i //接收窗口左侧 m_frameExpected = 0;m_tooFar = m_RecvWndSize;//接收窗口右侧+1 for(i=0;i = “ ”;int iSeq;if(!m_strAckLost.IsEmpty()){ strcpy(tmp, m_strAckLost);token = strtok(tmp, seps);while(token!= NULL){ iSeq = atoi(token);token = strtok(NULL, seps);if(iSeq < 0 || iSeq > MAX_SEQ){ } m_errArray[iSeq] = LOST_ERR; AfxMessageBox(“Invalid seqno in LostFrame box, ignore it”);continue; } } } //启动网络层数据接收定时器,模拟接收速率限制 SetTimer(ID_RECV_TIMER, m_RecvInterval, NULL);//窗口界面控制 GetDlgItem(IDC_RECV_WND_SIZE)->EnableWindow(FALSE);GetDlgItem(IDC_RECV_INTERVAL)->EnableWindow(FALSE);GetDlgItem(IDC_AUX_TIMER)->EnableWindow(FALSE);GetDlgItem(IDC_RANDOM_ERR)->EnableWindow(FALSE);GetDlgItem(IDC_MANUAL_ERR)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_ERR_ACK)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_LOST_ACK)->EnableWindow(FALSE);GetDlgItem(ID_START_RECV)->EnableWindow(FALSE);GetDlgItem(IDC_STOP_RECV)->EnableWindow();CString strMsg;strMsg.Format(“%d”, m_iTokenCount);GetDlgItem(IDC_CUR_TOKEN)->SetWindowText(strMsg);strMsg.Format(“%d”, m_frameExpected);GetDlgItem(IDC_BOTTOM)->SetWindowText(strMsg);strMsg.Format(“%d”, m_tooFar);GetDlgItem(IDC_TOP)->SetWindowText(strMsg);GetDlgItem(IDC_CUR_RCVD)->SetWindowText(“0”); 2.3.4 结果演示与分析 1.正常发送模式测试 图2-3-4-1正常发送模式测试——发送端 图2-3-4-2正常发送模式测试——接收端 发送窗口与接收窗口都是8,序列号为从0到15,发送了8帧以后发送方收到ack7,表示接收方对发送方前8帧的确认。注意:尽管接收方辅助定时器设置为2秒,但接收方对0号帧的确认并没有在收到0帧2秒后发出,这是因为在辅助定时器超时之前,后续到来的正确的帧会重置(reset)辅助定时器,使其被重新设为2秒,因此,直到7号帧到达后,发送方窗口被占满而停止发送,此时接收方辅助定时器开始计时,并在2秒后发送ack7,表示对7号帧之前所有帧的确认。与此同时,在发送方收到ack7确认帧时,已经经过的时间为9秒,而重发定时器设置为10秒,因此并没有导致0号帧超时重传。可见,辅助定时器与超时定时器的设置是密切相关的,要想滑动窗口协议正确流畅的运行,将相关参数调整到一个合适的值很十分必要的。一个简单的规则是,与数据帧相关联的重发定时器的超时间隔应显著大于辅助定时器的超时间隔(事实上,重发定时器的值至少应大于等于辅助定时器超时间隔与发送窗口最大值之和)。 1)帧校验错测试 在做新的测试前,首先将发送端和接收端进行重置,即两端都先停止再重新开始,然后再做后续测试(如果需要,停止后可以修改相关参数)。 图2-3-4-3帧校验错测试——发送端 图2-3-4-4帧校验错测试——接收端 通过手工设置2号帧的校验和错误来模拟信道传输中的误码情况。可以看到接收方在收到2号错误帧后马上向发送方回送了一个nak2的否定应答帧,发送方在收到nak2后也立即重传了该帧,因此nak机制加速了错误帧的重传过程(否则如果接收方直接丢弃的话,就只能等到发送方2号帧的重发定时器超时后进行重传) 2)帧丢失测试 图2-3-4-5帧丢失测试——发送端 图2-3-4-6帧丢失测试——接收端 同帧校验和错误类似,帧丢失错误同样会引发接收端回送nak否定应答消息。不同的是,nak否定应答帧是在丢失帧的下一帧收到后发出的。如图5所示,由于传输过程中2号帧丢失,接收端在收到1号帧后,接下来收到了3号帧,这时,接收端知道由于某种原因2号帧丢失了,于是立即发送了2号帧的否定应答帧。在发送端收到该nak2帧后,也马上重传了该帧,nak机制同样加快了对丢失帧的重传操作。 3)确认帧丢失测试 图2-3-4-7确认帧丢失测试——发送端 图2-3-4-8确认帧丢失测试——接收端 注意,本次测试前首先调整了接收端的辅助定时器时间参数,将回送应答的时间设置为0.5秒,这样接收方每收到一帧,都会在下一帧到来之前回送上一帧的确认。如果不这样做,仍像正常测试时使用的参数那样,就不会对2号帧回送应答消息,原因在进行正常情况测试时已经讲过,因为3号帧的正确到达重置了辅助定时器,因此只有到7号帧发出后发送方因窗口满而停止,接收端辅助定时器超时,回送ack7,一次确认了7号帧之前所有的帧,这样就看不到2号应答帧丢失的效果了。 调整参数之后进行应答帧丢失测试,可以看到接收端发送2号应答帧时丢失了。发送端虽然没有收到2号帧的应答消息,但因发送窗口不满,而且也没有任何重传定时器到时,所以发送方继续发送后续的3号帧,接收端在收到3号帧后回送ack3,这次应答帧没有丢失。这样当发送端收到3号帧的应答帧时,它就知道3号帧之前的所有帧都已被正确的接收了,因此2号帧也被确认,发送窗口向后移动,再往后的传输过程就正常一应一答的进行。 4)流量控制测试 图2-3-4-9流量控制测试——接收端 图2-3-4-10流量控制测试——接收端 滑动窗口协议还有流量控制功能,即它可以保证缓慢的接收端不会被快速的 发送端发来的大量数据所淹没。如图7所示,首先调整发送定时器为500ms,即每秒发送2个数据包,接收端参数是:接收窗口大小为4,接收速率为每秒处理1个包。从图中可以看到,7号帧之前的帧还可以正常收发(这是由于令牌桶算法在短时间内有一定的处理突发流量的能力),从7号帧开始出现丢包现象(此时令牌数为0,令牌桶算法会在长时间内保证将流量限制在某一平均速率)。由于接收端处理能力不足,在丢包后无法及时向发送端回送确认,从而导致发送端窗口被占满而不能继续发送,在发送窗口内没有及时确认的帧都会被重发,这样就控制了两端收发过程的同步,使发送窗口的移动速度与接收窗口保持一致。 从接收端日志中含有accepted的记录中可以看出,尽管在发送端速度快的情况下,接收端还是可以依次按序的将数据包提交给网络层,从而也说明协议的运行是正确的。 中南大学 本科生课程设计(实践)任务书、设计报告 (大学计算机基础) 题 目 理想世界 学生姓名 李杰 指导教师 邵自然 学 院 湘雅医学院 临床医学与医学技术 专业班级 1105班 学生学号 2211110512 计算机基础教学实验中心 年 月 日 课程设计实践报告 理想世界 李杰 我选的主题是理想世界,我的思想是从图片来展现理想世界的样子,用图片表达我想说的内容。 设计的步骤:从以上两个方面入手,目录作为主页,主页内容是理想世界中frontpage的一些介绍,并且引入一些优美的图片,再一个个的建立超链接。在引入一些解决手段,创建连接理想世界。在理想世界这个链接中从图片来展现理想世界的样子,用图片表达我想说的内容。,也可以用一些flash动画,还可以使用word链接一些图片。在理想世界这个链接中,也可使用word链接一些先驱的行动,与我们自己的所处的世界对比,ppt制作幻灯片来演示一些有效提示,让我的理想世界最好的展现给大家。 采取的方法与手段:用Frontpage制作网页,通过链接使word文档、Powerpoint幻灯片、Flash动画得以展示。在网页制作中,可以通过添加图片来使页面更加美丽,在word文档中可以展示艺术字、建立文本。通过powerpoint可以把某些保护环境的行动展示。Flash动画是以链接的方法来参与展示。在需要一些资料的时候,可在网络上寻找,由于不是文件,这时就可以通过复制粘贴操作来获取资料。 遇到的问题:(1).在网页制作中,刚开始的时候连网页的表格布局都弄不出来,不知道该如何制作,从哪些方面入手。解决方法:先看了几遍课本,然后跟着课本的步骤上机实践,但是发现制作过程还是太慢,而且不熟悉frontpage网页制作工具,因此,开始几次的实践都是在慢慢熟悉该工具。直到熟悉该工具后才开始去制作。在word文档制作中,因为以前在中学的时候用过该工具,现在还有一些印象,所以经过一系列重温操作后,word文档的制作就熟悉了。在Powerpoint幻灯片制作中,因为是第一次接触和使用,许多功能和手段都不知道,较难制作出符合人意的幻灯片。通过多次实验操作来了解和熟悉它,然后就可以使用了。(2)在flash动画制作过程中,虽然老师上课讲过制作过程,但还是遇到了难题:制作的动画中,元件不随引导层而动,而是在关键帧之间走直线,这 个问题导致了我做不出动画,我只好一次次的尝试去做,最后成功做出来。有时还有一些小技巧,都是从同学手中问过来的。在设置背景图片时,会发现图片太小的话,背景就会变成多张重复的图片拼在一起,后来经过向同学询问后,使用图片编辑器对背景大小做了调整,使得背景和网页内容能够很好地融合在一起。二,网页制作好后浏览时图片显示不出来,改文件名或者换了文件夹储存都会导致图片无法显示,后来经过询问学习之后,才知道原因即任何图片的显示都是依靠路径来寻找来源,要设成相对路径有利于在其他机子上打开。在设置主题之前插好图片。三,刚开始做PPT时,不知道怎么插进去背景音乐和让它连续播放,后来经过多次实践后,发现可以在效果中设置这些。四,刚开始不会弄超链接,然后经过向同学询问后才明白,在选定对象之后点击右键,超链接,再选中连接的对象就可以了 总结:首先我们应该学会独立思考和自我解决问题的能力,因为实践和理论毕竟不同,在实践中会遇到一些我们不了解的东西,这时候应该先自己摸索,实在不行就去向同学和老师询问,一定要仔细阅读课本,巩固理论知识。否则很盲目,自信心也会受到打击2,做计算机作业有时候也是一种享受,因为你会为你自己的一点点进步一点点成功而高兴,增加生活情趣、3,做作业时要坚持不懈,不能在半途放弃。中途可能会遇到一些挫折,要记住“世界上没有谁能随随便便成功”,只有经历过多次失败,才能寻找到解决问题的最好方法。4,在制作网页的过程中,我的思想和人格也得到了升华,对大自然和地球的认识又提升到了一个另一个高度,令我受益匪浅。在全制作过程中,所有的难题都是有解决方法的,不要放弃制作机会,有难题可以去问别的同学或老师,也可以自己多次实践来找到解决方法。我在制作过程中大部分都是自己摸索的,这样不仅加强了自己对工具的熟悉度,同时也加强了对键盘的熟悉,我认为当我们自己去制作的时候,不管好坏都有助于自己,做得好,自己更有信心,鼓励下次还能做得更好,做的不好,还可以找出错误,提醒自己在什么地方应该注意,在什么地方可以改正。这样就可以更好的去改错。有时候可以去看一看别人的作品,看一下别人是怎么做的,想一想哪里值得借鉴,如果是自己,怎么做会更好。这样,在看的时 候可以加强对工具的熟悉,了解一些技巧,增加自己的见识。 这次的网页制作对于我来说与有很大的收获,我学会了,如何制作网页,如何在网页上表达自己的观点,以及网页制作的一些基本技巧,和网页制作过程中 最常见,最基本问题的解决。By临床与医技1105 李杰 2211110512 4 目 录 1.课题描述........................................................1 2 系统设计概述...................................................1 3 课程设计的主要内容............................................2 3.1站点总体设计原则及设计目标....................................2 3.2用户需求......................................................2 3.3动态IP地址的设置及服务器的配置...............................3 3.3.1.动态IP配置简介...........................................3 3.3.2.配置DHCP服务器...........................................3 3.3.3配置IIS服务器.............................................6 3.4制作网站......................................................6 3.4.1.建站流程..................................................6 3.4.2.网站各模块的设计...........................................7 3.4.3.建站实现软件...............................................8 3.5.建站注意要点..................................................9 3.5.1.前期调研分析...............................................9 3.5.2.网站的目的及功能定位.......................................9 3.5.3网站技术解决方案...........................................9 3.5.4.网站内容规划.............................................10 3.5.5.网页设计.................................................10 3.5.6.网站测试..................................................10 4.网站维护.......................................................10 4.1、静态页面的添加修改..........................................10 4.2、动态功能支持在线更新........................................10 总结..............................................................12 参考文献.........................................................12 1.课题描述 计算机网络近年来获得了飞速的发展。计算机通信网络以及Internet已成为我们社会结构的一个基本组成部分。网络被应用于工商业的各个方面,电子银行、电子商务、企业管理、信息服务业等都以计算机网络系统为基础。从学校远程教育到公司日常办公乃至现在的电子社区,很多方面都离不开网络技术。可以不夸张地说,网络在当今世界无处不在。 网络的发展也是一个经济上的冲击。数据网络使个人化的远程通信成为可能,并改变了商业通信的模式。一个完整的用于发展网络技术、网络产品和网络服务的新兴工业已经形成,计算机网络的普及性和重要性已经导致了在不同岗位上对具有更多网络知识的人才的大量需求。企业需要雇员来规划、获取、安装、操作、管理那些构成计算机网络的软硬件系统,建立自己的网站,方便办公及交流 系统设计概述 传统的企业内部办公存在着种种弊端,往往造成人员和资源的极大浪费,应用网络技术组建余个高效、快捷、安全的办公环境成为许多企业和单位的当务之急。与传统的单机工作相比,网络化办公具有以下几个明显优点: 1共享软硬件资源,节约资金投入,提高运作效率 企业内部组件web站点后,可以在一个部门只安装一台打印机和扫描仪,其他计算机通过局域网共享这些设备和数据,有利于降低成本。2对重要数据进行安全、集中的管理 组建站点后,可以把一些重要数据放置在专门的网络服务器上集中管理,并通过网络服务器的访问控制限制其他计算机对总要数据的访问。这样就可以有效管理企业内部的重要数据,保证数据安全性,防止数据丢失和被窃取。3方便企业内部信息发布与交流 当企业进行诸如企业内部新闻、电话号码、产品文档、技术文件等信息发布时,可以把这些信息放置在web站点的共享目录上,供员工下载,方便了信息的发布和接收。4便于员工的协调操作 利用内部的办公网,可以方便的对同一事务进行协同处理,提高工作效率,缩短任务完成的时间 图2.1企业内部网络拓扑 课程设计的主要内容 3.1站点总体设计原则及设计目标 组建企业内部web站点要注意站点的分块、共享、安全性、可管理性、以及可维护性。在设计中,系统结构模块化,软硬件平台可以模块化瓶装,系统配置灵活,使系统具有强大的可增长性和强壮性。满足多层次安全控制手段,建立完善的安全管理体系,防止数据的丢失和被窃取。 组建企业内部web站点,既能将公司内部所有计算机纳入系统中去,实现统一规划、分块工作、异地互联、整体管理,并可为将来的应用扩展升级预留接口。 3.2用户需求 作为企业内部网络需要满足: 1、办公事务管理 主要包括公文与文档管理、公告、大事记、会议纪要、资产与办公用品管理、行政制度、办公事务讨论等。 2、人力资源管理 主要包括员工档案、岗位职责、员工通信录、认识管理规范等。 3、财务资产管理 主要包括固定资产管理、工资管理、经费管理等。 4、网站管理 主要包括用户及权限设置、数据库维护、网页设置、标志与标题设置及网络各栏目内容编辑等功能。 3.3动态IP地址的设置及服务器的配置 3.3.1.动态IP配置简介 动态IP地址,顾名思义就是设备所取得的IP地址是非固定的,是可以动态分配和取得的。使用动态IP地址的原因主要有两个:一是可以用较少的IP地址构建较大的网络。如果与连入网络的主机和其它设备相比,所分得的公用IP地址略少一些,如果为每个设备都分配一个固定的IP地址,则显然部分计算机将不能接入网络。考虑到并非所有的计算机都在同一时间内运行并与网络连接,所以,如果将IP进行动态分配,即计算机连入网络时自动取得,断开与网络的连接时自动收回,即可满足网络对IP地址的需求。二是可以增加网络内计算机的可移动性。当某台主机从一个子网移动到另一个子网时,由于IP地址中网络号的不同,从而导致该计算机与其它主机间无法进行通信,解决该类问题最简单的方式就是为移动的主机在新子网中重新分配IP地址。但是,如果采用动态IP地址,就会减少这种网络管理的复杂性。Windows NT使用DHCP来解决动态IP地址的分配问题。使用DHCP时,整个网络中必须至少有一台运行Windows NT主机安装有DHCP软件,充当DHCP服务器,而其它所有欲使用DHCP功能的工作站也必须具有支持DHCP的功能。这样,当DHCP工作站启动时,它就会自动与DHCP服务器通信,并由DHCP服务器为其提供一个IP地址。当然,这个地址只是临时的 3.3.2.配置DHCP服务器 DHCP提供了计算机IP地址的动态配置,如果需要服务器为域中的计算机动态分配IP地址,则必须配置DHCP服务器。配置DHCP服务器的具体步骤如下: 图3.1打开服务器配置向导 图3.2配置服务器向导 图3.3配置服务器向导 图3.4为配置服务器向导 图3.5管理服务器 图3.6 再来就是通过“开始”选择“控制面板”|“添加或删除程序”也可以安装DHCP。 3.3.3配置IIS服务器 右键单击“我的电脑”选择“管理”~服务及应用程序~Internet信息服务~网站~默认网站,单击右键,选择属性,打开主目录,设置主目录为web站点的根目录,也可选择修改其他属性 图3.7配置IIS服务器 3.4制作网站 3.4.1.建站流程 建立网站的流程大致可以分成三个阶段,如图所示 图3.8网站的流程框图 构建内容信息、搜索整理资料和规划网站结构是建立网站的 企业的每一个员工都存在向企业内部网发布内容的潜在可能性。但员工必须按照他们各自的角色协调作业活动。不同规模的公司都需要以省时省钱的方式组织交互信息发布的流程。 通常情况下,为在网站上发布内容,作者创建的材料要经过一个或多个编辑的审校和核准。在这个过程中,作者及编辑按照各种特定的标准分类及标注信息,并为发布设计页面及连接。这一流程通常不是正式的,且要接受网络管理员的协调,这就导致了管理员在“站点发布狂潮”到来时,或是当用户对实时信息需求迅速增长时陷入孤立无援的境地。 使用Site Server可以解决,Site Server还定义了一套为站点增添内容的四步流程,既提交、标注、核准和部署。 图3.9新闻发布系统框图 3.4.3.建站实现软件 可以用Dreamweaver,主要包括两种页面,即html和asp。 HTML(Hyper Text Markup Language ,超文本标记语言),或称为“多媒体文件语言”,是用于创建Web页和Web 信息发布的 (1)通用性:可实现不同平台的文档共享。 (2)可扩展性:HTML的标签集合可以根据新需求而不断修正或加入有限的新标签符, 为实现有限的新功能的扩展提供保障。 (3)创建的灵活性:HTML文档是纯文本文档, 可以由网页编辑器以及其他文本编辑软件创建。 HTML是“Hyper Text Markup Language”的缩写,它是一种超文本标记语言,是网页的描述语言,用于编制通过万维网显示的超文本文件。它是目前在网页设计中,所使用的最基本的标记语言。现在很多HTML 的编辑器,都是通过跟文字处理器相似的接口来编辑网页的。 ASP 文件和 HTML 文件类似ASP 文件可包含文本、HTML、XML 和脚本 ASP 文件中的脚本可在服务器上执行。ASP 文件的扩展名是 “.asp”.当浏览器请求某个 HTML 文件时,服务器会返回这个文件.而当浏览器请求某个 ASP 文件时,IIS 将这个请求传递至 ASP 引擎。ASP 引擎会逐行地读取这个文件,并执行文件中的脚本。最后,ASP 文件将以纯 HTML 的形式返回到浏览器。ASP 指 Active Server Pages(动态服务器页面)ASP 是运行于 IIS 之中的程序.3.5.建站注意要点 另外在网页制作过程中应注意以下要点: 3.5.1.前期调研分析 了解网页制作后具体的工作人员具体权限,以保证公司机密信息不会被泄露,同时又能让每个人从网站上获取足够的工作信息;同时对于私人隐私的公开应得到个人的允许。在注意到以上的同时,还要考虑公司的自身情况、建设网站的能力等 3.5.2.网站的目的及功能定位 本次为企业内部web站点的构建及维护 3.5.3网站技术解决方案 确定服务器,是自建服务器还是租用虚拟主机。选择操作系统。网站安全性措施,如:防入侵,防病毒,防窃取方案 3.5.4.网站内容规划 根据网站的目的和功能规划网站内容。一般企业内部网站应包括:公司简介、部门简介、公共信息、新闻发布、员工联系方式、任务信息、信息搜索查询、相关帮助等内容。 3.5.5.网页设计 网页美术设计要求。网页美术设计一般要求与企业整体形象一致,企业内部网色彩要与办公环境保持和谐 3.5.6.网站测试 ①网站发布前要进行细致周密的测试,以保证正常的浏览和使用。主要测试内容有: ②服务器稳定性、安全性。③程序及数据库测试 ④网页兼容性测试,包括不同浏览器下的现实结果、不同显示器分辨率的页面效果等。⑤需要的其他测试 4.网站维护 服务器及相关软硬件的维护,对可能出现的问题进行评估,制定相应时间。数据库维护。有效地利用数据是网站维护的重要内容,因此数据库的维护要受到重视。 内容的更新、调整计划。 制定相关网站维护的规定,将网站维护制度化、规范化。 4.1、静态页面的添加修改 静态页面的更新需要使用专业的网页设计工具,然后将修改后的网页通过FTP上传到相应的位置,在此同时还要保证不能破坏其他的页面程序和格局 4.2、动态功能支持在线更新 如果企业信息量很大,如工作信息经常需要更新,有更多的企业资讯需要告诉员工,企业建立动态数据库系统。这里的动态并不是指动画,而是指网站的内容来自企业的数据库。如果更改了数据库,那么前台页面的内容也会随之而更改。 总 结 通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。安排课程设计的基本目的,在于通过理论与实际的结合、人与人的沟通,进一步提高思想觉悟。尤其是观察、分析和解决问题的实际工作能力,以便培养成为能够主动适应社会主义现代化建设需要的高素质的复合型人才。作为整个学习体系的有机组成部分,课程设计虽然安排在一周进行,但并不具有绝对独立的意义。它的一个重要功能,在于运用学习成果,检验学习成果。运用学习成果,把课堂上学到的系统化的理论知识,尝试性地应用于实际设计工作,并从理论的高度对设计工作的现代化提出一些有针对性的建议和设想。检验学习成果,看一看课堂学习与实际工作到底有多大距离,并通过综合分析,找出学习中存在的不足,以便为完善学习计划,改变学习内容与方法提供实践依据。对计算机专业的本科生来说,实际能力的培养至关重要,必须从课堂走向实践。这也是一次预演和准备毕业设计工作。通过课程设计,让我找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。课程设计促进了我系人才培养计划的完善和课程设置的调整。在一个星期的课程设计之后,我感到不仅实际动手能力有所提高,更重要的是通过对网站开发流程以及维护方面的了解,进一步激发了我对专业知识的兴趣,并能够结合实际存在的问题在专业领域内进行更深入的学习。 在课程设计过程中,我学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪,黑夜过去了,我收获的是黎明。 参考文献 [1]朱兵.小型网组建与应用进阶[M].南方出版社.2004.[2]邓文达胡伏湘.计算机网络教程[M].清华大学出版社.2007.[3] 赵永超.新编网站规划与设计教程[M].西北工业大学出版社.2004.[4] 杨力学.ASP商业网站整站集成开发[M].电子工业出版社.2007.[5] 石志国.ASP动态网站编程[M].清华大学出版社.2001.[6] 李岚.网络设计与维护[M].中国物资出版社.2002. 计算机网络课程设计 报告书 学院: 班级:通信0902 姓名: 学号: 指导老师: 实验三 交换机VLAN实验 SWITCH2的拓扑图 规划IP: PCA的ip为:10.65.1.1 PCB的ip为:10.66.1.1 PCC的ip为:10.65.1.3 PCD的ip为:10.66.1.3 SWA: SWB: 设置VLAN: SWA: SWB: 不设trunk时测试可通性 从PCA到PCC测试:不通,因现在的连线两端在VLAN1中,不能承载Vlan2的信息 [root@PCA root]# ping 10.65.1.3 从PCA到PCB测试:不通:不是一个网段,且不在一个VLAN [root@PCA root]# ping 10.66.1.1 从PCB到PCD测试:通:因为在同一网段内。路径:从switch A的f0/6到switch B的f0/6 [root@PCB root]# ping 10.66.1.3 从PCA到SWA测试:不通:不在同一网段内 [root@PCA root]# ping 10.66.1.7 从PCA到SWB测试:不通:不在同一网段,也不在同一vlan [root@PCA root]# ping 10.66.1.8 从SWA到PCA测试:不通:不在同一网段 SWA#ping 10.65.1.1 从SWA到SWB测试:通:在同一个网段中,路径:从switch A的f0/8到switch B的f0/1 SWB#ping 10.66.1.8 swa40#conf t swa40(config)#int f0/8 swa40(config-if)#switchport mode trunk swa40(config-if)#int f0/1 swa40(config-if)#switchport mode trunk swa40(config-if)# 从PCA到PCC、PCD、SWA、SWB的可通性依次为通,不通,不通,不通。 PCA和PCC在同一网段中,路径:从switch A的f0/3到switch B的f0/3,PCA和PCD、SWA、SWB不在同一网段内。 从PCB到PCC、PCD、SWA、SWB的可通性依次为不通,通,通,通。PCB与PCC不在同一网段,PCB与PCD、SWA、SWB在同一网段内,路径分别为从switch A的f0/6到switch B的f0/6;从PCB到switch A的f0/6;从switch A的f0/6到switch B的f0/1.SWITCH3的拓扑图 (1)都不设vlan情况下,测试连通性 从PCA到PCC,PCD,SWA,SWB依次为 不通,不通,通,不通 PCA与PCC、PCD不在同一默认vlan中,PCA与SWA在同一默认vlan中,路径:从PCA到switch A的f0/3,PCA与SWB不在同一默认vlan中。 从PCB到PCC,PCD,SWA,SWB依次为不通,不通,通,不通。PCB与PCC、PCD不在同一默认vlan中,PCB与SWA在同一默认vlan中,路径:从PCB到switch A的f0/6,PCB与SWB不在同一默认vlan中。 (2)设置有vlan情况下,测试连通性 从PCA到PCC、PCB、SWA、SWB、PCD均不通:不在同一vlan 从PCB到PCC、PCD、SWA、SWB测试为不通,不通,通,不通。PCB与PCC、PCD不在同一默认vlan中,PCB与SWA在同一默认vlan中,路径:从PCB到switch A的f0/6,PCB与SWB不在同一默认vlan中。 (3)使用trunk情况下,测试连通性 从PCA到PCC、PCD、SWA、SWB的可通性依次为不通,通,不通,不通。PCA与PCC、PCD不在同一默认vlan中,PCA与SWA在同一默认vlan中,路径:从PCA到switch A的f0/3,PCA与SWB不在同一默认vlan中。 从PCB到PCC、PCD、SWA、SWB的可通性依次为通,不通,通,通。PCB到PCC设置了trunk,路径:从switch A的f0/6到switch C的f0/1到switch B的f0/1,PCB与PCD不在同一vlan,PCB与SWA、SWB设置了trunk,路径:从PCB到switch A的f0/6,从switch A的f0/6到switch C的f0/1到switch B的f0/1 实验六 路由器接口的secondary ip 装入图文件:router1e 设置计算机的IP和网关: PCA:PCA的IP地址:10.65.1.1 网关指向:10.65.1.2 PCB:PCB的IP地址:10.66.1.1 网关指向:10.66.1.2 设置交换机的IP地址: switch(config)#int vlan 1 switch(config-if)#ip address 10.66.1.8 255.255.0.0 设置路由器的接口f0/0的有两个ip地址。roa(config)int f0/0 roa(config-if)#ip address 10.65.1.2 255.255.0.0 roa(config-if)#no shut roa(config-if)#ip address 10.66.1.2 255.255.0.0 secondary roa(config-if)#no shut roa#sh run 测试可通性 [root#PCA root]# ping 10.66.1.1 通:在同一网段,路径:从switch的f0/3到f0/6 [root#PCA root]# ping 10.66.1.2 通 [root#PCB root]# ping 10.65.1.1 通:在同一vlan中,从switch的f0/6到f0/3 [root#PCB root]# ping 10.65.1.2 通 switch#ping 10.65.1.1 不通:不在同一网段 switch#ping 10.66.1.1 通:在同一网段,路径:从switch的f0/6到PCB 如果去掉交换机与路由的连线,PCA和PCB还可以通吗? 不通:不在同一网段,需通过路由寻址,去掉线就不能通了。 可见PCA到PCB的发包是经过路由器的,称之为单臂路由。 这种情况PCA和PCB在同广播域中,对工作带宽不利。如果划分VLAN可以隔离广播 实验七 使用路由器子接口路由情况 装入图文件:router1e 此实验计算机和交换机的IP地址和网关不变,但要求交换机工作在两个VLAN的情况下,一个是原有的默认VALN,另一个是新设置的VLAN 2,含f0/ 5、f0/6。1.设置交换机,增加一个vlan 2 switch#vlan database Switch(vlan)#vlan 2 Switch(vlan)#exit Switch#conf t Switch(config)#hostname SWA SWA(config)#int f0/5 SWA(config-if)#switchport access vlan 2 SWA(config-if)#int f0/6 SWA(config-if)#switchport access vlan 2 SWA(config-if)#int f0/1 SWA(config-if)#switchport mode trunk SWA(config-if)# 2.路由器f0/0 有两个子接口 roa(config)int f0/0 roa(config-if)#int f0/0.1 roa(config-subif.1)#encapsulation isl 1 roa(config-subif.1)#ip address 10.65.1.2 255.255.0.0 roa(config-subif.1)#no shut roa(config-subif.1)#int f0/0.2 roa(config-subif.2)#encapsulation isl 2 roa(config-subif.2)#ip address 10.66.1.2 255.255.0.0 roa(config-subif.2)#no shut roa#sh run 3.测试可通性:都通,路由器设置了两个子接口,使其在同一vlan中 [root#PCA root]# ping 10.66.1.1 通,路径:从PCA到switch A的S0/3到switch A的S0/1到ROA的F0/0到switch A的S0/1到switch A的S0/6到PCB [root#PCA root]# ping 10.66.1.2 通:从PCA到switch A的S0/3到switch A的S0/1到ROA 的F0/0到switch A的S0/1到switch A的S0/6到PCB,) [root#PCB root]# ping 10.65.1.1 通:从PCB到switch A的S0/6到switch A的S0/1到ROA的F0/0到switch A 的S0/1到switch A 的S0/3到PCA) [root#PCB root]# ping 10.65.1.2 通:从PCB到switch A的S0/6到switch A的S0/1到ROA的F0/0到switch A的S0/1到switch A的S0/3到PCA 在使用一个路由器接口的情况下,如果下接的网络含有不同的VLAN,则要求路由器的接口要划分成子接口,并绑定isl协议。在交换机上通过多个VLAN的接口,要设置成trunk。如果去掉交换机与路由的连线,PCA和PCB还可以通吗? 不通:不在同一网段,需通过路由寻址,去掉线就不能通了。 可见这也是一种单臂路由。 实验九 三个路由器的静态路由 装入图文件:router3 设置ROA的IP: f0/0: 10.65.1.2-->PCA:10.65.1.1 f0/1: 10.66.1.2-->PCB:10.66.1.1 s0/0: 10.67.1.2 s0/1: 10.68.1.2--> 设置ROB的IP: s0/0: 10.68.1.1 <--s0/1: 10.69.1.2--> f0/0: 10.70.1.2 f0/1: 10.71.1.2 设置ROC的IP: s0/0: 10.69.1.1 <--s0/1: 10.72.1.2 f0/0: 10.73.1.2-->PCC:10.73.1.1 f0/1: 10.74.1.2-->PCD:10.74.1.1 设置从PCA到PCC的静态路由 ROA(config)#ip routing ROA(config)#ip route 10.73.0.0 255.255.0.0 10.68.1.1 ROA#show ip route ROB(config)#ip route 10.73.0.0 255.255.0.0 10.69.1.1 ROB#show ip route [root@PCA root]#ping 10.73.1.1 通:由于与ROA和ROC相连的ROB接口都在同一个网段上,所以能通,路径:从PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/1到PCD 使用默认路由 ROA(config)#no ip route 10.73.0.0 255.255.0.0 10.68.1.1 [root@PCA root]#ping 10.73.1.1 通:因为装入文件时有默认的动态路由存在路径:从PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/1到PCD ROA(config)#ip route 0.0.0.0.0.0.0.0 10.68.1.1 [root@PCA root]#ping 10.73.1.1 通:从PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/1到PCD) 实验十 三个路由器动态路由实验 装入图文件:router3 实验网络与上个实验相同,ip地址也不变,现在用动态路由实现网络的连通。ROA(config)#ip routing ROA(config)#router rip ROA(config-router)#network 10.0.0.0 ROB(config)#ip routing ROB(config)#router rip ROB(config-router)#network 10.0.0.0 ROC(config)#ip routing ROC(config)#router rip ROC(config-router)#network 10.0.0.0 ROA#sh ip route ROB#sh ip route ROC#sh ip route 从计算机PCA 测试到各点的连通性。都通:由于路由器接口都已经激活,可以相互连通:路径:PCA到PCB:从PCA到switch B的F0/0 F0/1到PCB PCA到PCC:从PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/0到PCC PCA到PCD :从PCA到switch B的F0/0 S0/1到switch A 的S0/0 S0/1到switch C的S0/0 F0/1到PCD 实验十一 基本访问控制列表 装入文件1 1.配置路由达到网络各点可通。 本实验使用有动态路由,也可以使用静态路由。假设网络是通畅的。ROA f0/0: 10.65.1.2-->PCA:10.65.1.1 ROA f0/1: 10.66.1.2-->PCB:10.66.1.1 ROA s0/0: 10.67.1.2 ROA s0/1: 10.68.1.2--> ROB s0/0: 10.68.1.1 <--ROB s0/1: 10.69.1.2--> ROB f0/0: 10.70.1.2 ROB f0/1: 10.71.1.2 ROC s0/0: 10.69.1.1 <--ROC s0/1: 10.72.1.2 ROC f0/1: 10.73.1.2-->PCC:10.73.1.1 ROC f0/0: 10.74.1.2-->PCD:10.74.1.1 1.基本的访问控制列表: 先从PCA ping PCD: [root@PCA @root]#ping 10.74.1.1 应该是可以通的。由于与ROA和ROC相连的ROB接口都在同一个网段上,路径:从 PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/1到PCD 在ROB的s0/0写一个输入的访问控制列表: ROB(config)#access-list 1 deny any ROB(config)#int s0/0 ROB(config-if)#ip access-group 1 in ROB#sh access-list 测试PCA至PCD的联通性。(deny)命令所示为S0/0读入控制,题意ROB S0/0为10.68.1.1,PCA的IP为10.65,1,1不包含于ROB VLAN中,所以不能访问 测试PCC至PCD的联通性。(permit)在同一个路由器下,通过路由器寻址能找到对方的IP,所以能通, PCC到switch C的f0/0 F0/1到PCD 测试PCD至PCA的联通性。(permit)由题意由于命令所示为S0/0读入控制,所以ROB能访问ROA,所以访问列表设置无效,所以两者之间的访问不受控制,所以能PING通, 从PCD到SWC的F0/1 S0/0到SWA的S0/0 S0/0到SWB的S0/1 F0/0到PCA 2.删除这个列表 ROB(config)#no access-list 1 ROB(config)# int s0/0 ROB(config-if)#no ip access-group 1 in 二者都可能实现去掉访问列表的目的。前者是从列表号角度删除,后者是从接口及输入和输出的角度删除。可以通过sh run 和sh access-list 命令查看删除情况。3.再写访问控制列表 ROA(config)#access-list 1 deny 10.65.1.1 ROA(config)#access-list 1 permit any ROA(config)#int s0/1 ROA(config-if)#ip access-group 1 out ROA#sh access-list 再测试PCA至PCD的联通性。(deny)ROA设置拒绝了PCA的访问 再测试PCB至PCD的联通性。(permit)由题意ROA中的S0/1为10.68.1.2 PCB的IP为10.66.1.1,不包含于S0/1 VLAN中,由于命令所示为S0/0由于是输出控制,能访问,所以访问列表设置无效,不加控制,所以能PING通, 从PCB到SWB的F0/1 S0/1到SWA 的S0/0 S0/1到SWC的S0/0 F0/1到PCD 再测试PCD至PCA的联通性。(permit)由于是输出控制,所以对输入不做要求,能通,所以输出访问列表无效,对输入不加控制,所以能PING通, 从PCD到SWC的F0/1-S0/0到SWA的S0/0-S0/0到SWB的S0/1-F0/0到PCA 4.重新设置各路由接口有电脑的ip地址。R0B(config)#access-list 4 permit 10.65.1.1 ROB(config)#access-list 4 deny 10.65.1.0 0.0.0.255 (10.65.1.3 deny)ROB(config)#access-list 4 permit 10.65.0.0 0.0.255.255(10.65.0.0 permit)ROB(config)#access-list 4 deny 10.0.0.0 0.255.255.255 (10.66.0.0 deny)ROB(config)#access-list 4 permit any (11.0.0.0 premit)ROB(config)#int s0/0 ROB(config-if)#ip access-group 4 in 测试PCA至PCD的联通性。(deny)PCA的IP为10.65.1.1按理来说应该所有的访问都允许,由于命令所示为S0/0读入控制,题意ROB S0/0为10.68.1.1,PCA的IP为10.65,1,1不包含于ROB VLAN中所以不通 测试PCB至PCD的联通性。(permit)P CB的IP为10.66.1.1属于deny 10.0.0.0 0.255.255.255,所以访问被拒绝,所以PING不通 测试PCD至PCA的联通性。(permit)PCD的IP为10.74.1.1属于deny 10.0.0.0 0.255.255.255,按理来说应该是拒绝的,但是DENY属于源程序拒绝访问,而PCD先到S0/1,在通过S0/1与S0/0进行信息传递,所以能到达PCA,所以设置读入列表参数无效,对PCD不做限制, 从PCD到SWC的F0/1-S0/0到SWA的S0/0-S0/0到SWB的S0/1-F0/0到PCA 接口的ip地址,计算机的ip地址,请自定 实验十二 扩展访问控制列表 装入文件2 1.阻止PCA访问PCD: ROB(config)# access-list 101 deny icmp 10.65.1.1 0.0.0.0 10.74.1.1 0.0.0.0 ROB(config)# access-list 101 permit ip any any ROB(config)# int s0/0 ROB(config-if)#ip access-group 101 out ROB(config-if)#exit ROB(config)#exit ROB#sh access-list [root@PCA root]#ping 10.74.1.1(不通)PCA的IP为10.65.1.1属于deny ip 10.65.1.1 0.0.0.0 10.74.1.1 0.0.0.0,所以PING 不通 [root@PCC root]#ping 10.74.1.1(通)PCC和PCD处在同一个路由器下,通过路由器寻址可以相互PING通,从PCC到SWC的F0/0-F0/1到PCD [root@PCD root]#ping 10.65.1.1(通)因为ROB的S0/0为输出控制,所以当PCD通过外部访问ROB某个端口下的PCA时,是不受控制的,所以ROB的S0/0的输出对PCD的访问是无效的,所以链路不加限制,从 PCD到SWC的F0/1-S0/0到SWA的S0/0-S0/0到SWB的S0/1-F0/0到PCA 2.删除这个列表 ROB(config)#no access-list 101 ROB(config)#int s0/0 ROB(config-if)#no ip access-group 101 ROB#sh access-list [root@PCA root]#ping 10.74.1.1(通)由于没有任何限制,再加上路由器间的寻址,所以可以PING通, 从PCA到SWB的F0/0-S0/1到SWA的S0/0-S0/1到SWC的S0/0-F0/1到PCD 3.阻止10.65.0.0网络访问 10.74.1.1计算机(PCD)。 ROA(config)#access-list 102 deny ip 10.65.1.1 0.0.0.0 10.74.1.1 0.0.0.0 ROA(config)#access-list 102 permit ip any any ROA(config)#interface s0/1 ROA(config-if)#ip access-group 102(默认为out) [root@PCA root]#ping 10.74.1.1(不通)PCA的IP属于 DENY IP 10.65.1.1 0.0.0.0 10.74.1.1 0.0.0.0 被限制访问,所以不通 [root@PCC root]#ping 10.74.1.1(通)由于PCC和PCA在同一个路由器下,所以能通过路由器寻址进行PING通, 从PCC到SWC的F0/0-F0/1到PCD [root@PCD root]#ping 10.65.1.1(通)由于ROA的S0/0为输出控制,所以对输入没有任何要求,所以对输出控制列表设置无效,PCD访问PCA不受限制, 从PCD到SWC的F0/1-S0/0到SWA的S0/0-S0/0到SWB的S0/1-F0/0到PCA 心得体会 从实验三中学会了如何规划ip地址,设置vlan,将连接两个交换机的接口设置成trunk等,知道了写代码时一定得仔细,否则打错了下面就不能ping通了。 从实验六中,我学会了设置计算机和交换机的IP和网关,设置路由器的接口的ip地址等。 从实验七中,我学会了设置交换机,增加一个vlan,设置路由器的子接口,了解了isl协议,isl协议:交换链路内协议(ISL),是思科私有协议,主要用于维护交换机和路由器间的通信流量等 VLAN 信息。ISL 主要用于实现交换机、路由器以及各节点(如服务器所使用的网络接口卡)之间的连接操作。为支持 ISL 功能特征,每台连接设备都必须采用 ISL 配置。ISL 所配置的路由器支持 VLAN 内通信服务。非 ISL 配置的设备,则用于接收由 ISL 封装的以太帧(Ethernet Frames),通常情况下,非 ISL 配置的设备将这些接收的帧及其大小归因于协议差错。 从实验九中,我学会了设置静态路由。 从实验十中,我学会了用动态路由实现网络的连通。从实验十一中,我学会了基本访问控制列表的使用。从实验十二中,我学会了如何扩展访问控制列表。 最后,谢谢老师这几天的指导,真的让我学到了很多很多。 计算机网络课程设计——IP数据报流量统计 摘 要 本课程设计主要是编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示出来。程序中会用到Winpcap,它主要功能在于独立于主机协议发送和接收原始数据报。本次课程设计中用VC++实现基于Winpcap的网络数据包的捕获和统计,基于Winpcap的应用程序将根据获取网络设备列表;选择网卡并打开;设置过滤器;捕获数据包或者发送数据包;列出网卡列表,让用户选择可用的网卡的步骤进行编写,同时对于TCP/IP协议以及IP数据抱的格式有了进一步的了解和掌握。通过编写程序从而实现对网络中IP数据包流量的统计。 关键词: IP数据包;流量统计;Winpcap;VC++ 1 引 言 随着Internet技术的发展,基于IP协议的应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层以基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和网络课程的学习是十分重要的,通过本次课程设计,有助于熟悉IP数据包格式并加深对IP协议的理解。 1.1 课程设计目的 本次课程设计主要是通过用VC++编程实现对网络中IP数据包流量的统计,实际上是编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,同时应用Winpcap,Winpcap提供了很好的捕获网络数据包的方法,通过本次课程设计可以将VC++知识与Winpcap结合起来实现在一段时间内对IP数据包的流量进行统计。加深了对Winpcap的理解和运用能力,同时也增长了知识,开阔了视野,对于以后的学习有很大的帮助。 1.2 课程设计的要求 (1)理解运用VC++软件实现对网络中的IP数据抱流量的统计方法和步骤。(2)锻炼独立编程和查阅文献资料解决问题的能力。 (3)通过课程设计培养严谨的科学态度,认真的工作作风。 1.3 设计平台 Microsoft Visual C++ 6.0 2 设计原理 IP是ICP/IP协议体系中的网络层协议,TCP、UDP、ICMP和IGMP等其他协议都是以IP协议为基础的。程序中用到的Winpcap是 Windows packetcapture的缩写,这是UNIX下的lipbcap移植到Windows下的产物,是Win32环境下数据包捕获的开放代码函数库。 Winpcap由内核级的数据包过滤器,底层动态链接库(packet.dll)和一个高层的独立于系统的库(wpcap.dll)组成。 2.1 IP协议 IP是TCP/IP模型中的网络层协议,又称为互联网协议,是支持网间互连的数据报协议,它与TCP协议一起构成了TCP/IP协议族的核心。它提供网间连接的完善功能,包括IP数据报规定互联网范围内的IP地址格式。在因特网中IP协议是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为不同的类别。 IP协议的特点如下: IP协议是一种不可靠、无连接的数据报传送协议。IP协议是点对点的网络层通信协议。IP协议向通信层隐藏了物理网络的差异。 IP协议以一种数据报的形式传输数据,每个数据报独立传输,可能通过不同路径传输,因此可能不按顺序到达目的地,或者出现重复。 2.2 关于Winpcap库 Winpcap(windows packet capture)是windows平台下一个开源的、公共的基于windows的网络接口API库。主要为win32应用程序提供访问网络底层的能力。Winpcap的主要功能在于独立于主机协议(如TCP/IP)发送和接收原始数据报。也就是说,Winpcap不能阻塞、过滤或控制其他应用程序数据报的收发,它只是监听共享网络上传送的数据报。 其功能有:捕获原始数据包,包括在共享网络上各主机发送接收的以及相互之间交换的数据包;在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;在网络上发送原始数据包;收集网络通信过程中的统计信息。Winpcap是针对win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。它由Packet、NPF(Netgroup Packet Filter)、packet.dll、wpcap.dll、Application组成,首先,抓包系统必须绕过操作系统的协议来访问在网络上传输的原始数据包,这就要求一部分运行在操作系统核心内部,直接与网络接口驱动交互。这个部分是系统依赖的,在Winpcap的解决方案里它被认为是一个设备驱动,称作NPF。其次,抓包系统必须有用户级的程序接口,通过这些接口,用户程序可以利用内核驱动提供的高级特性。Winpcap提供了两个不同的库:packet.dll和wpcap.dll。前者提供了一个底层API,伴随着一个独立于Microsoft操作系统的编程接口,这些API可以直接用来访问驱动的函数;后者导出了一组更强大的与libpcap一致的高层抓包函数库。这些函数使得数据包的捕获以一种与网络硬件和操作系统无关的方式进行。3 程序代码设计步骤 根据流量设计程序的主要功能,相应的算法如下: 取得当前网络设备列表; 将用户选择的网卡以混杂模式打开,以接收到所有的数据包; 设置过滤器; 捕获IP数据包的源地址进行统计(用链表结构进行实现)。 获取网卡列表是为了得到网卡的相关信息,以便于用户进行选择,选取Ethermet网卡是用户所选择的网卡类型,编译设置过滤器是为了编译并设置过滤器是为了只捕获网络数据流的某些数据,打开网卡既将网卡设置为混杂(统计)模式是为了接受所有经过网卡的数据包,包括不是发给本机的数据包,开始主循环以是否超时为判断条件,循环体内主要有捕获IP数据包、将IP包的源地址加入链表、条件判断,循环结束后输出链表内容,程序至此结束。 现将其每一步的具体步骤简述如下: 3.1取得网络适配器列表 //取得网络适配器列表步骤中,alldevs是pcap_if_it指针,指向链表头,errbuf是char类型数组,存储错误信息。 pcap_findalldevs(&alldevs,errbuf); cout<<”网络适配器列表:”<<’n’; for(d=alldevs;d;d=d->next) { cout<<++i<<“:” if(d->description) cout<<“" else cout<<”No description available!“<<'n'; } 3.2 指定要监听的网络适配器并打开 cout<<”输入要监听的网络适配器号:” for(d=alldevs,i=0;inext,i++); fp=pcap_open_live(d->name,65536,1,1000,errbuf);3.3 编译并设置过滤器 //编译过滤器,fp指向打开的网络适配器,fcode为编译完成后的过滤器存储地址,“tcp“给出了过滤条件,下一个参数表示是否被优化(0为false,1为true),最后一个参数给出了子网掩码。 pcap_compile(fp,&fcode,”tcp”,1,netmask) pcap_setfilter(fp,&fcode)3.4 设置网络适配器为统计模式 if(pcap_setmode(fp,MODE_STAT)<0) { cout<<”n设置网络适配器模式错误!n”; pcap_close(fp); } 3.5 开始主循环,调用回调函数显示网络流量统计信息 //pcap_loop由Winpcap库定义,对每个采集来的数据包都用ProcessPacket函数进行处理,fp指向打开的网络适配器 pcap_loop(fp,0,dispatcher_handler,(PUCHAR)&st_ts); pcap_close(fp);3.6 回调函数的实现 //对于捕获到的每一个数据包应用此回调函数 void dispatcher_handler(u_char *state,const struct pcap_pkthdr *header,const u_char *pkt_data) { struct timeval *old_ts=(struct timeval *)state; u_int delay; LARGE_INTEGER Bps,Pps; struct tm *ltime; char timestr[16]; time_t local_tv_sec; //计算距上一个数据包的时间延迟,以ms为单位 //这个值是从与一个数据包相关的时间戳中截获的delay=(header->ts.tv_sec-old_ts->tv_sec)*1000000-old_ts->tv_usec+header->ts.tv_usec; //获得每秒的比特数 Bps.QuadPart=(((*(LONGLONG*)(pkt_data+8))*8*1000000)/(delay)); //获得每秒的数据包数 Pps.QuadPart=(((*(LONGLONG*)(pkt_data))*1000000)/(delay)); //将时间戳转变位可读的标准格式 ltime=localtime(&header->ts.tv_sec); strftime(timestr,sizeof timestr,”%H:%M:%S“,ltime); //Print timestamp printf(”%s“,timestr); //Print the samples printf(”BPS=%I64u“,Bps.QuadPart); printf(”PPS=%I64un",Pps.QuadPart); //store current timestamp old_ts->tv_sec=header->ts.tv_sec; old_ts->tv_usec=header->ts.tv_usec; };4 结果及分析 安装好WinPcap软件,在VC++界面上点击工具->选项->目录。添加Include文件夹下的所有文件和Lib下的所有内容,调试完程序无误后,点击开始—>运行“cmd”进入目标文件夹Debug下运行EXE文件。此时程序会检测电脑系统中的网卡,等待程序的运行结果.图 捕获的IP地址和数据包的信息 常见问题及解决方法 在刚开始做此课程设计的时候我只编写了主程序代码,并没有建立工程,后来通过查找资料及文献才知道要建立一个C++应用工程,而且程序中用到的Winpcap库文件C++中并没有,需要自己下载WinPcap_4_1_1.exe和WpdPack_4_1_1.zip,前者是Winpcap的开发程序,后者是inlude文件和lib文件,这些都是需要自己手动添加的,这里include和lib文件夹里的东西VC++6.0里面没有,出现error: Cannot open include file:’pcap.h’:No such file or directory这个问题,就需要添加。具体步骤如下: 第一步: 点菜单栏上的“工具“,再点击下拉菜单中的”选项“对话框把winpcap开发包里面的lib文件添加进去。 第二步: 点击菜单栏里的工程——设置,选择连接在对象/库模块中输入wpcap.lib和packet.lib,再点C/C++ 在“预处理程序定义”下输入WPCAP和HAVE_REMOTE,要用逗号隔开。 至此,Winpcap环境已部署好了不会再出错了。 接下来出错的是程序中的一些函数的参数,比如说int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str,int optimize, bpf_u_int32 netmask),int pcap_setfilter(pcap_t *p, struct bpf_program *fp)函数的参数在程序编译的时候会报错,通过搜集资料及与同学交流初步更正了错误,但是程序并不是很顺利地运行出来。第二篇:中南大学 课程设计实践报告
第三篇:计算机网络课程设计
第四篇:计算机网络课程设计
第五篇:计算机网络课程设计