电子科大TCPIP第五次实验报告
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();}。
TCP实验报告5_

电子科技大学实验报告学生姓名:田家翼学号:2012019030029指导教师:张科日期:2014 年11 月29 日实验项目名称:FTP中的TCP传输服务报告评分:教师签字:一、实验原理FTP协议是一个用于文件传输的应用层协议,采用客户/服务器模式实现文件传输功能,使用TCP协议提供的面向连接的可靠传输服务。
FTP客户和服务器之间使用2条TCP连接来传输文件:控制连接(TCP端口21)和数据连接(TCP端口20)。
在整个FTP会话交互过程中,控制连接始终处于连接状态;数据连接则在每一次文件传送时使用PORT命令或PASV命令打开,文件传送完毕后关闭。
因此,整个FTP会话中如果传送多个文件,那么数据连接会打开和关闭多次。
TCP协议(RFC 793)是一个面向连接的、可靠的运输层协议,通过连接建立和连接终止这两个过程完成面向连接的传输。
TCP的连接建立通常被称为“三向握手”。
在建立TCP 连接之前,服务器程序需要向它的TCP模块发出被动打开请求,表示该服务器已经准备好接受客户的连接。
客户程序则要向它的TCP模块发出主动打开请求,表示该客户需要连接特定的服务器。
然后即可开始建立TCP连接。
以客户端主动连接TCP连接为例,TCP连接建立过程如下:(1)客户端TCP发送一个SYN报文段。
该报文段包括源端口号、目的端口号、客户的初始序号、客户可接收的TCP报文段数据的最大长度(MSS)等信息。
(2)服务器端TCP收到客户端的SYN报文段后,返回一个SYN和ACK报文段。
该报文段使用ACK标志和确认号字段确认已经收到了客户端的SYN报文段,另外对服务器端的报文段进行初始化。
(3)客户端TCP收到服务器端的SYN和ACK报文段后,发送一个ACK报文段。
该报文段使用ACK标志和确认号字段确认已经收到了服务器端的SYN和ACK报文段。
TCP连接中的任何一方(客户或服务器)都可以关闭连接。
当一方的连接被终止时,另一方还可以继续向对方发送数据。
【电子科技大学TCP-IP课题】TCPIP5

电子科技大学—通信与信息工程学院
ARP协议-讨论
5、无应答 如果一段时间后都没有收到对应的ARP响应
什么问题?如何处理待发的报文?
6、绑定冲突 如果更新绑定表时,发现原有内容和要更新的内容不一致
IP地址不同、或物理地址不同—什么问题?
7、重复绑定 地址解析表中如果出现多个IP地址绑定了同一个物理地址
表操作
应答代理表
[I1,?]
被动方
IP1,Pa IP2,Pa
主动方 [I2,?]
操作
…
操作
IPk,Pa
[I3,?]
Resp Req Resp Req
SAP
MAC(Pa) 电子科技大学—通信与信息工程学院
ARP proxy
用途:增加组网的灵活性 考察组网结构
合理设置ARP proxy1和2的应答代理表,能获得什么意想不到 的结果
协议操作
当出现地址解析需求时,直接在物理网上广播ARPReq,携带自己的绑 定和请求获得的绑定 当收到ARPReq时,若是对自己的请求,则直接向源端回答自己的绑 定ARPResp,若不是,则不回答
可用ARPReq中的“源方绑定”更新自己的地址解析表
地址解析表操作 存放最近获得的IP与物理地址的绑定 超时清除“陈旧”的地址绑定记录—动态性质
HwType
PrType
HwLen Prห้องสมุดไป่ตู้en
OP
SrcHwAddress(1-4)
SrcHwAddress(5-6)
SrcIP(1-2)
SrcIP(3-4)
DstHwAddress(1-2)
DstHwAddress(3-6)
电子科技大学_TCPIP实验一_IP分组交付和ARP协议_实验报告

