tcpip实验报告.docx
《tcpip实验报告.docx》由会员分享,可在线阅读,更多相关《tcpip实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
tcpip实验报告
北京工业大学
计算机学院
实验报告
课程名称TCP\IP协议分析
学号
姓名
网络协议分析实验
一、实验目的
通过使用协议分析软件,对通信系统的通信过程进行监控、分析,以了解通信协议的工作过程。
二、实验内容
利用协议分析软件(如:
Wireshark)跟踪局域网报文(如条件允许也可跟踪多种局域网协议报文),实验内容如下:
将安装协议分析软件的PC接入以太网中,跟踪PC之间的报文,并存入文件以备重新查。
设置过滤器过滤网络报文以检测特定数据流。
利用协议分析软件的统计工具显示网络报文的各种统计信息。
三、实验步骤
1、在PC中安装协议分析软件(如:
Wireshark)。
具体安装过程详见附录:
Wireshark用户指南。
2、启动Wireshark协议分析软件,选择抓包菜单项启动实时监视器,开始实时跟踪显示网络数据报文。
可根据系统提示修改显示方式,详见附录:
Wireshark用户指南。
3、调出跟踪存储的历史报文,选择有代表性的ETHERNET,IEEE802.3,IP,ICMP,TCP,UDP报文,对照有关协议逐个分析报文各字段的含义及内容。
EHERNET报文格式
DSTADDR
SRCADDR
TYPE
INFO
6字节
6字节
2字节
最大长度1518字节
IEEE802.3报文格式
DSTADDR
SRCADDR
LEN
DSAP
SSAP
CONTROL
INFO
6字节
6字节
2字节
1字节
1字节
1/2字节
信息
最大长度1518字节
IP报文格式
VERSION
IHL
TOS
TOTAL LENGTN
IDENTIFICATION
FLAGS
FRAGMENT OFFSET
TTL
PROTOWT
HEADER CHECLCSUM
SOWRCE ADDRESS
DRSTINWTION ADDRESS
OPTIONS
PADDING
INFO
4、设置过滤器属性,如目的地址,源地址,协议类型等。
如过滤不需要的网络报文,过滤器允许设置第二层,第三层或第四层的协议字段。
过滤器有两种工作方式:
1)捕获前过滤:
协议分析软件用过滤器匹配网络上的数据报文,仅当匹配通过时才捕获报文。
2)捕获后过滤:
协议分析软件捕获所有报文,但仅显示匹配符合过滤条件的报文。
选择统计菜单项可以显示网络中各种流量的统计信息,如:
关于字节数,广播中报文数,出错数等。
UDP客户/服务器实验
一、实验目的
本实验目的是使用因特网提供的UDP传输协议,实现一个简单的UDP客户/服务器程序,以了解传输层所提供的UDP服务的特点,应用层和传输层之间的软件接口风格,熟悉socket机制和UDP客户端/服务器方式程序的结构。
二、实验内容
本实验为UDP客户/服务器实验。
实验内容:
UDPecho客户/服务器程序的设计与实现。
UDPecho客户/服务器程序完成以下功能:
客户从标准输入读一行文本,写到服务器上;服务器从网络输入读取此行,并回射(echo)给客户;客户读此回射行,并将其写到标准输出。
三、实验步骤
1、总体设计
客户程序从标准输入读一行文本,写到服务器程序上;服务器程序从网络输入读取此行,并回射给客户程序;客户程序读此回射行,并将其写到标准输出。
2、详细设计
1)服务器main函数
2)服务器str_echo函数
3)客户main函数
4)客户str_echo函数
Serv
#include
#include
#include
#include
#include
#defineMAXLINE4096
#defineLISTENQ1024/*2ndargumenttolisten()*/
#defineSERV_PORT9877
#defineSAstructsockaddr
staticintsockfd;
voiddg_echo(int,SA*,socklen_t);
int
main(intargc,char**argv)
{
structsockaddr_inservaddr,cliaddr;
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){
printf("socketerror.\n");
exit
(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
bind(sockfd,(SA*)&servaddr,sizeof(servaddr));
dg_echo(sockfd,(SA*)&cliaddr,sizeof(cliaddr));
}
void
dg_echo(intsockfd,SA*pcliaddr,socklen_tclilen)
{
intn;
socklen_tlen;
charmesg[MAXLINE];
for(;;){
len=clilen;
n=recvfrom(sockfd,mesg,MAXLINE,0,pcliaddr,&len);
sendto(sockfd,mesg,n,0,pcliaddr,len);
}
}
Cli
#include
#include
#include
#include
#include
#defineMAXLINE4096
#defineLISTENQ1024/*2ndargumenttolisten()*/
#defineSERV_PORT9877
#defineSAstructsockaddr
voiddg_cli(FILE*,int,constSA*,socklen_t);
main(intargc,char**argv)
{
intsockfd;
structsockaddr_inservaddr;
if(argc!
=2){
printf("usage:
udpcli01sigio\n");
exit
(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){
printf("socketerror.\n");
exit
(1);
}
dg_cli(stdin,sockfd,(SA*)&servaddr,sizeof(servaddr));
exit(0);
}
void
dg_cli(FILE*fp,intsockfd,constSA*pservaddr,socklen_tservlen)
{
intn;
charsendline[MAXLINE],recvline[MAXLINE+1];
while(fgets(sendline,MAXLINE,fp)!
=NULL){
sendto(sockfd,sendline,strlen(sendline),0,pservaddr,servlen);
n=recvfrom(sockfd,recvline,MAXLINE,0,NULL,NULL);
recvline[n]=0;/*nullterminate*/
fputs(recvline,stdout);
}
}
TCP客户/服务器实验
四、实验目的
本实验目的是使用因特网提供的TCP传输协议,实现一个简单的TCP客户/服务器程序,以了解传输层所提供的TCP服务的特点,应用层和传输层之间的软件接口风格,熟悉socket机制和TCP客户端/服务器方式程序的结构。
五、实验内容
本实验为TCP客户/服务器实验。
实验内容:
TCPecho客户/服务器设计与实现。
TCPecho客户/服务器程序完成以下功能:
客户从标准输入读一行文本,写到服务器上;服务器从网络输入读取此行,并回射(echo)给客户;客户读此回射行,并将其写到标准输出。
六、实验步骤
1、总体设计
客户程序从标准输入读一行文本,写到服务器程序上;服务器程序从网络输入读取此行,并回射给客户程序;客户程序读此回射行,并将其写到标准输出。
2、详细设计
1)服务器main函数
2)服务器str_echo函数
3)客户main函数
4)客户str_echo函数
Serv
#include
#include
#include
#include
#include
#defineMAXLINE4096
#defineLISTENQ1024/*2ndargumenttolisten()*/
#defineSERV_PORT9877
#defineSAstructsockaddr
voidstr_echo(int);
ssize_treadline(int,void*,size_t);
staticssize_tmy_read(int,char*);
int
main(intargc,char**argv)
{
intlistenfd,connfd;
pid_tchildpid;
socklen_tclilen;
structsockaddr_incliaddr,servaddr;
if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0){
printf("socketerror.\n");
exit
(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
if(bind(listenfd,(SA*)&servaddr,sizeof(servaddr))<0){
printf("binderror.\n");
exit
(1);
}
if(listen(listenfd,LISTENQ)<0){
printf("listenerror.\n");
exit
(1);
}
for(;;){
clilen=sizeof(cliaddr);
if((connfd=accept(listenfd,(SA*)&cliaddr,&clilen))<0){
printf("accepterror.\n");
exit
(1);
}
if((childpid=fork())==0){
close(listenfd);
str_echo(connfd);
exit(0);
}
close(connfd);
}
}
void
str_echo(intsockfd)
{
ssize_tn;
charline[MAXLINE];
for(;;){
if((n=readline(sockfd,line,MAXLINE))==0)
return;/*connectionclosedbyotherend*/
write(sockfd,line,n);
}
}
/*endstr_echo*/
ssize_t
readline(intfd,void*vptr,size_tmaxlen)
{
intn,rc;
charc,*ptr;
ptr=vptr;
for(n=1;nif((rc=my_read(fd,&c))==1){
*ptr++=c;
if(c=='\n')
break;/*newlineisstored,likefgets()*/
}elseif(rc==0){
if(n==1)
return(0);/*EOF,nodataread*/
else
break;/*EOF,somedatawasread*/
}else
return(-1);/*error,errnosetbyread()*/
}
*ptr=0;/*nullterminatelikefgets()*/
return(n);
}
/*endreadline*/
staticssize_t
my_read(intfd,char*ptr)
{
staticintread_cnt=0;
staticchar*read_ptr;
staticcharread_buf[MAXLINE];
if(read_cnt<=0){
again:
if((read_cnt=read(fd,read_buf,sizeof(read_buf)))<0){
if(errno==EINTR)
gotoagain;
return(-1);
}elseif(read_cnt==0)
return(0);
read_ptr=read_buf;
}
read_cnt--;
*ptr=*read_ptr++;
return
(1);
}
/*endssize_t*/
Cli
#include
#include
#include
#include
#include
#defineMAXLINE4096
#defineLISTENQ1024/*2ndargumenttolisten()*/
#defineSERV_PORT9877
#defineSAstructsockaddr
voidstr_cli(FILE*,int);
ssize_treadline(int,void*,size_t);
staticssize_tmy_read(int,char*);
int
main(intargc,char**argv)
{
intsockfd;
structsockaddr_inservaddr;
if(argc!
=2){
printf("usage:
tcpcli01");
exit
(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
printf("socketerror.\n");
exit
(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
if(connect(sockfd,(SA*)&servaddr,sizeof(servaddr))<0){
printf("connecterror.\n");
exit
(1);
}
str_cli(stdin,sockfd);
exit(0);
}
void
str_cli(FILE*fp,intsockfd)
{
charsendline[MAXLINE],recvline[MAXLINE];
while(fgets(sendline,MAXLINE,fp)!
=NULL){
write(sockfd,sendline,strlen(sendline));
if(readline(sockfd,recvline,MAXLINE)==0){
printf("str_cli:
serverterminatedprematurely.\n");
exit
(1);
}
fputs(recvline,stdout);
}
}
/*endstr_cli*/
ssize_t
readline(intfd,void*vptr,size_tmaxlen)
{
intn,rc;
charc,*ptr;
ptr=vptr;
for(n=1;nif((rc=my_read(fd,&c))==1){
*ptr++=c;
if(c=='\n')
break;/*newlineisstored,likefgets()*/
}elseif(rc==0){
if(n==1)
return(0);/*EOF,nodataread*/
else
break;/*EOF,somedatawasread*/
}else
return(-1);/*error,errnosetbyread()*/
}
*ptr=0;/*nullterminatelikefgets()*/
return(n);
}
/*endreadline*/
staticssize_t
my_read(intfd,char*ptr)
{
staticintread_cnt=0;
staticchar*read_ptr;
staticcharread_buf[MAXLINE];
if(read_cnt<=0){
again:
if((read_cnt=read(fd,read_buf,sizeof(read_buf)))<0){
if(errno==EINTR)
gotoagain;
return(-1);
}elseif(read_cnt==0)
return(0);
read_ptr=read_buf;
}
read_cnt--;
*ptr=*read_ptr++;
return
(1);
}
/*endssize_t*/
总结:
实验对于我们来说是很重要的,经过这几次实验,我已经大致了解了TCP/IP的工作原理,知道了要想实验客户机和服务器的连连通,具体的步骤是什么。
在试验中我们组遇到了很大的困难,几乎每一个步骤都会遇到很多问题,不多最后还是凭借大家的力量一一克服了,感谢老师对我们的帮助。