电子科大TCPIP第三次实验报告材料
实验三传输层TCP协议的分析

TCP报头长度(4位):给出报头中32bit字的数目,它实际上指明数据从哪里开始。需要这个值是因为任选字段的长度是可变的。这个字段占4bit,因此TCP最多有60字节的首部。然而,没有任选字段,正常的长度是20字节。
图4TCP前20字节的固定报文
1.分析上图的TCP协议的报文得到如下结论:
源端口号(16位):它(连同源主机IP地址)标识源主机的一个应用进程。图片中的来源端口地址为80。
目的端口号(16位):它(连同目的主机IP地址)标识目的主机的一个应用进程。这两个值加上IP报头中的源主机IP地址和目的主机IP地址唯一确定一个TCP连接。图片中的目的端口为1025。
顺序号(32位):用来标识从TCP源端向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号。如果将字节流看作在两个应用程序间的单向流动,则TCP用顺序号对每个字节进行计数。序号是32bit的无符号数,序号到达2 32-1后又从0开始。当建立一个新的连接时,SYN标志变1,顺序号字段包含由这个主机选择的该连接的初始顺序号ISN(Initial Sequence Number)。图片中的序号为0。
图5数据部分的报文
选项:长度可变,最长达到40字节。当没有使用“选项”时,TCP首部的长度就是20字节。还有就是后面的填充都是在常规的TCP首部后增加的。
教
师
评
语
教师签名:
TCPIP攻击实验实验学习报告计划

