课设名称:发送TCP数据包班级:学号:姓名:指导老师:日期:2012.6.15计算机网络课程设计报告目录一.设计题目与要求.......................................................................................................................21.设计题目................................................................................................................................22.设计要求................................................................................................................................2二.需求分析...................................................................................................................................2三.详细设计...................................................................................................................................21.创建一个原始套接字,并设置IP头选项..........................................................................32.构造IP头和TCP头.............................................................................................................33.计算校验和的子函数............................................................................................................44.流程图....................................................................................................................................6四.调试分析...................................................................................................................................7五.运行结果...................................................................................................................................7六.总结...........................................................................................................................................8七.源程序.......................................................................................................................................9发送TCP数据包2一.设计题目与要求1.设计题目发送TCP数据包2.设计要求本设计的功能是填充一个TCP数据包,并发送给目的主机。1)以命令行形式运行:TCPsource_ipsource_portdest_ipdest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号,dest_ip为目的地址,dest_port为目的端口号。2)其他的TCP头部参数请自行设定。3)数据字段为“hello”。4)成功发送后在屏幕上输出“sendOK”。二.需求分析1.本程序需完成发送一个TCP数据包给目的主机2.程序的输入:TCPsource_ipsource_portdest_ipdest_port,然后根据提示输入要发送的数据,回车即可。3.程序的输出:SendOK!4.测试数据TCP192.168.1.100200192.168.1.101200三.详细设计本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送TCP数据包两个部分组成。发送TCP数据包31.创建一个原始套接字,并设置IP头选项SOCKETsock;sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);这里,设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。在本课程设计中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,设置IP头操作选项。其中flag设置为ture,并设定IP_HDRINCL选项,表明自己来构造IP头。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。2.构造IP头和TCP头这里,IP头和TCP头以及TCP伪部的构造请参考下面它们的数据结构。typedefstruct_iphdr//定义IP首部{UCHARh_lenver;//4位首部长度+4位IP版本号UCHARtos;//8位服务类型TOSUSHORTtotal_len;//16位总长度(字节)USHORTident;//16位标识USHORTfrag_and_flags;//3位标志位UCHARttl;//8位生存时间TTLUCHARproto;//8位协议(TCP,UDP或其他)发送TCP数据包4USHORTchecksum;//16位IP首部校验和ULONGsourceIP;//32位源IP地址ULONGdestIP;//32位目的IP地址}IP_HEADER;typedefstructpsd_hdr//定义TCP伪首部{ULONGsaddr;//源地址ULONGdaddr;//目的地址UCHARmbz;//没用UCHARptcl;//协议类型USHORTtcpl;//TCP长度}PSD_HEADER;typedefstruct_tcphdr//定义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;3.计算校验和的子函数在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IP头和TCP头部(加上伪头部),其实现代码如下:USHORTchecksum(USHORT*buffer,intsize)发送TCP数据包5{unsignedlongcksum=0;while(size1){cksum+=*buffer++;size-=sizeof(USHORT);}if(size){cksum+=*(UCHAR*)buffer;}cksum=(cksum16)+(cksum&0xffff);cksum+=(cksum16);return(USHORT)(~cksum);}发送TCP数据包64.流程图开始构造原始套接字并初始化填充IP首部计算IP首部校验和构造TCP伪首部填充TCP首部计算TCP首部校验和填充发送缓冲区填入目的地址发送数据包结束发送TCP数据包7四.调试分析本程序流程简单,调试过程中没有出现大的问题。调试过程中没有出现重大的语法错误,主要是运行的结果不理想,和预期的结果有差距。填充数据包的程序部分是不容易出错的。至于数据包的发送,由于是利用函数sendto()来实现的,而sendto()是面向UDP的,将协议类型修改为UDP(Header.proto=IPPROTO_UDP;)后,调试运行成功,问题得到解决。调试时,要添加#includewinsock2.h#includews2tcpip.h#pragmacomment(lib,ws2_32.lib)不然编译出错。五.运行结果1.输入:TCP192.168.1.100200192.168.1.101200发送TCP数据包82.输入要发送的字符串:“hello”按Ctrl+Z发送六.总结通过本次课程设计,我对发送TCP数据包的原理有了一定的了解。理解了TCP数据报的报文格式、TCP连接时的三次握手和TCP连接结束时的四次握手的过程及它们的作用。此外,在设计过程中,通过查阅资料,也让我对TCP的三大特点(流量控制、差错控制、拥塞控制)有了认识。,在课程设计过程中,由于编程知识的欠缺,使我在课程设计过程中不是很顺利,编程知识的欠缺是我的最大障碍,不过,这也给了我动力,我会努力去学好编程的相关知识,为以后的学习和工作打下基础。最后,感谢老师安排了此次课程设计。发送TCP数据包9七.源程序#includestdio.h#includestring.h#includewinsock2.h#includews2tcpip.h#includetime.h#includewindows.h#includestdlib.h#includeiostream.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