第一篇:網(wǎng)絡(luò)原理實(shí)驗(yàn)報(bào)告網(wǎng)絡(luò)層
蘇州科技學(xué)院
電子信息實(shí)驗(yàn)中心
實(shí)驗(yàn)報(bào)告
課
程 學(xué)
號(hào) 姓
名 班
級(jí) 專
業(yè) 指導(dǎo)教師 學(xué)年 / 學(xué)期
計(jì)算機(jī)網(wǎng)絡(luò)原理 *** 閆自立 軟件1311 計(jì)算機(jī)科學(xué)與技術(shù)
陶滔
2015~2016學(xué)年第1學(xué)期
實(shí)驗(yàn)三
網(wǎng)絡(luò)層實(shí)驗(yàn)
實(shí)驗(yàn)項(xiàng)目性質(zhì):設(shè)計(jì)性
計(jì)劃學(xué)時(shí):4 實(shí)
驗(yàn) 環(huán) 境:Microsoft Visual Studio 2010
實(shí)驗(yàn)日期:2015年12月2日
一、實(shí)驗(yàn)?zāi)康?/p>
1.理解通信子網(wǎng)的完整概念,掌握網(wǎng)絡(luò)層的作用和功能。2.掌握分組數(shù)據(jù)包格式設(shè)計(jì)方法、分組的分片與重裝的方法。3.掌握網(wǎng)絡(luò)層簡(jiǎn)單路由選擇協(xié)議的實(shí)現(xiàn)方法。
二、實(shí)驗(yàn)內(nèi)容
在已經(jīng)實(shí)現(xiàn)的數(shù)據(jù)鏈路層基礎(chǔ)上:
(1)設(shè)計(jì)簡(jiǎn)易實(shí)用的分組數(shù)據(jù)包格式;
(2)設(shè)計(jì)并實(shí)現(xiàn)類IP的網(wǎng)絡(luò)層協(xié)議,路由選擇采用靜態(tài)路選擇協(xié)議。(3)設(shè)計(jì)并實(shí)現(xiàn)分組的分片與重裝。
(4)設(shè)計(jì)一個(gè)應(yīng)用程序,利用網(wǎng)絡(luò)層的功能直接將文件傳輸?shù)侥繕?biāo)主機(jī)的接收窗口中。(5)編寫路由配置route_tab.cfg及本機(jī)主機(jī)地址local.cfg文件,以便與遠(yuǎn)地的其他計(jì)算機(jī)進(jìn)行通信。
三、實(shí)驗(yàn)(設(shè)計(jì))儀器設(shè)備和材料清單
計(jì)算機(jī)一臺(tái),串行電纜一根。
四、實(shí)驗(yàn)指導(dǎo)
本實(shí)驗(yàn)采用靜態(tài)路由選擇算法,每個(gè)結(jié)點(diǎn)上通過配置文件route_tab.cfg確定路由選擇的結(jié)果,該文件的格式可設(shè)計(jì)如下:
主機(jī)地址
端口號(hào)
注釋
555
#主機(jī)地址555的轉(zhuǎn)發(fā)端口號(hào)為COM1
556
558
888
*
#默認(rèn)路由
其中,端口號(hào)指PC的COM1(對(duì)應(yīng)端口號(hào)1)或COM2(對(duì)應(yīng)端口號(hào)2)等。同時(shí)為簡(jiǎn)化設(shè)計(jì),去掉流量控制和擁塞控制,數(shù)據(jù)包的格式參考IP數(shù)據(jù)包格式,但盡可能簡(jiǎn)化。分組及其他數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
網(wǎng)絡(luò)層的分組設(shè)計(jì)一方面要考慮到路由選擇的實(shí)現(xiàn),即分組中應(yīng)含有路由尋址所必要的信息,另一方面要考慮到分組太大時(shí)的分片與重裝,主機(jī)地址用4位數(shù)字字符表示。設(shè)計(jì)的分組格式如下。
(1)分組(“數(shù)據(jù)報(bào)”)的首部
typedef struct{ //定義數(shù)據(jù)報(bào)首部格式
unsigned char
vers_hlen;
//高4位是版本, 低4 位是首部長(zhǎng)度
unsigned char
type;
//類型(保留)
unsigned short
Dlen;
//數(shù)據(jù)報(bào)數(shù)據(jù)部分長(zhǎng)度
unsigned short ident;
//數(shù)據(jù)報(bào)標(biāo)識(shí)
unsigned short frag;
//分片標(biāo)識(shí),1-分片,0-不分片 unsigned short offset;
//數(shù)據(jù)報(bào)分片偏移量
unsigned char
TTL;
//生存期
unsigned char
prot[3];
//保留
unsigned short checksum;
//校驗(yàn)和
IPhost source;
//源主機(jī)地址
IPhost dest;
//目標(biāo)主機(jī)地址
} TIPheader;typedef struct { unsigned char cAddr[4];}IPhost;(2)數(shù)據(jù)報(bào)格式
typedef struct { unsigned char cData[MTU];} Msg;typedef struct{
//定義數(shù)據(jù)報(bào)格式
TIPheader
IpHdr;
//分組首部
Msg
Info;
//分組信息部分 } TPacket;(3)分片與重裝的結(jié)構(gòu)
typedef struct fid{
//用于識(shí)別同一IP 分組的各分片結(jié)構(gòu),用于組裝分組
IPhost
source;
//源主機(jī)地址
IPhost
dest;
//目標(biāo)主機(jī)地址
unsigned short
ident;
//IP分組標(biāo)識(shí)
long int iLength;
//已接收到的數(shù)據(jù)長(zhǎng)度
unsigned short iCount;//已接收到的分組數(shù) }FragId;typedef struct fragif{
//包含一個(gè)分片的結(jié)構(gòu)
unsigned char frgData[MTU];//分片的數(shù)據(jù)部分
unsigned short iMsgLength;
//當(dāng)前分片數(shù)據(jù)部分的長(zhǎng)度 unsigned short frag;
//分片標(biāo)識(shí),1-分片,0-不分片
unsigned short offset;
//分片在數(shù)據(jù)報(bào)中的偏移量
struct fragif *next;
//下一個(gè)分片 }FragInfo;(4)路由表結(jié)構(gòu)
typedef struct { //定義路由表
unsigned char cHostAddr[4];//主機(jī)地址 char cPort;
//轉(zhuǎn)發(fā)端口
char cComment[30];
//注釋 } TRouteItem;2 分片與重裝
在一個(gè)異構(gòu)的網(wǎng)絡(luò)的集合中,提供統(tǒng)一的主機(jī)到主機(jī)服務(wù)模型需要面對(duì)的問題之一是每種網(wǎng)絡(luò)技術(shù)都試圖自己定義分組的大小。例如,以太網(wǎng)能接收的長(zhǎng)度最多為1500字節(jié)的分組,而FDDI能夠接收的分組長(zhǎng)度可達(dá)到4500字節(jié)。因此網(wǎng)絡(luò)層要確保所有的分組足夠小,使得其適合任何網(wǎng)絡(luò)技術(shù)的分組;或者當(dāng)分組對(duì)某一網(wǎng)絡(luò)技術(shù)來說太大時(shí),提供一種方法將分組拆分和重組。后一種方法是一種理想的選擇,TCP/IP中的IP數(shù)據(jù)報(bào)傳輸就采用了后一種技術(shù)。
這樣每一種網(wǎng)絡(luò)類型有一個(gè)最大傳輸單元(Maximum Transmission Unit,MTU),這是一幀中所能攜帶的最大數(shù)據(jù)報(bào),而這個(gè)值應(yīng)比網(wǎng)絡(luò)上的最大分組要小。
五、結(jié)果分析(可根據(jù)需要附加頁(yè))
六、主要源代碼(可根據(jù)需要附加頁(yè))#pragma hdrstop #include
#include “..includeNllEntity.h” #include “..includeFtpClass.h” //-------------#pragma package(smart_init)//---------void TNLLNetEntity::readroute(){
#define MAXITEMS 100
// 路由表最大表項(xiàng)數(shù)
#define MAXLINE 81
// 路由表文件最大行長(zhǎng)度
char fileName[]=“.route_tab.cfg”;
if(fst.fail())return;fst.getline(line,MAXLINE);while(!fst.fail()&&!fst.eof())// 當(dāng)文件有內(nèi)容時(shí) {
} iRouteEntries=i;if(iRouteEntries){
routeTab=new TRouteItem[iRouteEntries];for(i=0;i