中南大学TCP/IP 攻击实验实验报告学生姓名学院信息科学与工程学院专业班级达成时间2015年 11 月 29 日目录1. 实验描绘 (3)2. 实验步骤 (3)环境搭建 (3)实验 1:ARP缓存中毒 (3)实验 2:ICMP重定向攻击 . (4)实验 3:SYN大水攻击 (5)实验 4:在 telnet和ssh连结上的TCP RST攻击 (6)实验5:对视频流应用程序的TCP RST 攻击 (7)实验 6:ICMP 盲目连结重置和源端封闭攻击 (7)实验 7:TCP报文挟持 (8)3. 总结 (8)TCP/IP 攻击实验1.实验描绘【实验背景】因为 TCP/IP 协议是 Internet的基础协议,所以对TCP/IP 协议的完美和改良是特别必要的。
TCP/IP 协议从开始设计时候并无考虑到此刻网络上这样多的威迫, 由此致使了很多林林总总的攻击方法,一般假如是针对协议原理的攻击( 特别 DDOS),我们将力所不及。
TCP/IP 攻击的常用原理有:(1)源地点欺诈(Source Address Spoofing)Spoofing);、 IP欺诈 (IP Spoofing)和 DNS欺诈 (DNS(2)路由选择信息协议攻击 (RIP Attacks) ;(3) 源路由选择欺诈(Source Routing Spoofing);(4) TCP 序列号欺诈和攻击(TCP Sequence Number Spoofing and Attack)。
【实验目的】鉴于 TCP/IP 协议进行攻击实验, 认识 TCP/IP 协议的详细体制。
2.实验步骤环境搭建这里我使用三台虚构机做实验,此中一个用于攻击;另一个用于被攻击;第三个作为察看者使用;把三台主机放在同一个LAN中,其配置信息参照以下所示(实质在实验过程中有所变动):这里我使用的是Wireshark工具箱的SEED实验室已经搭建好,并且已经安装好有关的Ubuntu 系统,与此同时三台虚构机都需要翻开netwoxFTP 和 Telnet工具箱和服务:使用以下命令来达成上述任务Start the ftp server#servicevsftpd startStart the telnet server#serviceopenbsd-inetd start实验 1:ARP缓存中毒【实验背景】ARP缓存是 ARP协议的重要的一部分。
TCPIP实验报告

TCP/IP技术实验报告书专业:[通信工程]学生姓名:[张世超]完成时间:9:28 AM实验一网络应用程序基础实验目得:通过实验,使学生熟悉并掌握运用TCP/IP技术进行网络编程得基本知识,加深对课堂教学内容得理解,掌握套接字网络通信编程技术,能够运用VC++为开发工具编程解决网络通信中得实际问题,进行一些简单得网络应用程序设计。
实验内容:1,Winsock得启动与终止。
2,Winsock得创建及绑定与关闭。
3,建立通信连接listen及accept与connect。
4,数据得传输。
5,简单得客户机/服务器之间得通信。
要求:通过在SDK模式下完成数据通信得过程,掌握Windows Socket得常用函数得形式与使用方法,理解数据通信得过程。
实验步骤:1,打开VC环境1,使用向导为客户端创建工程:选择可执行程序,选择使用wsa环境,单文档环境,其她得选择默认设置2,在文件中添加代码3,编译调试4,使用向导为服务器端创建工程:选择可执行程序,选择使用wsa环境,单文档环境,其她得选择默认设置5,在文件中添加代码6,编译调试7,分别打开两个系统命令窗口中,并分别在其中运行客户端与服务器端程序。
8,在客户端侧输入字符,可以瞧到服务器收到字符串参考代码:课本156页--160页实验结果:Client:#include<Winsock2、h>#include<stdio、h>//服务器端口号为5050#define DEFAULT_PORT 5050#define DATA_BUFFER 1024void main(int argc,char *argv[]){ﻩWSADATA wsaData;SOCKET sClient;ﻩint iPort=DEFAULT_PORT;//从服务器端接收得数据长度int iLen;ﻩ//接收数据得缓冲char buf[DATA_BUFFER];ﻩ//服务器端地址ﻩstruct sockaddr_in ser;ﻩ//判断输入得参数就是否正确if(argc<2){//提示在命令行中输入服务器IP地址ﻩﻩprintf("Usage:client [server IP address]\n");return;}ﻩ//接收数据得缓冲区初始化ﻩmemset(buf,0,sizeof(buf));ﻩif(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)ﻩ{printf("Failed to load Winsock、\n");ﻩﻩreturn;ﻩ}ﻩ//填写要连接得服务器地址信息ﻩser、sin_family=AF_INET;ser、sin_port=htons(iPort);//inet_addr()函数将命令行得点分IP地址转换为用二进制表示得网络字节顺序得IP地址ﻩser、sin_addr、s_addr=inet_addr(argv[1]);ﻩ//建立客户端流式套接口ﻩsClient=socket(AF_INET,SOCK_STREAM,0);if(sClient==INVALID_SOCKET)ﻩ{ﻩﻩprintf("socket()Failed:%d\n",WSAGetLastError());ﻩreturn;ﻩ}//请求与服务器端建立TCP连接ﻩif(connect(sClient,(struct sockaddr*)&ser,sizeof(ser))==INVALID_SOCKET){printf("connect() Failed:%d\n",WSAGetLastError()); ﻩﻩreturn;}elseﻩ//从服务器端接收数据ﻩiLen=recv(sClient,buf,sizeof(buf),0);ﻩﻩif(iLen==0)ﻩreturn;else if(iLen==SOCKET_ERROR)ﻩ{ﻩﻩprintf("recv() Failed:%d",WSAGetLastError());ﻩreturn;ﻩ}ﻩprintf("recv() datafrom server:%s\n",buf);}closesocket(sClient);ﻩWSACleanup();}Server:#include<Winsock2、h>#include<stdio、h>#include<stdlib、h>#pragma ment(lib,"ws2_32、lib")//服务器使用得端口号为5050#define DEFAULT_PORT 5050void main(){ﻩint iPort=DEFAULT_PORT;WSADATA wsaData;ﻩSOCKET sListen,ﻩﻩsAccept;ﻩ//客户端地址长度int iLen;//发送得数据长度ﻩint iSend;//要发送给客户端得信息ﻩchar buf[]="I am a server、";//服务器与客户端得IP地址struct sockaddr_in ser,ﻩﻩcli;printf("---------------------------\n");ﻩprintf("Serverwaiting\n");ﻩprintf("---------------------------\n");ﻩif(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)printf("Failed to load Winsock、\n");ﻩreturn;ﻩ}ﻩ//创建服务器端套接口ﻩsListen=socket(AF_INET,SOCK_STREAM,0);if(sListen==INVALID_SOCKET)ﻩ{ﻩﻩprintf("socket() Failed:%d\n",WSAGetLastError());ﻩreturn;ﻩ}//以下建立服务器端地址ﻩser、sin_family=AF_INET;//htons()函数把一个双字节得主机直接顺序得数据转换为网络直接顺序得数ﻩser、sin_port=htons(iPort);ﻩ//htonl()函数把一个四字节得主机直接顺序得数据转换为网络直接顺序得数ﻩ//使用系统制定得IP地址INADDR_ANYser、sin_addr、s_addr=htonl(INADDR_ANY);if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ER ROR){ﻩprintf("bind() Failed: %d\n",WSAGetLastError());ﻩreturn;ﻩ}ﻩ//进入监听状态ﻩif(listen(sListen,5)==SOCKET_ERROR)ﻩ{ﻩprintf("listen() Failed:%d\n",WSAGetLastError());ﻩﻩreturn;}ﻩ//初始化客户端地址长度参数iLen=sizeof(cli);ﻩ//进入一个无限循环,等待客户得连接请求while(1){ﻩﻩsAccept=accept(sListen,(struct sockaddr*)&cli,&iLen);ﻩif(sAccept==INVALID_SOCKET){ﻩﻩprintf("accept() Failed: %d\n",WSAGetLastError());ﻩbreak;ﻩﻩ}ﻩ//输出客户IP地址与端口号ﻩprintf("Acceptedclient IP:[%s],port:[%d]\n",ine t_ntoa(cli、sin_addr),ntohs(cli、sin_port));ﻩ//给建立连接得客户发送信息ﻩﻩiSend=send(sAccept,buf,sizeof(buf),0);if(iSend==SOCKET_ERROR)ﻩ{ﻩﻩprintf("send() Failed:%d\n",WSAGetLastError());ﻩbreak;ﻩ}ﻩﻩelse if(iSend==0)ﻩbreak;ﻩﻩelseﻩ{printf("send() byte:%d\n",iSend);printf("---------------------------\n");ﻩ}ﻩclosesocket(sAccept);ﻩ}closesocket(sListen);ﻩWSACleanup();}实验截图:实验二基于TCP协议得客户/服务器通信程序实验目得:通过实验,使学生熟悉并掌握运用TCP/IP技术进行网络编程得基本知识,加深对课堂教学内容得理解,掌握套接字网络通信编程技术,能够运用VC++为开发工具编程解决网络通信中得实际问题,进行一些简单得网络应用程序设计。
tcpip实验报告

《TCP/IP》实验报告姓名:学号:学院:专业:班级:指导老师:2013年6月3日实验一熟悉Linux编程环境练习1:编写一个并发程序,利用fork函数创建五个进程,让每一个进程打印出可用来分辨不同进程的信息。
#include<stdio.h>#include<unistd.h>#include<sys/wait.h>int main(){int pid, i;i = 0;while(i < 5){i++;if((pid=fork()) == 0){printf("pid:%d\n",getpid());sleep(3);break;}waitpid(pid,(int*)0,0);printf("ppid:%d\n",getpid());}return 0;}运行结果:练习2:编写一个程序,利用execve函数改变进程执行的代码。
//execve.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(int argc,char *argv[]){char *newargv[] = {NULL,"you","me",NULL};char *newenviron[]={NULL};if(argc != 2){fprintf(stderr,"Usage:%s <file-to-exec>\n",argv[0]);exit(EXIT_FAILURE);}newargv[0] = argv[1];execve(argv[1],newargv,newenviron);perror("execve");exit(EXIT_FAILURE);}//myecho.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(int argc, char *argv[]){int i;for(i = 0; i < argc; i++)printf("argv[%d]:%s\n",i,argv[i]);return 0;}运行结果:实验二实现Echo服务客户端程序(UDP)代码://client.c#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/types.h>#include<sys/time.h>#include<errno.h>int readable_timeo(int fd, int sec){fd_set rset;struct timeval tv;FD_ZERO(&rset);FD_SET(fd,&rset);_sec = sec;_usec = 0;return (select(fd+1,&rset,NULL,NULL,&tv)); //使用select函数实现简单超时重传}int main(int argc, char **argv){int sockfd, len, res, i;struct sockaddr_in address;char *host;struct hostent *hostinfo;struct servent *servinfo;char buf[128], buf2[128];int nsec = 20;//timeout:20sstruct timeval tpstart,tpend;double timeuse;if(argc == 1)host = "localhost";elsehost = argv[1];hostinfo = gethostbyname(host);if(!hostinfo){fprintf(stderr,"no host:%s\n",host);exit(1);}servinfo = getservbyname("echo","udp");if(!servinfo){fprintf(stderr,"no echo server!\n");exit(1);}sockfd = socket(AF_INET,SOCK_DGRAM,0);address.sin_family = AF_INET;address.sin_port = servinfo->s_port;address.sin_addr = *(struct in_addr*)*hostinfo->h_addr_list;len = sizeof(address);while(fgets(buf,128,stdin) != NULL){for(i = 0; i < 2; i++) //juse one chance to resend{if(i == 1) //resend{printf("ReSend!!!\n");gettimeofday(&tpend,NULL);timeuse=1000000*(__sec)+__usec;timeuse/=1000000;printf("resend time is %lf s\n",timeuse);}gettimeofday(&tpstart,NULL);res = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&address,len);if(readable_timeo(sockfd,nsec) == 0){fprintf(stderr,"socket timeout\n");continue;}res = recvfrom(sockfd,buf2,128,0,(struct sockaddr*)&address,&len);buf2[res] = 0;fputs(buf2,stdout);break; //send successfully,quit!}}close(sockfd);exit(0);}实验三循环无连接服务器Echo的实现代码://server.c#include<stdio.h>#include<unistd.h>#include<netinet/in.h>#include<arpa/inet.h>#include<sys/types.h>#include<stdlib.h>#include<signal.h>#include<string.h>#include<errno.h>#include<time.h>#define MAXLINE 128int sockfd, flag = 1;void close_action(int sig){printf("close the sockfd\n");close(sockfd);signal(SIGINT,SIG_DFL);flag = 0;}int main(){struct sockaddr_in sin,sin_cli;int type, res, opt;char mesg[MAXLINE], buf[MAXLINE];socklen_t len;struct sigaction act;struct tm *ptm;int y,m,d,h,n,s;long ts;//set the signal actionact.sa_handler = close_action;sigemptyset(&act.sa_mask);act.sa_flags = 0;memset(&sin,0,sizeof(sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = INADDR_ANY;sin.sin_port = htons(45454);sockfd = socket(AF_INET,SOCK_DGRAM,0);if(sockfd < 0){fprintf(stderr,"can't create socket %s \n",strerror(errno));exit(1);}if(bind(sockfd,(struct sockaddr*)&sin,sizeof(sin)) < 0){fprintf(stderr,"can't bind to %s port:%s\n",service,strerror(errno));exit(1);}len = sizeof(sin_cli);sigaction(SIGINT,&act,0); //Ctrl+C close the sockfdwhile(flag){printf("\n");res = recvfrom(sockfd,mesg,MAXLINE,0,(struct sockaddr*)&sin_cli,&len);mesg[res] = 0;ts = time(NULL);sprintf(buf,"%.24s\r\n",ctime(&ts));printf("%s\t",buf);printf("%s\t",inet_ntoa(sin_cli.sin_addr));sendto(sockfd,mesg,n,0,(struct sockaddr*)&sin_cli,len);}exit(0);}实验四循环的、面向连接服务器的实现//server.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<time.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#define MAXSIZE 30int main(){struct sockaddr_in servaddr,cliaddr;int clilen;int connfd, listenfd;char buf[MAXSIZE];time_t now;int seconds;struct tm *ptm;int y,m,d,h,n,s;long ts;listenfd = socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(9734);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));listen(listenfd,5);for(;;){clilen = sizeof(cliaddr);connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);ts = time(NULL);sprintf(buf,"%.24s\r\n",ctime(&ts));write(connfd,buf,MAXSIZE);}exit(1);}//client.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<time.h>#include<string.h>#define MAXSIZE 30void str_daytime(int fd){char buf[MAXSIZE];int n;if((n = read(fd,buf,MAXSIZE)) <= 0){fprintf(stderr,"error");}buf[n] = 0;fputs(buf,stdout);}int main(int argc,char **argv){int sockfd;struct sockaddr_in servaddr;sockfd = socket(AF_INET,SOCK_STREAM,0);servaddr.sin_family = AF_INET;servaddr.sin_port = htons(9734);//Inet_pton(AF_INET,argv[1],&servaddr.sin_addr);servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));str_daytime(sockfd);exit(1);}实验五循环的、面向连接服务器的实现//server.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<time.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#define MAXSIZE 30int main(){struct sockaddr_in servaddr,cliaddr;int clilen,connfd, listenfd, childpidchar buf[MAXSIZE];time_t now;int seconds;struct tm *ptm;int y,m,d,h,n,s;long ts;listenfd = socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(9734);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));listen(listenfd,5);clilen = sizeof(cliaddr);for(;;){connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);if((childpid = fork()) == 0){close(listenfd);ts = time(NULL);sprintf(buf,"%.24s\r\n",ctime(&ts));write(connfd,buf,MAXSIZE);}close(connfd);}exit(1);}//test.c#include<stdio.h>#include<unistd.h>#include<stdlib.h>int main(){int i;for(i = 0; i < 10; i++){system("./tcpcli");printf("\n");}exit(0);}实验六单进程并发服务代码:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/socket.h>#include<sys/select.h>#include<strings.h>#include<string.h>#include<time.h>#define MAXLINE 128int main(){struct sockaddr_in servaddr,cliaddr;int clilen;int connfd, listenfd, sockfd;char buf[MAXLINE];int i, maxi, maxfd, seconds, nresult, res, nread,client[FD_SETSIZE];pid_t childpid;fd_set readfds,testfds;struct tm *ptm;int y,m,d,h,n,s;time_t ts;listenfd = socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(9734);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));listen(listenfd,10);maxfd = listenfd;maxi = -1;for(i = 0; i < FD_SETSIZE; i++)client[i] = -1;FD_ZERO(&readfds);FD_SET(listenfd,&readfds);for(;;){testfds = readfds;nresult = select(maxfd+1,&testfds,NULL,NULL,NULL);if(FD_ISSET(listenfd,&testfds)){clilen = sizeof(cliaddr);connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);for(i = 0; i < FD_SETSIZE; i++)if(client[i] < 0){client[i] = connfd;break;}if(i == FD_SETSIZE)fprintf(stderr,"too many clients");FD_SET(connfd,&readfds);if(connfd > maxfd)maxfd = connfd;if(i > maxi)maxi = i;if(--nresult <= 0)continue;}for(i = 0; i <= maxi; i++){if((sockfd = client[i]) < 0)continue;if(FD_ISSET(sockfd,&testfds)){if((res = read(sockfd,buf,MAXLINE))== 0){close(sockfd);printf("connection closed by client\n");FD_CLR(sockfd,&readfds);client[i] = -1;}else if(res > 0){printf("supply service to client!\n");ts = time(NULL);sprintf(buf,"%.24s",ctime(&ts));write(sockfd,buf,strlen(buf));}elseprintf("error!!!!\n");if(--nresult <= 0){printf("no more readble descriptors\n");break;}}}}exit(1);}实验七并发的客户端//tcpcli.c#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include "unp.h"int main(int argc,char **argv){int i, ccount, hcount = 0, fd, maxfd = 0, n, one, sockfd;fd_set afds;char ser_ip[FD_SETSIZE][20], buf[MAXLINE];struct sockaddr_in servaddr;struct servent *servinfo;servinfo = getservbyname("daytime","tcp");servaddr.sin_family = AF_INET;servaddr.sin_port = servinfo->s_port;for(i = 1; i < argc; ++i){sockfd = socket(AF_INET,SOCK_STREAM,0);if(strcmp(argv[i],"-c") == 0){if(++i < argc && (ccount = atoi(argv[i])))continue;err_quit("tcpcli [-c] [number] [ip] ");}Inet_pton(AF_INET,argv[i],&servaddr.sin_addr);fd = connect(sockfd,(SA*)&servaddr,sizeof(servaddr));if(ioctl(sockfd,FIONBIO,(char*)&one))err_quit("can't mark socket nonblocking:%s\n",strerror(errno));if(sockfd > maxfd)maxfd = sockfd;strcpy(ser_ip[sockfd],argv[i]);++hcount;FD_SET(sockfd,&afds);}n = select(maxfd+1,&afds,NULL,NULL,NULL);for(i = 0; i <= maxfd; i++){if(FD_ISSET(i,&afds)){if((n = read(i,buf,MAXLINE)) == 0){close(sockfd);FD_CLR(i,&afds);}elseprintf("%s\t%s\n",buf,ser_ip[i]);}}exit(0);}实验八多线程服务代码:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<time.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#include<semaphore.h>#include<pthread.h>#define MAXSIZE 30struct share_thread{pthread_mutex_t work_mutex;int count;}shared;void *thread_func(void *arg){int connfd;char buf[MAXSIZE];struct tm *ptm;int y,m,d,h,n,s;long ts;connfd = *(int*)arg;ts = time(NULL);sprintf(buf,"%.24s\r\n",ctime(&ts));write(connfd,buf,MAXSIZE);pthread_mutex_lock(&shared.work_mutex);shared.count++;pthread_mutex_unlock(&shared.work_mutex);printf("Number of service of daytime:%d\n",shared.count);close(connfd);pthread_exit(0);}int main(){struct sockaddr_in servaddr, cliaddr;int listenfd, connfd;pthread_t serv_thread;pthread_attr_t thread_attr;int res;int clilen;shared.count = 0;res = pthread_mutex_init(&shared.work_mutex,NULL);if(res != 0){fprintf(stderr,"mutex initilization failed");exit(1);}res = pthread_attr_init(&thread_attr);if(res != 0){fprintf(stderr,"Attribute creation failed");exit(1);}res = pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED);if(res != 0){fprintf(stderr,"Setting detached attribute failed");exit(1);}listenfd = socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(9734);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));listen(listenfd,5);for(;;){clilen = sizeof(cliaddr);connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);//wrongres = pthread_create(&serv_thread,&thread_attr,thread_func,(void*)&connfd);if(res != 0){fprintf(stderr,"create pthread failed\n");exit(1);}}exit(1);}实验九预分配进程服务器代码://server.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<time.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#include<signal.h>#include<errno.h>#include<sys/wait.h>#include<pthread.h>#include<semaphore.h>#define MAXSIZE 30#define MAXCHILD 100static pthread_mutex_t work_mutex;static pid_t childpid[MAXCHILD];void child_main(int i, int listenfd){char buf[MAXSIZE];struct tm *ptm;int y,m,d,h,n,s;long ts;int connfd;int clilen;struct sockaddr_in cliaddr;clilen = sizeof(cliaddr);pthread_mutex_lock(&work_mutex); //lockconnfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);pthread_mutex_unlock(&work_mutex); //unlockprintf("Now, it is the %d child to supply service for the client\n",i);ts = time(NULL);sprintf(buf,"%.24s\r\n",ctime(&ts));write(connfd,buf,MAXSIZE);close(connfd);}void sig_int(int signo){printf("\ndestroy the mutex\n");int i;for(i = 0; i < MAXCHILD; i++)kill(childpid[i],SIGTERM);while(wait(NULL) > 0);if(errno != ECHILD)fprintf(stderr,"wait error");pthread_mutex_destroy(&work_mutex);exit(0);}int main(){struct sockaddr_in servaddr, cliaddr;int listenfd, connfd;int res, i;int clilen;res = pthread_mutex_init(&work_mutex,NULL);if(res != 0){fprintf(stderr,"mutex initialization failed\n");exit(1);}listenfd = socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(9734);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));listen(listenfd,5);for(i = 0; i < MAXCHILD; i++){if((childpid[i] = fork()) < 0){fprintf(stderr,"fork failed");exit(1);}else if(childpid[i] == 0)child_main(i, listenfd);}signal(SIGINT,sig_int);for(;;)pause();}。
2019-计算机网络第三次实验报告-word范文模板 (7页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==计算机网络第三次实验报告篇一:计算机网络实验报告一实验一:网络常用命令的使用一、实验目的:1. 了解或掌握一些网络常用命令;2. 掌握Ping、IPconfig、arp等命令的功能及一般用法;3. 能应用上述命令进行网络连通、网络状态、网络配置等。
二、实验环境:1. 运行Windows 201X / 201X Server / XP操作系统的PC一台;2. 每台PC 具有一块以太网卡,通过双绞线与局域网相连。
三、实验内容与要求:1. 进入DOS模式:“开始”-> “所有程序”->“附件”-> “命令提示符”;[第1页][201X.3.制]2. 参照附件一:IP地址的查看与配置,完成其中实验要求,并回答下面的问题:(1)使用“ipconfig”命令,查看本机的IP地址是什么?并记录下来。
(2)使用“ipconfig”命令,怎样查看本机的物理地址?截屏记录,并根据截屏回答物理地址具体是多少?3. 参照附件二:网络连通性的测试,完成其中实验要求,并回答下面的问题:(1)使用ping命令测试网络时,本机通常向被测试计算机发几次请求?(2)执行“ping ”,是否可以获取对应的IP地址?截屏记录其IP地址。
(3)执行“ping ”和“ping ”,记录两者执行后的参数“平均往返时延”各为多少?并截屏记录。
[第2页][201X.3.制](4)执行ping命令,要求向香港科技大学ust.hk一次性发送10个报文请求。
截屏记录操作结果。
(5)执行ping命令,要求向香港科技大学ust.hk发送报文请求的长度分别为500B和201XB。
截屏记录操作结果。
[第3页][201X.3.制]4. 参照附件三:理解ARP协议,完成其中实验要求,并回答下面的问题:(1)使用“arp -a”查看本机ARP选路表中的内容,并需截屏记录。
tcpip实验报告

实验一Linux内核通用链表的使用一、实验目的学习Linux内核通用链表的设计原理,熟练掌握Linux内核通用链表的使用。
二、实验内容1、掌握Linux通用链表的创建2、掌握通用链表添加元素、删除元素和遍历链表的方法3、掌握通用链表的查找方法三、实现原理Linux的内核源文件list.h提供了所有的链表定义,以及各类链表的操作接口和实现。
其中创建链表的方法如下:LIST_HEAD(my_list);在指定的head后插入新节点,常用于堆栈数据结构的实现list_add(structlist_head *new, structlist_head *head);在指定的head前插入新节点,常用于队列数据结构的实现list_add_tail(structlist_head *new, structlist_head *head);从链表中删除一个指定节点list_del(structlist_head *entry);根据当前链表节点指针ptr获得宿主节点指针list_entry(ptr, type, member);遍历链表list_for_each(pos, head);四、实现代码和运行结果#include <stdio.h>#include <malloc.h>#include "list.h"struct user{int id;structlist_head list;};int main(void){struct user *p;LIST_HEAD(user_queue);for (inti = 0; i< 10; i++){p = (struct user *)malloc(sizeof(struct user));p->id = i;list_add_tail(&p->list, &user_queue);}structlist_head *q;list_for_each(q, &user_queue){p = list_entry(q, struct user, list);printf("%d\n", p->id);}return 0;}#include <stdio.h>#include <malloc.h>#include "list.h"struct user{char username[20];int id;structlist_head list;};int main(void){struct user *p;LIST_HEAD(head);for (inti; i< 10; i++){p = (struct user *)malloc(sizeof(struct user)); p->id = i + 1;printf("user %2d, Please input username: ", i+1); scanf("%s", p->username);list_add_tail(&(p->list), &head);}structlist_head *tmp;list_for_each(tmp, &head){p = list_entry(tmp, struct user, list);printf("%d\t%s\n", p->id, p->username);}list_for_each(tmp, &head){p = list_entry(tmp, struct user, list);if (p->id == 5)printf("%s\n", p->username);}return 0;}实验二Linux内核通用哈希链表的使用一、实验目的学习Linux内核通用哈希链表的设计原理,熟练掌握Linux内核通用哈希链表的使用。
电子科技大学_TCPIP实验三_FTP中的TCP传输服务_实验报告

电子科技大学实验报告学号学生姓名:课程名称:TCP / IP任课老师:杨宁实验项目名称FTP中的TCP传输服务实验3:FTP中的TCP传输服务【实验内容】实验拓扑中VMware虚拟机PC2和Server分别位于由提供集线器功能的虚拟网卡VMnet1和VMnet2模拟实现的两个以太网Ethernet1和Ethernet2中,这两个以太网对应的IP子网A和子网B分别连在Dynamips软件模拟实现的路由器R1和R2的F0/0接口上。
R1和R2之间通过PPP链路互联。
Server上开启了匿名FTP服务。
实验者在PC2上分别使用ftp命令和IE浏览器连接FTP服务器下载文件,结合Dynamips 软件的分组捕获功能以及Wireshark软件的捕获分组查看功能,考察在FTP会话过程中TCP 协议的连接建立过程和连接终止过程。
通过分析TCP连接建立和连接终止过程中所捕获的TCP报文段,掌握TCP报文段首部中的端口地址、序号、确认号和各个码元比特的含义和作用;并通过FTP操作体会网络应用程序间的交互模式——客户/服务器(C/S)模式。
【实验步骤】1、依次启动VMware Workstation中TCPIP组内的虚拟机PC2和Server。
2、启动Dynamips Server,然后运行,在Dynagen窗口中提示符“=>”后依次输入以下命令启动路由器R1和R2:=> start R1=> start R23、在PC2上ping Server的IP地址确保整个实验网络运行正常。
4、在Dynagen窗口中提示符“=>”后输入以下命令捕获子网A中的分组:=> capture R1 f0/0 cmdftp.cap5、在PC2的cmd窗口中以命令行的方式启动FTP客户进程登录FTP服务器,下载一份文本文件tcpip.txt后结束FTP客户进程。
该过程中的操作示意如下:(X.X.X.X表示FTP服务器的IP地址,黑斜体表示学生输入内容,其它为系统显示信息)C:\>ftp X.X.X.X……User (X.X.X.X:(none)): ftp……Password: ftp……ftp> get tcpip.txt……ftp> quit2216、在Dynagen窗口中提示符“=>”后依次输入以下命令重新捕获子网A中的分组:=> no capture R1 f0/0=> capture R1 f0/0 ieftp.cap7、在PC2上用IE浏览器作为FTP客户机登录同一台FTP服务器,下载完文本文件tcpip.txt后关闭IE浏览器窗口。
杭州电子科技大学通信工程计算机网络的实验报告3【范本模板】

计算机通信与网络实验报告姓名:徐一得学号:15081525班级:通信五班上课时间:周四3—5实验名称:TCP/IP Configuration一、实验目的(1) To learn TCP/IP configuration。
(2) To learn the basic command of dos。
二、实验内容与要求1. Click Start and then click Run。
Type the command or cmd and then press Enter。
2。
At the DOS prompt,type NET HELP and press Enter。
You should see something like the screen below:The command you are interested in is the View command。
To obtain information about it, type NET HELP VIEW, and press Enter。
3. What is the purpose of NET VIEW:The NET VIEW command shows the names of the machines present on your network。
Lists the names of machines on the left,in column labelled “Server name” and another columns labelled “Remark"4. List the machines after you have typed NET VIEW from the command promptHDUSEC-01, HDUSEC-02,HDUSEC-03,……,HDUSEC-48Close the DOS window by typing EXIT on the command line and then press Enter, or by clicking the Close button in the upper right corner of the window。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实用文档电子科技大学实验报告名:学生姓号:学TCP/IP协议名课程称:教指导师:2016 年 11 日期:月 26 日OSPF实验项目名称:协议的多区域特性分:告报评教师签字:实用文档一、实验原理OSPF 协议(RFC 2328)是一个基于链路状态路由选择的内部网关协议:路由器仅在网络拓扑变化时使用洪泛法(flooding)将自己的链路状态更新信息扩散到整个自治系统中。
为了增强 OSPF 协议的可伸缩能力(Scalability),OSPF 协议引入了区域的概念来有效并及时的处理路由选择。
OSPF 区域是包含在 AS 中的一些网络、主机和路由器的集合,自治系统中所有 OSPF 区域必须连接到一个主干区域(Area 0)上。
区域内的 OSPF 路由器(内部路由器,IR)使用洪泛法(flooding)传送本区域内的链路状态信息,区域边界的 OSPF 路由器(区域边界路由器,ABR)将本区域的信息汇总发给其他区域,自治系统边界的 OSPF 路由器(自治系统边界路由器,ASBR)将自治系统外的路由(外部路由)发布在自治系统中。
主干区域中的 OSPF 路由器也称为“主干路由器”(BR)。
ABR 不能向 OSPF 残桩区域(Stub Area)通告外部路由。
在多址网络中,为了避免不必要的链路状态洪泛,需要选举 1 个指定路由器(DR)和 1 个备份指定路由器(BDR)。
OSPF 协议有 5 种类型的报文,它们被直接封装在 IP 分组中多播发送。
- 问候(Hello)报文:用来建立并维护 OSPF 邻接关系。
在建立了邻接关系后, OSPF 路由器会定期发送 Hello 报文,来测试邻站的可达性。
- 数据库描述(DBD)报文:描述 OSPF 路由器的链路状态数据库的概要信息,即数据库中每一行的标题,它在两台相邻路由器彼此建立邻接关系时发送的。
- 链路状态请求(LSR)报文:由需要若干条特定路由信息的路由器发送出的,它的回答是 LSU 报文。
新接入的路由器在收到 DBD 报文后,可以使用 LSR 报文请求关于某些路由的更多信息。
- 链路状态更新(LSU)报文:OSPF 的核心。
OSPF 路由器使用 LSU 报文通告链路状态更新信息(即链路状态通告,LSA)每一个 LSU 报文可包含几个 LSA。
, OSPF 协议的 LSA 有 5 种常用类型:路由器链路 LSA、网络链路 LSA、汇总链路到网络 LSA、汇总链路到 ASBR LSA 和外部链路 LSA。
5 种类型的 LSA这由不同类型的 OSPF 路由器产生,在特定类型的区域范围内扩散。
- 链路状态确认(LSAck)报文:用来确认每一个收到的 LSU 报文,使得 OSPF 协议的路由选择更加可靠。
二、实验目的1、掌握 OSPF 协议中区域的类型、特征和作用2、掌握 OSPF 路由器的类型、特征和作用实用文档3、掌握 OSPF LSA 分组的类型、特征和作用4、理解 OSPF 区域类型、路由器类型和 OSPF LSA 分组类型间的相互关系三、实验内容实验拓扑中Dynamips软件模拟实现的路由器R1~R6互联了2个自治系统(AS 10和AS 20),路由器之间使用OSPF协议进行路由选择。
AS 10中有5个子网,划分了3个区域:Area 0、Area 1和Area 2,其中Area 2是一个Stub区域。
AS 20中有1个子网,其路由信息将以OSPF的外部路由方式发布到AS 10的OSPF网络中。
实验者使用Dynamips软件捕获子网1、2、3上传送的OSPF报文,使用Wireshark软件查看捕获的OSPF报文,分析OSPF协议的路由更新过程,考察OSPF协议中不同类型的区域、路的特征和作用。
LSA由器和四、实验器材(设备、元器件)装有相关软件的机房电脑实用文档五、实验步骤1、启动Dynamips Server,然后运行,在Dynagen窗口中提示符“=>”后依次输入以下命令启动路由器R1~R6,并分别进入R1和R6的CLI:=> start R1=> start R2=> start R3=> start R4=> start R5=> start R6=> con R1=> con R62、分别在R1的CLI提示符“R1>”以及R4的CLI提示符“R4>”后输入“show ip route”命令查看两台路由器当前的路由表,确保实验网的OSPF协议已经收敛。
R1> show ip routeR4> show ip route3、在Dynagen窗口中提示符“=>”后输入以下命令捕获子网2、3、4和5中的分组:=> capture R2 s1/0 2.cap HDLC=> capture R3 s1/0 3.cap HDLC=> capture R4 f0/0 4.cap=> capture R5 f0/0 5.cap4、1分钟后,在路由器R1的CLI中输入以下命令断开R1与子网1的连接(如图B所示):en 对应的CLI提示符为“R1>”conf t 对应的CLI提示符为“R1#”int f0/1 对应的CLI提示符为“R1(config)#”shut 对应的CLI提示符为“R1(config-if)#”5、1分钟后,在路由器R1的CLI中输入以下命令恢复R1与子网1的连接,并在路由器R4的CLI 中输入以下命令将到AS 20中子网20.0.0.0/16的路由以外部路由的方式发布到AS 10的OSPF 网络中(如图C所示):R1:en 对应的CLI提示符为“R1>”实用文档conf t 对应的CLI提示符为“R1#”int f0/1 对应的CLI提示符为“R1(config)#”no shut 对应的CLI提示符为“R1(config-if)#”R4:en 对应的CLI提示符为“R4>”conf t 对应的CLI提示符为“R4#”router ospf 1 对应的CLI提示符为“R4(config)#”redis static sub 对应的CLI提示符为“R1(config-router)#”6、1分钟后,在Dynagen窗口中提示符“=>”后输入以下命令停止捕获:=> no capture R2 s1/0=> no capture R3 s1/0=> no capture R4 f0/0=> no capture R5 f0/07、用Wireshark软件查看并分析捕获的分组文件(2.cap、3.cap、4.cap和5.cap)中的OSPF 报文,查看过滤条件为“ospf”(在Wireshark主窗口界面“过滤工具栏”的“Filter:”域中输入)。
8、实验结束后,按照以下步骤关闭实验软件、上传实验数据、还原实验环境:(1)关闭R1、R4的CLI窗口,在Dynagen窗口中提示符“=>”后依次输入以下命令关闭Dynagen 窗口,然后再关闭Dynamips Server窗口:=> stop /all=> exit(2)运行所在目录下的“reset.bat”文件。
六、实验数据及结果分析1、步骤2中根据R1路由表和R4路由表中的哪些信息可以确保实验网中的OSPF 协议已经收敛?为什么?答:两个路由器的表项对应路径相符合。
因为OSPF是各个路由器将自己的路由信息广播给其他路由器,所以当R1和R4的表项信息相符的时候就能够确定其已经收敛了。
2、分析执行步骤4之前在4个子网上捕获的OSPF报文。
记录子网2、3、4和5上每一台路由器发送的1个OSPF Hello报文的如下信息:实用文档【分析】 OSPF hello间隔是多少秒?1)实验中的 10s。
答:信和BDR?为什么?根据记录中的DR和BDRDR)2 是否4个子网上都选举有。
在本实验的后续步骤中,和BDR中子网4上的DR息,用路由器编号写出图A 和DRBDR是否会改变?各子网上的就没有。
R3不是,因为指定路由接口不一定存在,如上表中路由器R2和答:。
AS2 不会,因为子网路由拓扑并没有改变,只是在R4外添加了按报文。
4个子网上捕获的OSPF之前在、分析从执行步骤34开始到执行步骤5个非类报文概要,要求:从第OSPF1报文的捕获顺序记录每个子网上捕获到的)报文,hello1OSPFhello1型(即报文)的报文开始记录,包括后续的类型(实用文档实用文档实用文档【分析】)224.0.0.5224.0.0.6和)为什么会在实验中捕获到两种不同目的IP地址(1 报文?的LSU发224.0.0.6 IP 地址在多路访问网络中,非DR/BDR 路由器只能以目的答:报文。
因发送LSU 224.0.0.5 DR/BDR 路由器则以目的IP 地址送 LSU 报文,LSU 报文。
此会在实验中捕获到两种不同目的IP 地址的报文进行确认。
为什,即对收到的每个LSU OSPF要求路由器确认收到的LSA2) 1个?报文,但LSAck 报文却只有么在子网4上捕获到了2个LSU报文进行确认的方式有两种:一种是发送包LSU OSPF 答:路由器对收到的另一种则是发报文进行显式确认,LSA 首部信息的LSAck 含收到的LSU 报文中中,1 在子网信息的LSU 报文中LSA LSU 报文进行隐式确认。
送包含收到的路OSPF LSA 洪泛给本子网上的所有,需要将收到的LSU 报文中携带的是R5DR不需要再次采取了隐式确认的方式。
R2 ,因此R3 对收到的LSA 由器,包括R3个1 R4 LSA,所以采取了显式确认的方式,发送了洪泛收到的LSU 报文中的报文。
LSAck个子网上捕45之前在、按报文捕获顺序,记录从执行步骤44开始到执行步骤实用文档实用文档【分析】R12上报文(例如:Area 1中子网1)同一Area内不同发送者发送的LSU内容是否完全一报文)中携带的LSA上R2发送的LSU发送的LSU报文和子网3首部中报文的OSPFLSA首部中的通告路由器、该LSU报文中,致?在LSU1个地址,它们指的是分组首部中的源IPOSPF报文的IP的路由器ID,以及封装该什么路由器?是否是同一台路由器?内报文中携带的LSA 1 个子网上捕获到的不同发送者发送的LSU 答:同通告的路由器,携带该LSA 的通告路由器指的是始发这条容完全一致。
LSA报文的OSPF 首部的路由器ID 和封装该LSA 通告的LSU报文中OSPF报文的路由器。
发送LSU 分组首部中的源IP 地址指的都是发送这个IP报文的路由器不一定是携带在该报文中的LSA 通告路由器。