电子科技大学实验报告学生姓名:陈虹宇学号:2012019110004指导教师:杨宁日期:2014 年10 月31 日实验项目名称:IP分组交付和ARP协议报告评分:教师签字:一、实验原理子网中使用一个32比特的掩码来标识一个IP地址的网络/子网部分和主机部分。
将IP 地址和掩码进行“位与”运算后可以得到该IP地址所在IP子网的子网地址,结合掩码中0比特个数可以确定该IP子网的IP地址空间范围。
根据IP地址所在IP子网的子网地址及其掩码,可以判断这些IP地址是否属于同一个IP子网。
IP地址空间中定义了一些特殊地址:网络/子网地址:标识一个IP网络或子网。
直接广播地址:表示该分组应由特定网络上的所有主机接收和处理。
受限广播地址:表示该分组应由源所在网络或子网上的所有主机接收和处理。
本网络上本主机地址:表示主机自己。
环回地址:用来测试机器的协议软件。
IP分组被交付到最终目的地有两种不同的交付方式:直接交付和间接交付。
交付时首先通过路由选择技术确定交付方式:如果IP分组的目的与交付者在同一个IP网络上,就直接交付该分组至目的站点;如果IP分组的目的与交付者不在同一个IP网络上,就间接交付该分组至下一个路由器(即下一跳站点)。
在以太网上,IP分组是封装在以太帧中发送的,因此发送时除了要有接收站的IP地址(IP 分组中的目的IP地址)外,还需要接收站的MAC地址(以太网帧中的目的MAC地址)。
ARP 协议(RFC 826)实现了IP地址(逻辑地址)到MAC地址(物理地址)的动态映射,并将所获得的映射存放在ARP高速缓存表中。
不同的交付方法将导致不同的ARP解析操作,获取不同的目的物理地址。
直接交付时,交付者直接将IP分组交付给该分组的目的站点,因此交付者使用ARP协议找出IP分组中目的IP地址对应的物理地址。
间接交付时,交付者需要将IP分组交付给下一跳站点,而不是该IP分组的目的端,因此交付者使用ARP协议找出下一跳站点IP地址对应的物理地址。
TCP IP实验报告

《TCP/IP协议》实验报告学院:机械与电子信息学院专业:计算机网络技术学号:姓名:指导教师:2018年 6 月实验一Packet Tracer 6.0的使用一、实验目的通过在Packet Tracer 6.0 添加网络设备,熟悉不同的物理设备及其连接方式,掌握使用Packet Tracer 6.0构建网络的方法,掌握捕获、查看通信信息的方法。
二、实验步骤步骤1、打开Packet Tracer 6.0,添加以下网络节点:1841路由器3台,2950-24 交换机1台,PC三台,服务器1台。
步骤2、选择合适的连接线把设备连接起来。
以太网连线时,交换机与计算机或路由器等设备之间连接用直通线,交叉线用于同种设备(路由器与路由器,交换机与交换机)之间相连或计算机与路由器之间相连。
用直通线吧PC0、PC1、Router0与Switch0的任意端口连接,Router0、Router1和Router2之间需要用交叉线连接,Server0与Router2也要用交叉线连接。
如果连线类型正确,则PC与交换机之间连线上的绿灯马上会点亮。
特别的,为配置路由器,可以用控制台连线把PC2和Router1的Console 端口连接起来,也可以连接到Router1的Auxiliary端口上,但使用方法与连接到控制口时不同。
步骤3、配置设备。
PC的配置可以直接在Packet Tracer 6.0的逻辑拓补图上单击PC图标,打开设备配置窗口,单击Desktop选项卡中的IP Configuration,完成默认网关和ID地址的设置。
依次设置3台PC和服务器0的IP地址,PC0和PC1的默认网关设为192.168.1.1,服务器0的默认网关设为192.168.4.1。
单击需要配置的路由器图标,打开设备配置窗口,单击CLI选项卡,按Enter键出现命令行提示符,然后使用如下命令配置静态路由。
Router>enable #进入特权模式Router#configure terminal #全局配置Router(config)#int f0/0 #配置接口f0/0 Router(config-if)#no shutdown #开启接口Router(config-if)#ip address 192.168.1.1 255.255.255.0随着借口no shutdown 命令的输入,接口连线上的绿灯随时变亮。
tcp ip协议实验报告

