计算机网络课程设计

发布时间:2016-04-07 19:16:24

计算机网络课程设计

计算机科学与技术

101030111

2

指导老师 鲁丽 廖剑锋

2016 3.17

目录

一、课程的性质、目的和任务 3

二、课程内容和基本要求 3

(一)、协议包的分析,网络协议的组成 3

1 捕获ARP请求,ARP应答数据包 3

2 捕获ICMP数据包,对其进行分析研究 4

3 捕获TCP“三次握手”“2次两次握手”释放连接数据包 6

4 捕获HTTPDNSDHCP数据包,分析其构成 11

5 通过捕捉smtp协议包捕捉邮箱密码. 15

小结 15

(二)、数据包的分析程序 16

程序代码: 16

编译运行 21

三)、机架实验 22

小结 22

(四) 模拟学校校园网 23

校园网拓扑图 23

网络测试 24

小结 26

一、课程的性质、目的和任务

该课程为实践类课程。通过本课程,(1)学生需要深入理解网络协议的组成,对网络中传输数据的过程有更深入的认识。(2)学生需要了解计算机网络工程设计的一般任务,明确计算机网络设计与建设的基本原则,熟悉计算机网络需求分析的目标、任务与方法,掌握计算机网络设计的通用方法,并学会撰写规范的计算机网络方案书。

、课程内容和基本要求

(一)、协议包的分析,网络协议的组成

1、 捕获ARP请求,ARP应答数据包,分析其组成特征。总结ARP协议运行的基本过程。

本机(192.168.84.69ping目的主机(192.168.84.39):

抓包截图:

本机192.168.84.69 MAC地址 c8:9c:dc:59:39:30

目的主机 192.168.84.39 目的MAC地址 c8:9c:dc:5a:2b:57

ARP协议运行过程:ARP进程在本局域网上发送ARP请求,目的主机在ARP请求分组里看到自己的IP,就发送一个响应分组,写入自己的硬件地址。

2、 捕获ICMP数据包,对其进行分析研究。(icmp请求数据包,icmp应答数据包)

Ping mail.sina.com.cn进行ICMP数据包截获

ICMP请求数据包:

TYPE:8

CODE:0

CHECKSUM :0X225C

ICMP应答数据包:

TYPE:0

CODE:0

CHECKSUM :0X2A5C

ICMP协议数据包对IP分组在传送时出现的异常情况进行报告,对IP报文传输时出现的差错、拥塞、路由改变、以及路由器或主机信息的获取等情况,向源端主机提交报告,由源主机采取相应措施,改进传输质量。

3、 捕获TCP“三次握手”建立连接的数据包并分析;捕获TCP2次两次握手”释放连接的数据包并分析。

a) tcp连接的建立

第一次握手

第二次握手

第三次握手

Seq=0;

第一次握手:本地向目的主机发送连接请求,等待服务器确认。

Seq=0,ack=1;

第二次握手:目的主机确认本机的连接请求,建立正向连接,同时发送反向连接请求。

Seq=1,ack=1;

第三次握手:本机响应目的主机的连接请求,建立反向连接。

完成三次握手,本机与目的主机开始通信。

b) tcp连接的释放

Seq=3769,ack=855,win=7552,len=0;

第一步:目的主机对本机发出释放连接请求,结束数据传送

Seq=855,ack=3770,win=64647,len=0;

第二步:本机对目的主机释放反向连接

Seq=855,ack=3770,win=64647,len=0;

第三步:本机对目的主机发出释放请求

Seq=3770,ack=856,win=7552,len=0;

第四步:目的主机确认本机的请求,释放正向连接

4、 捕获HTTPDNSDHCP数据包,分析其构成。

a) http数据包的捕获与分析

通过访问http://www.baidu.com进行抓包

http请求报文

Request methodget

Request versionhttp/1.1

Refererhttp://www.baidu.com/\r\n

http响应报文

Request versionhttp/1.1

Response pharseok

Serversuggestion.baidu.zbb.df\r\n

http协议定义了浏览器怎样向万维网服务器请求万维网文档,以及怎样把文档传送给浏览器。

b) DNS数据包的捕获与分析

www.baidu.com为例抓包:

源地址:192.168.84.18

Mac地址:c8:9c:dc:50:02:7b

域名到IP地址的解析过程:

当某一个进程需要把主机名解析为IP地址时,该应用进程就调用解析程序,并成为DNS的客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用进程得到目的主机的IP地址后即可进行通信。

c) DHCP数据包的捕获与分析

Discover数据包

Discover数据包含了客户机的信息:客户端硬件地址类型,物理地址,客户机的计算机名;包含了要请求信息的内容:子网掩码、DNS服务器、网关、netbios名字服务器等。

络中的DHCP服务器收到discover数据包后,会回复一个offer数据包,内容如下:

由数据包内容可以看出DHCP服务器提供了一个IP地址及相关的地址信息。客户机不能直接使用这个IP地址,还需向服务器发送一个request请求数据包。

