计算机网络课程报告-发送TCP数据报_第1页
计算机网络课程报告-发送TCP数据报_第2页
计算机网络课程报告-发送TCP数据报_第3页
计算机网络课程报告-发送TCP数据报_第4页
计算机网络课程报告-发送TCP数据报_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机网络课程设计报告题目:发送TCP数据报问题描述(把你所选的题目及要求说一下)TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。TCP协议在网络层IP协议的基础上,向应用层用户进程提供可靠的、全双工的数据传输流。本课程设计的目的就是设计一个发送TCP数据包的程序,并根据本设计说明TCP数据包的结构以及TCP协议与IP协议的关系,使学生对TCP协议的工作原理有更深入的认识。运行环境:MicrosoftVisualC++6.0概要设计(抽象数据类型定义)本程序的功能是填充一个TCP数据包,并发送给目的主机。以命令行形式运行:SendTCPsourse_ipsourse_portdest_ipdest_port其中,SendTCP为程序名;sourse_ip为源端IP地址;sourse_port为源端口;dest_ip为目的IP地址;dest_port为目的端口。2)其它的TCP头部参数请自行设定。3)数据字段为“Thisismyhomeworkofnetwork,Iamhappy!”。4)发送成功后在屏幕上输出”sendOK”。5)程序流程图如下: 详细设计(主要算法和函数间的调用关系)本课程设计的目标是发送一个TCP资料包,可以利用原始套接字来完 成这个工作。整个程序由初始化原始套接字和发送TCP数据包两个部分 组成。1)使用原始套接字SOCKETsock;sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。在本课程设计中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,设置IP头操作选项。其中flag设置为ture,并设定IP_HDRINCL选项,表明自己来构造IP头。2)超时设置BOOLFlag=TRUE;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&Flag,sizeof(Flag));Inttimeout=1000;setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));在这里我们使用基本套接字SOL_SOCKET,设置SO_SNDTIMEO表示使用发送超时设置,超时时间设置为1000ms。3)定义IP首部typedefstruct_iphdr{UCHARh_lenver;//4位首部长度+4位IP版本号 UCHARtos;//8位服务类型TOS USHORTtotal_len;//16位总长度(字节) USHORTident;//16位标识 USHORTfrag_and_flags;//3位标志位 UCHARttl;//8位生存时间TTL UCHARproto;//8位协议(TCP,UDP或其它)USHORTchecksum;//16位IP首部校验和 ULONGsourceIP;//32位源IP地址ULONG destIP;//32位目的IP地址}IP_HEADER;}定义TCP伪首部 typedefstructpsd_hdr {ULONGsaddr;//源地址 daddr;//目的地址 UCHARmbz; UCHARptcl;//协议类型 USHORTtcpl;//TCP长度}PSD_HEADER;定义TCP首部typedefstruct_tcphdr{USHORTth_sport;//16位源端口号 USHORTth_dport;//16位目的端口ULONGth_seq;//32位序列号ULONGth_ack;//32位确认号UCHARth_lenres;//4位首部长度/6位保留字UCHARth_flag;//6位标志位USHORTth_win;//16位窗口大小USHORTth_sum;//16位校验和USHORTth_urp;//16位紧急数据偏移量}TCP_HEADER;计算校验和的子函数在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IP头和TCP头部(加上伪头部),其实现代码如下:USHORTchecksum(USHORT*buffer,intsize){ unsignedlongcksum=0;while(size>1){ cksum+=*buffer++; size-=sizeof(USHORT);}if(size){ cksum+=*(UCHAR*)buffer;}cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);}调试分析(调式过程中出现的问题及如何改正)此图为第一次运行时出现的错误。错误原因为:当时没有输入源ip地址和目的ip地址。改正:在vc的‘工程->设置’菜单栏中输入源ip地址和目的ip地址,即可运行成功。心得体会(组内成员的分工及实习期间的体会)成员分工张欣:代码的编写与修改,设计报告的数据流程图的设计刘凯莉:代码的调试与分析胡燕:设计报告的完成心得体会这次的课程设计让我们学到了很多东西。最大的收获是学会了TCP数据包的填充和发送。在对TCP数据包进行填充时,首先需要我们去充分了解它的数据结构,在这个过程中可以了解相应字节上应该存放的内容和它们的功能。在实现TCP数据包的发送中,第一次深深接触了网络编程接口socket套接字的相关知识,虽然本次的课程设计只用到了其中一小部分知识,但这并不会影响对这方面知识的全面了解。总之这次的课程设计,让我们对网络中的数据收发有了一定的了解,并激发了对计算机网络的浓厚兴趣。六、用户手册(系统的使用方法介绍)源代码如下:#include<stdio.h>#include<winsock2.h>#include<ws2tcpip.h>#include<time.h>#include<windows.h>#include<string.h>#include<stdlib.h>#include<iostream.h>#pragmacomment(lib,"ws2_32.lib")#defineIPVER4//IP协议预定#defineMAX_BUFF_LEN65500//发送缓冲区最大值typedefstructip_hdr//定义IP首部{UCHARh_verlen;//4位首部长度,4位IP版本号UCHARtos;//8位服务类型TOSUSHORTtotal_len;//16位总长度(字节)USHORTident;//16位标识USHORTfrag_and_flags;//3位标志位UCHARttl;//8位生存时间TTLUCHARproto;//8位协议(TCP,UDP或其它)USHORTchecksum;//16位IP首部校验和ULONGsourceIP;//32位源IP地址ULONGdestIP;//32位目的IP地址}IP_HEADER;typedefstructtsd_hdr//定义TCP伪首部{ULONGsaddr;//源地址ULONGdaddr;//目的地址UCHARmbz;//没用UCHARptcl;//协议类型USHORTtcpl;//TCP长度}PSD_HEADER;typedefstructtcp_hdr//定义TCP首部{USHORTth_sport;//16位源埠USHORTth_dport;//16位目的端口ULONGth_seq;//32位序列号ULONGth_ack;//32位确认号UCHARth_lenres;//4位首部长度/6位保留字UCHARth_flag;//6位标志位USHORTth_win;//16位窗口大小USHORTth_sum;//16位校验和USHORTth_urp;//16位紧急数据偏移量}TCP_HEADER;//CheckSum:计算校验和的子函数USHORTchecksum(USHORT*buffer,intsize){ unsignedlongcksum=0;while(size>1){ cksum+=*buffer++; size-=sizeof(USHORT);}if(size){ cksum+=*(UCHAR*)buffer;}cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);}intmain(intargc,char*argv[]){ WSADATAWSAData; SOCKETsock; IP_HEADERipHeader; TCP_HEADERtcpHeader; PSD_HEADERpsdHeader; charSendto_Buff[MAX_BUFF_LEN];//发送缓冲区 unsignedshortcheck_Buff[MAX_BUFF_LEN];//检验和缓冲区 constchartcp_send_data[]={"Thisismyhomeworkofnetwort,Iamhappy!"}; BOOLflag; intrect,nTimeOver; if(argc!=5) { printf("Useage:SendTcpsoruce_ipsource_portdest_ipdest_port\n"); returnfalse; } if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) { printf("WSAStartupError!\n"); returnfalse; } if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) { printf("SocketSetupError!\n"); returnfalse; } flag=true; if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR) { printf("setsockoptIP_HDRINCLerror!\n"); returnfalse; } nTimeOver=1000; if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeOver,sizeof(nTimeOver))==SOCKET_ERROR) { printf("setsockoptSO_SNDTIMEOerror!\n"); returnfalse; }//填充IP首部 ipHeader.h_verlen=(IPVER<<4|sizeof(ipHeader)/sizeof(unsignedlong)); ipHeader.tos=(UCHAR)0; ipHeader.total_len=htons((unsignedshort)sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data)); ipHeader.ident=0;//16位标识 ipHeader.frag_and_flags=0;//3位标志位 ipHeader.ttl=128;//8位生存时间 ipHto=IPPROTO_UDP;//协议类型 ipHeader.checksum=0;//检验和暂时为0 ipHeader.sourceIP=inet_addr(argv[1]);//32位源IP地址 ipHeader.destIP=inet_addr(argv[3]);//32位目的IP地址//计算IP头部检验和 memset(check_Buff,0,MAX_BUFF_LEN); memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER)); ipHeader.checksum=checksum(check_Buff,sizeof(IP_HEADER));//构造TCP伪首部 psdHeader.saddr=ipHeader.sourceIP; psdHeader.daddr=ipHeader.destIP; psdHeader.mbz=0; psdHeader.ptcl=ipHto; psdHeader.tcpl=htons(sizeof(TCP_HEADER)+sizeof(tcp_send_data));//填充TCP首部 tcpHeader.th_dport=htons(atoi(argv[4]));//16位目的端口号 tcpHeader.th_sport=htons(atoi(argv[2]));//16位源埠号 tcpHeader.th_seq=0;//SYN序列号 tcpHeader.th_ack=0;//ACK序列号置为0//TCP长度和保留位 tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsignedlong)<<4|0); tcpHeader.th_flag=2;//修改这里来实现不同的标志位探测,2是SYN,1是//FIN,16是ACK探测等等 tcpHeader.th_win=htons((unsignedshort)16384);//窗口大小 tcpHeader.th_urp=0;//偏移大小 tcpHeader.th_sum=0;//检验和暂时填为0//计算TCP校验和 memset(check_Buff,0,MAX_BUFF_LEN); memcpy(check_Buff,&psdHeader,sizeof(psdHeader)); memcpy(check_Buff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader)); memcpy(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER),tcp_send_data,sizeof(tcp_send_data)); tcpHeader.th_sum=checksum(check_Buff,sizeof(PSD_HEADER)+sizeof(TCP_HEADER)+sizeof(tcp_send_data));

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论