1、tcpip实验报告北京工业大学计算机学院实验报告 课程名称 TCPIP协议分析 学 号 姓 名 网络协议分析实验一、实验目的通过使用协议分析软件,对通信系统的通信过程进行监控、分析,以了解通信协议的工作过程。二、实验内容利用协议分析软件(如:Wireshark)跟踪局域网报文(如条件允许也可跟踪多种局域网协议报文),实验内容如下:将安装协议分析软件的PC接入以太网中,跟踪PC之间的报文,并存入文件以备重新查。设置过滤器过滤网络报文以检测特定数据流。利用协议分析软件的统计工具显示网络报文的各种统计信息。三、实验步骤1、在P中安装协议分析软件(如:Wireshark)。具体安装过程详见附录:Wir
2、eshark用户指南。2、启动Wireshark协议分析软件,选择抓包菜单项启动实时监视器,开始实时跟踪显示网络数据报文。可根据系统提示修改显示方式,详见附录:Wireshark用户指南。3、调出跟踪存储的历史报文,选择有代表性的ETHERNET,IEEE802.3,IP,ICMP,TCP,UDP报文,对照有关协议逐个分析报文各字段的含义及内容。EHERNET报文格式 DSTADDRSRCADDRTYPEINFO6字节6字节2字节最大长度1518字节IEEE802.3报文格式DSTADDRSRCADDRLENDSAPSSAPCONTROL INFO6字节6字节2字节1字节1字节1/2字节信息最
3、大长度1518字节IP报文格式VERSIONIHLTOSTOTALLENGTNIDENTIFICATIONFLAGSFRAGMENTOFFSETTTLPROTOWTHEADERCHECLCSUMSOWRCEADDRESSDRSTINWTIONADDRESSOPTIONSPADDINGINFO4、设置过滤器属性,如目的地址,源地址,协议类型等。如过滤不需要的网络报文,过滤器允许设置第二层,第三层或第四层的协议字段。过滤器有两种工作方式:1)捕获前过滤:协议分析软件用过滤器匹配网络上的数据报文,仅当匹配通过时才捕获报文。2)捕获后过滤:协议分析软件捕获所有报文,但仅显示匹配符合过滤条件的报文。选择
4、统计菜单项可以显示网络中各种流量的统计信息,如:关于字节数,广播中报文数,出错数等。UDP客户/服务器实验一、 实验目的本实验目的是使用因特网提供的UDP传输协议,实现一个简单的UDP客户/服务器程序,以了解传输层所提供的UDP服务的特点,应用层和传输层之间的软件接口风格,熟悉socket机制和UDP客户端/服务器方式程序的结构。二、 实验内容本实验为UDP客户/服务器实验。实验内容:UDP echo客户/服务器程序的设计与实现。UDP echo客户/服务器程序完成以下功能:客户从标准输入读一行文本,写到服务器上;服务器从网络输入读取此行,并回射(echo)给客户;客户读此回射行,并将其写到标
5、准输出。三、 实验步骤1、 总体设计客户程序从标准输入读一行文本,写到服务器程序上;服务器程序从网络输入读取此行,并回射给客户程序;客户程序读此回射行,并将其写到标准输出。2、 详细设计1)服务器main函数2)服务器str_echo函数3)客户main函数4)客户str_echo函数Serv#include #include #include #include #include #define MAXLINE 4096#define LISTENQ 1024 /* 2nd argument to listen() */#define SERV_PORT 9877#define SA stru
6、ct sockaddrstatic int sockfd;void dg_echo(int, SA *, socklen_t);int main(int argc, char * argv) struct sockaddr_in servaddr, cliaddr; if(sockfd = socket(AF_INET, SOCK_DGRAM, 0)0) printf(socket error.n); exit(1); bzero(&servaddr, sizeof(servaddr); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_ad
7、dr = 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(int sockfd, SA *pcliaddr, socklen_t clilen) int n; socklen_t len; char mesgMAXLINE; for ( ; ; ) len = clilen; n = recvfrom(sockfd
8、, mesg, MAXLINE, 0, pcliaddr, &len); sendto(sockfd, mesg, n, 0, pcliaddr, len); Cli#include #include #include #include #include #define MAXLINE 4096#define LISTENQ 1024 /* 2nd argument to listen() */#define SERV_PORT 9877#define SA struct sockaddrvoid dg_cli(FILE *, int, const SA *, socklen_t);main(
9、int argc, char *argv) int sockfd; struct sockaddr_in servaddr; 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, argv1, &servaddr.sin_addr); if(sockfd = socket(AF_INET, SOC
10、K_DGRAM, 0)0) printf(socket error.n); exit(1); dg_cli(stdin, sockfd, (SA *)&servaddr, sizeof(servaddr); exit(0);voiddg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) int n; char sendlineMAXLINE, recvlineMAXLINE + 1; while (fgets(sendline, MAXLINE,fp) != NULL) sendto(sockfd, sendli
11、ne, strlen(sendline), 0, pservaddr, servlen); n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL); recvlinen = 0; /* null terminate */ fputs(recvline, stdout); TCP客户/服务器实验四、 实验目的本实验目的是使用因特网提供的TCP传输协议,实现一个简单的TCP客户/服务器程序,以了解传输层所提供的TCP服务的特点,应用层和传输层之间的软件接口风格,熟悉socket机制和TCP客户端/服务器方式程序的结构。五、 实验内容本实验为TC
12、P客户/服务器实验。实验内容:TCP echo客户/服务器设计与实现。TCP echo客户/服务器程序完成以下功能:客户从标准输入读一行文本,写到服务器上;服务器从网络输入读取此行,并回射(echo)给客户;客户读此回射行,并将其写到标准输出。六、 实验步骤1、 总体设计客户程序从标准输入读一行文本,写到服务器程序上;服务器程序从网络输入读取此行,并回射给客户程序;客户程序读此回射行,并将其写到标准输出。2、 详细设计1)服务器main函数2)服务器str_echo函数3)客户main函数4)客户str_echo函数Serv#include #include #include #include
13、 #include #define MAXLINE 4096#define LISTENQ 1024 /* 2nd argument to listen() */#define SERV_PORT 9877#define SA struct sockaddrvoid str_echo(int);ssize_t readline(int, void *, size_t);static ssize_t my_read(int, char *);intmain(int argc, char *argv) int listenfd, connfd; pid_t childpid; socklen_t
14、clilen; struct sockaddr_in cliaddr,servaddr; if (listenfd = socket(AF_INET, SOCK_STREAM, 0) 0) printf(socket error.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
15、 *)&servaddr, sizeof(servaddr) 0) printf(bind error.n); exit(1); if (listen(listenfd,LISTENQ) 0) printf(listen error.n); exit(1); for( ; ;) clilen = sizeof(cliaddr); if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen) 0) printf(accept error.n); exit(1); if(childpid = fork() = 0) close(listenfd
16、) ; str_echo(connfd); exit(0); close(connfd); voidstr_echo(int sockfd) ssize_t n; char lineMAXLINE; for ( ; ; ) if ( (n = readline(sockfd, line, MAXLINE) = 0) return; /* connection closed by other end */ write(sockfd, line, n); /*end str_echo*/ssize_treadline(int fd, void *vptr, size_t maxlen) int n
17、, rc; char c, *ptr; ptr = vptr; for (n = 1; n maxlen; n+) if ( (rc = my_read(fd, &c) = 1) *ptr+ = c; if (c = n) break; /* newline is stored, like fgets() */ else if (rc = 0) if (n = 1) return(0); /* EOF, no data read */ else break; /* EOF, some data was read */ else return(-1); /* error, errno set b
18、y read() */ *ptr = 0; /* null terminate like fgets() */ return(n);/* end readline */static ssize_tmy_read(int fd, char *ptr) static int read_cnt = 0; static char *read_ptr; static char read_bufMAXLINE; if (read_cnt = 0) again: if ( (read_cnt = read(fd, read_buf, sizeof(read_buf) 0) if (errno = EINTR
19、) goto again; return(-1); else if (read_cnt = 0) return(0); read_ptr = read_buf; read_cnt-; *ptr = *read_ptr+; return(1);/*end ssize_t*/Cli#include #include #include #include #include #define MAXLINE 4096#define LISTENQ 1024 /* 2nd argument to listen() */#define SERV_PORT 9877#define SA struct socka
20、ddrvoid str_cli(FILE *,int);ssize_t readline(int, void *, size_t);static ssize_t my_read(int, char *);intmain(int argc, char *argv) int sockfd; struct sockaddr_in servaddr; if (argc != 2) printf(usage:tcpcli01 ); exit(1); if (sockfd = socket(AF_INET, SOCK_STREAM, 0) 0) printf(socket error.n); exit(1
21、); bzero(&servaddr, sizeof(servaddr); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERV_PORT); inet_pton(AF_INET, argv1, &servaddr.sin_addr); if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr) 0) printf(connect error.n); exit(1); str_cli(stdin, sockfd); exit(0); voidstr_cli(FILE *fp,i
22、nt sockfd) char sendlineMAXLINE, recvlineMAXLINE; while (fgets(sendline,MAXLINE, fp) != NULL) write(sockfd, sendline, strlen(sendline); if (readline(sockfd, recvline, MAXLINE) = 0) printf(str_cli:server terminated prematurely.n); exit(1); fputs(recvline, stdout); /*end str_cli */ssize_treadline(int
23、fd, void *vptr, size_t maxlen) int n, rc; char c, *ptr; ptr = vptr; for (n = 1; n maxlen; n+) if ( (rc = my_read(fd, &c) = 1) *ptr+ = c; if (c = n) break; /* newline is stored, like fgets() */ else if (rc = 0) if (n = 1) return(0); /* EOF, no data read */ else break; /* EOF, some data was read */ el
24、se return(-1); /* error, errno set by read() */ *ptr = 0; /* null terminate like fgets() */ return(n);/* end readline */static ssize_tmy_read(int fd, char *ptr) static int read_cnt = 0; static char *read_ptr; static char read_bufMAXLINE; if (read_cnt = 0) again: if ( (read_cnt = read(fd, read_buf, s
25、izeof(read_buf) 0) if (errno = EINTR) goto again; return(-1); else if (read_cnt = 0) return(0); read_ptr = read_buf; read_cnt-; *ptr = *read_ptr+; return(1);/*end ssize_t*/总结:实验对于我们来说是很重要的,经过这几次实验,我已经大致了解了TCP/IP的工作原理,知道了要想实验客户机和服务器的连连通,具体的步骤是什么。在试验中我们组遇到了很大的困难,几乎每一个步骤都会遇到很多问题,不多最后还是凭借大家的力量一一克服了,感谢老师对我们的帮助。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1