Request数据包

DHCP服务器发送request数据包请求使用IP地址。如果被请求的IP地址没有被占用,此时DHCP服务器允许客户端使用该IP地址,并提供子网掩码、DNS服务器、网关等信息。

Ack数据包

至此,客户端从DHCP服务器获取了IP地址。

5、 通过捕捉smtp协议包捕捉邮箱密码.

从电脑终端进行访问:(网页上访问捕获不到)

小结

协议数据包里面包含了很多信息,一开始做的时候都不知道要怎么找我需要的数据包,数据包里面的各种信息、符号也不知道什么意思,后来问同学,上网查资料才知道怎么找需要的关键信息。我觉得抓包是一件有趣的事情,我们通过向服务器发送请求报文,然后对应的服务器收到请求再发送一个应答报文,通过对数据包的截获,进行分析,让我对各个协议的基本工作过程,原理有了一些认识,对网络中数据传送的过程也有所了解。

)、 数据包的分析程序

程序代码:

#include

#include

#include

#include

#include

#include

#include

#define MAX_HOSTNAME_LAN 255

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

#define MAX_ADDR_LEN 16

#pragma comment(lib,"WS2_32.lib")

typedef struct tcpheader

{

unsigned short int sport; //source address

unsigned short int dport; //destination address

unsigned int th_seq; //sequence number

unsigned int th_ack; //acknowledge number

unsigned char th_x2:4; //header length

unsigned char th_off:4; //reserved

unsigned char th_flag; //flags: URG ACK PSH RST SYN FIN

unsigned short int th_win; //window size

unsigned short int th_sum; //check sum

unsigned short int th_urp; //urgent pointer

}TCP_HDR;

struct ipheader

{

unsigned char h_lenver; //version & header length

unsigned char ip_tos; //tos

unsigned short int ip_len; //total length

unsigned short int ip_id; //id

unsigned short int ip_off; //offset

unsigned char ip_ttl; //time to live

unsigned char ip_p; //protocal

unsigned short int ip_sum; //check sum

unsigned int ip_src; //source address

unsigned int ip_dst; //destination address

}IP_HDR;

typedef struct udphdr

{

unsigned short sport; //source port

unsigned short dport; //destination port

unsigned short len; //UDP length

unsigned short cksum; //check sum(include data)

} UDP_HDR;

typedef struct icmphdr

{

unsigned short sport;

unsigned short dport;

BYTE i_type;

BYTE i_code;

USHORT i_cksum;

USHORT i_id;

USHORT i_seq;

ULONG timestamp;

}ICMP_HDR;

void main()

{

SOCKET sock;

WSADATA wsd;

char RecvBuf[65535] = {0};

char entity_content[65535]={0};

char temp[65535]= {0};

DWORD dwBytesRet;

int pCount=0;

unsigned int optval = 1; //the pointer , which shows us the payload begin

unsigned char *dataip=NULL;

unsigned char *datatcp=NULL; //the pointer , which shows us the payload begin

unsigned char *dataudp=NULL;

unsigned char *dataicmp=NULL;

int lentcp=0, lenudp,lenicmp,lenip;

int k;

char TcpFlag[6]={'F','S','R','P','A','U'}; //定义TCP的标志位

WSAStartup(MAKEWORD(2,1),&wsd);

if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP))==SOCKET_ERROR)

{

exit(0);

}

char FAR name[MAX_HOSTNAME_LAN];

gethostname(name, MAX_HOSTNAME_LAN);

struct hostent FAR * pHostent;

pHostent = (struct hostent * )malloc(sizeof(struct hostent));

pHostent = gethostbyname(name);

SOCKADDR_IN sa;

sa.sin_family = AF_INET;

sa.sin_port = htons(6000);

memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);

bind(sock, (SOCKADDR *)&sa, sizeof(sa));

//if you don't have raw socket support (win 95/98/me/win2kuser) it calls the exit(1) function

if ((WSAGetLastError())==10013)

exit(0);

WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);

struct udphdr *pUdpheader;

struct ipheader *pIpheader;

struct tcpheader *pTcpheader;

struct icmphdr *pIcmpheader;

char szSourceIP[MAX_ADDR_LEN], szDestIP[MAX_ADDR_LEN];

SOCKADDR_IN saSource, saDest;

pIpheader = (struct ipheader *)RecvBuf;

pTcpheader = (struct tcpheader *)(RecvBuf+ sizeof(struct ipheader ));

pUdpheader = (struct udphdr *) (RecvBuf+ sizeof(struct ipheader ));

pIcmpheader = (struct icmphdr *) (RecvBuf+ sizeof(struct ipheader ));

int iIphLen = sizeof(unsigned long) * ( pIpheader->h_lenver & 0x0f );

while (1)

{

memset(RecvBuf, 0, sizeof(RecvBuf));

recv(sock, RecvBuf, sizeof(RecvBuf), 0);

saSource.sin_addr.s_addr = pIpheader->ip_src;

strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);