tcp ip协议实验报告《TCP/IP协议实验报告》一、实验目的本次实验旨在通过实际操作,加深对TCP/IP协议的理解,掌握其基本原理和工作机制。
二、实验环境1. 操作系统:Windows 102. 软件工具:Wireshark、Putty三、实验内容1. 使用Wireshark监测网络数据包利用Wireshark工具,实时监测网络数据包的传输过程,观察数据包的结构和传输规则,以及TCP/IP协议的工作流程。
2. 使用Putty进行远程连接通过Putty工具,进行远程连接实验,模拟TCP/IP协议在网络通信中的应用场景,了解TCP/IP协议在远程通信中的工作原理。
3. 分析网络数据包结合Wireshark抓包结果和Putty远程连接实验,分析网络数据包的传输过程,探讨TCP/IP协议的数据传输机制,包括数据封装、传输流程和错误处理等方面的内容。
四、实验结果1. 通过Wireshark监测数据包,了解了TCP/IP协议的数据包格式和传输规则,包括TCP头部、IP头部等内容。
2. 利用Putty进行远程连接,实际体验了TCP/IP协议在远程通信中的应用,加深了对TCP/IP协议工作原理的理解。
3. 分析网络数据包,深入探讨了TCP/IP协议的数据传输机制,包括数据封装、传输流程和错误处理等方面的内容。
五、实验总结通过本次实验,我们对TCP/IP协议有了更深入的了解,掌握了其基本原理和工作机制,加强了对网络通信协议的理解和应用能力。
同时,通过实际操作,我们也发现了一些问题和不足之处,为今后的学习和实践提供了一定的参考和指导。
六、参考文献1. 《TCP/IP协议详解》2. 《计算机网络》通过本次实验,我们对TCP/IP协议有了更深入的了解,掌握了其基本原理和工作机制,加强了对网络通信协议的理解和应用能力。
同时,通过实际操作,我们也发现了一些问题和不足之处,为今后的学习和实践提供了一定的参考和指导。
希望通过不断的实践和学习,能够进一步提高对TCP/IP协议的理解和运用能力,为今后的网络通信工作打下坚实的基础。
TCP-IP攻击实验-实验报告

中南大学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)、IP欺骗(IP Spoofing)和DNS欺骗(DNS Spoofing);(2) 路由选择信息协议攻击(RIP Attacks);(3) 源路由选择欺骗(Source Routing Spoofing) ;(4) TCP序列号欺骗和攻击(TCP Sequence Number Spoofing and Attack)。
【实验目的】基于TCP/IP协议进行攻击实验,了解TCP/IP协议的具体机制。
2.实验步骤环境搭建这里我使用三台虚拟机做实验,其中一个用于攻击;另一个用于被攻击;第三个作为观察者使用;把三台主机放在同一个LAN中,其配置信息参照如下所示(实际在实验过程中有所改动):这里我使用的是SEED实验室已经搭建好,并且已经安装好相关的netwox工具箱和Wireshark工具箱的Ubuntu系统,与此同时三台虚拟机都需要打开FTP和Telnet服务:使用如下命令来完成上述任务Start the ftp server# servicevsftpd startStart the telnet server# serviceopenbsd-inetd start实验1:ARP缓存中毒【实验背景】ARP缓存是ARP协议的重要的一部分。
电子科大 tcpip实验报告二(排错工具ping和trace)