//Check Dest IP

saDest.sin_addr.s_addr = pIpheader->ip_dst;

strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);

lenip=ntohs(pIpheader->ip_len);

lentcp =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct tcpheader)));

lenudp =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct udphdr)));

lenicmp =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct icmphdr)));

if((pIpheader->ip_p)==IPPROTO_TCP&&lentcp!=0)

{

pCount++;

dataip=(unsigned char *) RecvBuf;

datatcp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct tcpheader); //data

entity_content[65535]=*datatcp;

printf("\n###################数据包[%i]=%d字节数据###################",pCount,lentcp);

printf("\n*******************IP协议头部*********************\n");

printf("标识:%i\n",ntohs(pIpheader->ip_id));

printf("总长度:%i\n",ntohs(pIpheader->ip_len));

printf("偏移量:%i\n",ntohs(pIpheader->ip_off));

printf("生存时间:%d\n",pIpheader->ip_ttl);

printf("服务类型:%d\n",pIpheader->ip_tos);

printf("协议类型:%d\n",pIpheader->ip_p);

printf("检验和:%i\n",ntohs(pIpheader->ip_sum));

printf("IP地址:%s ",szSourceIP);

printf("\n目的IP地址:%s ",szDestIP);

printf("\n****************TCP协议头部******************\n");

printf("源端口:%i\n",ntohs(pTcpheader->sport));

printf("目的端口:%i\n",ntohs(pTcpheader->dport));

printf("序列号:%i\n",ntohs(pTcpheader->th_seq));

printf("应答号:%i\n",ntohs(pTcpheader->th_ack));

printf("检验和:%i\n",ntohs(pTcpheader->th_sum));

printf("标志位:");

unsigned char FlagMask = 1;

int t=0,j,p=0,i5=0;

int lenhttp=0;

//print flags

for( k=0; k<6; k++ )

{

if((pTcpheader->th_flag) & FlagMask)

printf("%c",TcpFlag[k]);

else

printf(" ");

FlagMask=FlagMask<<1;

}

if(ntohs(pTcpheader->sport)==80||ntohs(pTcpheader->dport)==80)

for(j=0;j

{

if( *(datatcp+j)==0x0d&&*(datatcp+j+1)==0x0a&&*(datatcp+j+2)==0x0d&&*(datatcp+j+3)==0x0a)

{

lenhttp=j;

printf("\n****************HTTP协议******************\n");

printf("HTTP头部长度:%d\n",lenhttp);

break;

}

}

for(k=0;k

{

if( *(datatcp+k)==0x42&&*(datatcp+k+1)==0x69&&*(datatcp+k+2)==0x74&&*(datatcp+k+3)==0x54&&*(datatcp+k+4)==0x6f&&*(datatcp+k+5)==0x72&&*(datatcp+k+6)==0x72&&*(datatcp+k+7)==0x65&&*(datatcp+k+8)==0x6e)

printf("\n****************BitTorrent******************\n");

}

for(int i3=0;i3

{

if(*(datatcp+i3)!=0x0d&&*(datatcp+i3+1)!=0x0a)

printf("%c",*(datatcp+i3));

else

printf("\n");

}

}

}

}

(三)、机架实验

小结

对照着实验手册上的实验要求和配置代码操作,就是做一些路由配置,过程比较简单,就是做的时候不知道是人太多还是网络问题,总是被挤掉,所以也没截图,后来可能密码被别的同学改了,没法做了。

(4)以文华学院为背景,了解文华学院现有校园网络的构成。主要从网速提高,网络安全,无线网络构建等几个方面进行分析,并提出合理的改进意见

校园网拓扑图:

网络测试:

ftp服务器上ping网关和www服务器,均能ping通:

在行政楼主机中ping服务器中的wwwdhcp可以ping

内网互相可以ping通,在www服务器上ping 192.10.10.1

dhcp上访问外网服务器:

测试FTP服务:

www服务器测试:

客户机PC0访问内网服务器www.lzz.com:

小结

这部分内容也是照着老师给的校园网样本做的,先把拓扑图做出来,再配各个路由器、交换机、服务器、客户机,就基本做好了。我配置前面的都还算顺利,某一步粗心弄错了也马上就找到原因解决了,测试都能ping通,但是做到最后配置无线路由的时候出了点问题,我一开始把客户机到无线路由的端口弄成了Ethernet,导致客户机ping内网ping不通,把端口改过来,换成Internet后发现还是ping不通,又仔细检查了半天才发现是vlan的问题,把无线路由的vlan改成vlan7就可以ping通了。

模拟校园网的过程还是蛮有意思的,通过自己动手做拓扑图,配置网络设置,能够让我们对学校的网络结构有一定的了解,也能让我们学会怎么配置路由器、交换机等基本的操作。只有自己动手做了才能知道自己哪些地方会做,哪些地方还需要学习和加强。

计算机网络课程设计

相关推荐