电子科技大学实验报告学生姓名:学号:指导教师:日期:年月日实验项目名称:报告评分:教师签字:“PING”这个名字源于声纳定位操作。
PING程序的目的是测试另一台主机是否可达,它发送ICMP回送请求报文给被测主机,并等待返回的ICMP回送应答或差错报告报文。
ICMP协议(RFC 792)是IP协议的辅助协议,提供差错报告和查询机制。
一台主机的可达性不仅取决于IP层是否可达,还取决于使用的高层协议及端口号。
仅当被测主机可达时,PING程序才能收到返回的ICMP回送应答报文,并能测出到该主机的往返时间。
如果被测主机不可达,PING程序会收到一些ICMP 差错报告报文,甚至收不到任何返回信息。
根据ICMP差错报告报文的类型可粗略判定主机不可达的原因。
不同的物理网络具有不同的最大传送单元(MTU)值,因此可能需要对IP 分组进行分片操作使其能够通过这些物理网络。
当IP分组被分片时,需要修改分组头中的标志、分片偏移和总长度值,其余各字段将被复制到所有分片中。
已经分片的IP分组在遇到具有更小MTU的网络时还会被再次分片。
TTL字段是由发送端初始设置在IP分组首部中的一个8 bit字段,不同操作系统上的不同应用程序指定的TTL初始值不同。
路由器在转发每个IP分组时需要将该分组的TTL值减1或减去该分组在路由器中停留的秒数。
由于大多数路由器转发IP分组的时延都小于1秒钟,因此TTL最终成为一个跳站计数器,即分组每经过一台路由器其TTL值被减1。
TTL字段的目的是为了防止分组在选路时被无休止的转发。
当路由器收到一份需转发的IP分组时,如果该分组的TTL值为1,路由器则丢弃该分组,并向分组源发送一份ICMP的TTL超时报文。
TRACE程序使用IP分组首部的TTL字段(生存时间)和ICMP报文,让使用者可以看到IP分组从一台主机传到另一台主机所经过的路由。
TRACE程序首先发送一份TTL值为1的IP分组给目的主机,处理该IP分组的第1个路由器即会返回一份以自己的IP地址为源的携带有ICMP超时报文的IP分组,这样TRACE程序就得到了该路径中第1个路由器的IP地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学实验报告学生姓名:学号:课程名称:TCP/IP协议指导教师:日期:2016 年11 月26日实验项目名称:FTP中的TCP传输服务报告评分:教师签字:一、实验原理FTP协议是一个用于文件传输的应用层协议,采用客户/服务器模式实现文件传输功能,使用 TCP协议提供的面向连接的可靠传输服务。
FTP客户和服务器之间使用 2条 TCP连接来传输文件:控制(TCP端口 21)和数据连接(TCP端口20)。
在整个FTP会话交互过程中,控制连接始终处于连接状态;数据则在每一次文件传送时使用PORT命令或PASV命令打开,文件传送完毕后关闭。
因此整个FTP会话中如果传送多个文件,那么数据连接会打开和关闭多次。
TCP协议(RFC 793)是一个面向连接的、可靠运输层协议,通过建立和接终止这两个过程完成面向连的传输。
TCP的连接建立通常被称为“三向握手”。
在建立TCP连接之前,服务器程序需要向它的TCP模块发出被动打开请求,表示该服务器已经准备好接受客户的连接。
客户程序则要向它TCP模块发出主动打开请求,表示该客户需要连接特定的服务器。
然后即可开始建立该客户需要连接特定的服务器。
然后即可开始建立该客户需要连接特定的服务器。
然后即可开始建立TCP连接。
以客户端主动连接TCP连接为例,TCP连接建立过程如下:(1)客户端TCP发送一个SYN报文段。
该包括源端口号、目的端口号、客户的初始序号、客户可接收的 TCP报文段数据的最大长度(MSS)等信息。
(2)服务器端TCP收到客户端的SYN报文段后,返回一个SYN和ACK报文段。
该报文段使用ACK标志和确认号字段确认已经收到了客户端的SYN报文段,另外对服务器端的报文段进行初始化。
(3)客户端TCP收到服务器端的SYN和ACK报文段后,发送一个ACK报文段。
该报文段使用ACK标志和确认号字段确认已经收到了服务器端的SYN和ACK报文段。
TCP连接中的任何一方(客户或服务器)都可以关闭。
当一方的连接被终止时,另一方还可以继续向对发送数据。
因此,要关闭双向的TCP连接就需要 4个动作。
以客户端主动关闭TCP连接为例,TCP连接终止过程如下:(1)客户端TCP发送一个FIN报文段,宣布它要终止连接。
(2)服务器端TCP收到客户端的FIN报文段后,返回一个ACK报文段,用来确认已收到了客户端的FIN报文段。
(3)服务器端TCP可以在服务器到客户方向上继续发送数据。
当服务器没有更多的数据发送时,就发送一个FIN报文段。
(4)客户端TCP收到服务器端的FIN报文段后,返回一个ACK报文段,用来确认已收到了服务器端的FIN报文段。
二、实验目的1、掌握TCP协议工作原理2、掌握TCP的连接建立和终止过程3、了解FTP会话过程中的控制连接和数据特点三、实验内容实验拓扑中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、确保网络连接中的VMnet1 和VMnet2 均被启用,然后依次启动VMware Workstation 中TCPIP 组内的虚拟机PC2 和Server。
2、运行Dynagen 中的“Network device list”程序,核对确保 文件中R1 的F0/0 值与“Network device list”中VMnet1 的“NIO_gen_eth…”一致,R2 的F0/0 值与“Network device list”中VMnet2 的“NIO_gen_eth…”一致。
然后启动Dynamips Server(直到步骤9 才能关闭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> quit6、在Dynagen窗口中提示符“=> ”后依次输入以下命令重新捕获子网A中的分组:=> no capture R1 f0/0=> capture R1 f0/0 ieftp.cap7、在PC2上用IE 浏览器作为FTP客户机登录同一台FTP 服务器,下载完文本文件tcpip.txt后关闭IE浏览器窗口。
8、在Dynagen窗口中提示符“=>”后输入以下命令停止捕获:=> no capture R1 f0/09、实验结束后,按照以下步骤关闭实验软件、上传实验数据、还原实验环境:(1)在Dynagen窗口中提示符“=> ”后依次输入以下命令关闭Dynagen窗口,然后再关闭Dynamips Server窗口:=> stop /all=> exit(2)依次关闭PC2和Server,再关闭VMware窗口;(3)运行 所在目录下的“ftp.bat”程序来上传实验数据(注意:务必按照“ftp .bat ”程序运行中的提示信息执行正确操作)。
(4)确认实验数据上传成功后,运行所在目录下的“reset.bat”程序还原实验环境(注意:“reset.bat ”程序会自动删除实验数据文件)。
10、用Wireshark软件查看并分析捕获的分组软件查看并分析捕获的组文软件查看并分析捕获的组文软件查看并分析捕获的组文(cmdftp.cap、ieftp.cap)中的FTP会话分组,查看过滤条件为“ip. addr= 1 92.168.22.253”(在Wireshark主窗口界面“过滤工具栏“Filter:”域中输入)。
六、实验数据及结果分析1、按捕获顺序记录步骤6中子网A上捕获的所有TCP报文段,记录信息如下:【分析】1)步骤6中的FTP客户以及FTP服务器之间建立了几条TCP连接?每条连接中双方的IP 地址、TCP端口号和初始序号分别是多少?答:两条连接第一条192.168.11.2 1039 0192.168.22.253 80 1第二条192.168.11.2 1040 0192.168.22.253 21 02)TCP报文段中的窗口值定义是该报文段源端还是目的端的发送窗口还是接收窗口?答:目的端的接收端口。
3)实验中哪些类型的TCP报文段首部中携带有MSS的选项信息?答:标志位有SYN的都有选项信息,首部长28bytes。
2、按捕获顺序记录步骤7中子网A上捕获的所有TCP连接建立、连接终止和连接复位报文段,记录信息如下:【分析】1)步骤7中的FTP客户以及FTP服务器之间建立了几条TCP连接?每条连接中双方的IP 地址、TCP端口号和初始序分别是多少?答:一共建立了两条连接第一条192.168.11.2 1035 0192.168.22.253 21 0第二条192.168.22.253 1035 0192.168.11.2 21 02)步骤6和步骤7的FTP会话交互有哪些不同?解释产生这差异的原因。
答:步骤6中客户选择一个短暂端口号,并使用被动打开吧它发送给sever,Sever就用这个端口创建主动打开,并在熟知端口大于0与其进行数据传输。
步骤7中客户要sever 先选择一个端口号,sever在那个端口奥进行被动打开,并在响应中发送端口号,客户使用这个端口号主动打开。
差异的原因是他们采用不同命令,分别是part命令和pasv命令。
七、实验结论1、需要用哪些参数来标识一条TCP连接?答:需要源目的IP地址,及其端口号。
2、利用记录的TCP报文段信息,在一张时序图中画出步骤6中FTP客户与FTP服务器之间的整个TCP报文段交互过程。
(要求:在图中注明每个TCP报文段的编号、类型、序号和确认号,并标注出每一条TCP连接的连接建立、数据传输和连接终止阶段。
)八、总结及心得体会对TCP协议的三次握手及四次挥手还有FTP会话过程中的控制连接和数据特点有了更深刻的认识。
九、对本实验过程及方法、手段的改进建议抄写两个实验表格太麻烦了。
希望以后能直接将实验数据粘贴过来。