2022年网络课程设计任务书 .pdf
1 计算机网络原理课程设计说明书发送 TCP 数据包起止日期:2010年 06月 28 日 至 2010年 07 月 02 日学生姓名班级学号成绩指 导 教 师 ( 签 字 )计算机与通信学院2010 年 7 月 02 日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 2 湖南工业大学课程设计任务书2009 2010 学年第二学期计算机与通信学院(系、部)通信工程专业071 班级课程名称:计算机网络原理设计题目:发送 TCP数据包完成期限:自2010 年 6 月 28 日至2010 年 7 月 02 日共1 周内容及任务主要内容:1. 本程序的功能是填充一个TCP数据包,并发送给目的主机。2. 以命令行形式运行: SendTCP source_ip source_port dest_ip dest_port 其中 SendTCP为程序名; source_ip为源 IP 地址; source_port为源端口;dest_ip为目的 IP 地址; dest_port为目的端口。3. 其他的 TCP 头部参数自行设定。4. 数据字段为“ This is my homework of network!”. 5. 成功发送后在屏幕上输出“send OK”。进度安排起止日期工作内容2010.6.28 分组、任务分配、课题理解2010.6.29 查阅资料、算法分析设计、完成流程图的设计2010.6.30 了解初始化原始套接字2010.7.1 了解并且熟悉发送TCP 数据包的过程2010.7.2 程序调试、演示和答辩、修改设计说明书、个人总结主要参考资料1 谢希仁 .计算机网络 (第五版 ).电子工业出版社.2008 2 吴功宜 .计算机网络(第二版 ).清华大学出版社.2008 3 吴功宜 .计算机网络课程设计.机械工业出版社.2005(校图书馆:TP393.466)4 吴英 .计算机网络软件编程指导书.清华大学出版社.2008 5 徐明伟 .计算机网络原理实验教程.机械工业出版社.2008指 导 教 师 (签字):年月日系 ( 教 研 室 ) 主 任 ( 签字) :年月日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 3 课题名称计算机网络原理人数3 组长同组人员课题的主要内容和要求主要内容:1. 本程序的功能是填充一个TCP 数据包,并发送给目的主机。2. 以命令行形式运行: SendTCP source_ip source_port dest_ip dest_port 其中 SendTCP为程序名; source_ip为源 IP 地址; source_port为源端口;dest_ip为目的 IP 地址; dest_port为目的端口。3. 其他的 TCP 头部参数自行设定。4. 数据字段为“ This is my homework of network!”. 5. 成功发送后在屏幕上输出“send OK”。主要要求:1算法正确,程序运行正常、输出清晰。2遵循良好的编程规范,程序要有合适的注释。3编程所使用的操作系统、 语言、开发环境不限, 但要在设计说明书中注明。4设计说明书逻辑清晰,主要算法用流程图表述,书写规范。具体任务1. 初始化原始套接字2. 发送 TCP数据包时间安排与完成情况6 月 28 号, 查找好相关资料、理解原理、并分配好任务6 月 29 号, 熟悉了解初始化原始套接字的过程6 月 30 号, 熟悉并且了解发送数据包的过程7 月 01 号, 把两者结合起来,实现程序的功能7 月 02 号,编写调试,并且撰写课程设计报告名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 4 一、设计目的:设计一个发送 TCP数据包的程序,并根据本设计说明TCP 数据包的结构以及 TCP 协议与 IP 协议的关系, 使大家对 TCP 协议的工作原理有更深入的认识。二、设计要求:本程序的功能是填充一个TCP 数据包,并发送给目的主机。?以命令行形式运行: Send TCP source_ip source_port dest_ip dest_port 。 其中 SendTCP为程序名;source_ip为源 IP 地址; source_port为源端口;dest_ip为目的 IP 地址; dest_port为目的端口。?其他的 TCP 头部参数自行设定。?数据字段为“ This is my homework of network!”. ?成功发送后在屏幕上输出“send OK! ” 。三、设计分析:?使用原始套接字?定义 IP 头部、 TCP 头部和伪头部的数据结构?填充数据包?发送数据包四、设计思想:本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送TCP数据包两个部分组成。创建一个原始套接字,并设置IP 头选项SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者:sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); 设置 SOCK_RAW 标志,表示我们声明的是一个原始套接字类型。为 使 用 发 送 接 收 超 时 设 置 , 必 须 将 标 志 位 置 位 置 为名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - 5 WSA_FLAG_OVERLAPPED 。在本课程设计中,发送TCP 包时隐藏了自己的IP 地址, 因此我们要自己填充IP 头, 设置 IP 头操作选项。其中 flag 设置为 ture,并设 定IP_HDRINCL 选项 ,表 明自己 来构 造 IP 头 。 注 意, 如果 设置IP_HDRINCL 选项, 那么必须具有administrator权限, 要不就必须修改注册表:HKEY_LOCAL_MACHINESystemCurrentControlSetServicesAfdParameter 修改键: DisableRawSecurity(类型为 DWORD) ,把值修改为1。如果没有,就添加。BOOL Flag=TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&Flag, sizeof(Flag); int timeout=1000;setsockopt(sock, SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout); 在这里我们使用基本套接字SOL_SOCKET,设置 SO_SNDTIMEO 表示使用发送超时设置,超时时间设置为1000ms。构造 IP 头和 TCP 头这里,IP 头和 TCP 头以及 TCP 伪部的构造请参考下面它们的数据结构。计算校验和的子函数在填充数据包的过程中,需要调用计算校验和的函数checksum 两次,分别用于校验IP 头和 TCP头部(加上伪头部) ,其实现代码如下:USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); if(size ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 6 cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0 xffff); cksum += (cksum 16); return (USHORT)(cksum); 五、程序流程图:构 造原 始 套 接 字 , 并 初始 化开始填 充 IP 头 部计 算 IP 头部 检 验 和构 造 T C P 伪 头 部填 充T C P 头 部计 算 T C P 头 部 校 验 和发 送 T C P 数 据 报结束名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 7 六、源程序代码:#include #include #include #include #include #include #include #include #pragma comment(lib,ws2_32.lib)#define IPVER 4 /IP 协议预定#define MAX_BUFF_LEN 65500 /发送缓冲区最大值typedef struct ip_hdr /定义 IP 首部 UCHAR h_verlen; /4 位首部长度 ,4 位 IP 版本号UCHAR tos; /8 位服务类型TOS USHORT total_len; /16 位总长度(字节)USHORT ident; /16 位标识USHORT frag_and_flags; /3 位标志位UCHAR ttl; /8 位生存时间TTL UCHAR proto; /8 位协议(TCP, UDP 或其他 ) USHORT checksum; /16 位 IP 首部校验和ULONG sourceIP; /32 位源 IP 地址ULONG destIP; /32 位目的 IP 地址IP_HEADER; typedef struct tsd_hdr / 定义 TCP 伪首部 ULONG saddr; /源地址ULONG daddr; /目的地址UCHAR mbz; /没用UCHAR ptcl; /协议类型USHORT tcpl; /TCP 长度PSD_HEADER; typedef struct tcp_hdr / 定义 TCP 首部 USHORT th_sport; /16 位源端口USHORT th_dport; /16 位目的端口ULONG th_seq; /32 位序列号ULONG th_ack; /32 位确认号名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - 8 UCHAR th_lenres; /4 位首部长度 /6 位保留字UCHAR th_flag; /6 位标志位USHORT th_win; /16 位窗口大小USHORT th_sum; /16 位校验和USHORT th_urp; /16 位紧急数据偏移量TCP_HEADER; /CheckSum:计算校验和的子函数USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); if(size) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0 xffff); cksum += (cksum 16); return (USHORT)(cksum); int main(int argc, char* argv) WSADA TA WSAData; SOCKET sock; IP_HEADER ipHeader; TCP_HEADER tcpHeader; PSD_HEADER psdHeader; char Sendto_BuffMAX_BUFF_LEN; /发送缓冲区unsigned short check_BuffMAX_BUFF_LEN; /检验和缓冲区const char tcp_send_data=This is my homework of networt,I am happy!; BOOL flag; int rect,nTimeOver; if (argc!= 5) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - 9 printf(Useage: SendTcp soruce_ip source_port dest_ip dest_port n); return false; if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) printf(WSAStartup Error!n); return false; if(sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RA W,NULL,0, WSA_FLAG_OVERLAPPED)=INVALID_SOCKET) printf(Socket Setup Error!n); return false; flag=true; if(setsockopt(sock,IPPROTO_IP ,IP_HDRINCL,(char*)&flag,sizeof(flag)= SOCKET_ERROR) printf(setsockopt IP_HDRINCL error!n); return false; nTimeOver=1000; if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver)=SOCKET_ERROR) printf(setsockopt SO_SNDTIMEO error!n); return false; /填充 IP 首部ipHeader.h_verlen=(IPVER4 | sizeof(ipHeader)/sizeof(unsigned long); ipHeader.tos=(UCHAR)0; ipHeader.total_len=htons(unsigned short)sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data); ipHeader.ident=0; /16 位标识ipHeader.frag_and_flags=0; /3 位标志位ipHeader.ttl=128; /8 位生存时间ipHeader.proto=IPPROTO_UDP; / 协议类型ipHeader.checksum=0; / 检验和暂时为0 ipHeader.sourceIP=inet_addr(argv1); /32 位源 IP 地址ipHeader.destIP=inet_addr(argv3); /32 位目的 IP 地址/计算 IP 头部检验和名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - 10 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=ipHeader.proto; psdHeader.tcpl=htons(sizeof(TCP_HEADER)+sizeof(tcp_send_data); /填充 TCP 首部tcpHeader.th_dport=htons(atoi(argv4); /16 位目的端口号tcpHeader.th_sport=htons(atoi(argv2); /16 位源端口号tcpHeader.th_seq=0; /SYN 序列号tcpHeader.th_ack=0; /ACK 序列号置为0 /TCP 长度和保留位tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)4|0); tcpHeader.th_flag=2; /修改这里来实现不同的标志位探测,2 是 SYN, 1 是/FIN ,16 是 ACK 探测等等tcpHeader.th_win=htons(unsigned short)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); /填充发送缓冲区memset(Sendto_Buff,0,MAX_BUFF_LEN); memcpy(Sendto_Buff,&ipHeader,sizeof(IP_HEADER); memcpy(Sendto_Buff+sizeof(IP_HEADER),&tcpHeader, sizeof(TCP_HEADER); memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER), tcp_send_data,sizeof(tcp_send_data); int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+ sizeof(tcp_send_data); /发送数据报的目的地址SOCKADDR_IN dest; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - 11 memset(&dest,0,sizeof(dest); dest.sin_family=AF_INET; dest.sin_addr.s_addr=inet_addr(argv3); dest.sin_port=htons(atoi(argv4); rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest); if (rect=SOCKET_ERROR) printf(send error!:%dn,WSAGetLastError(); return false; else printf(send ok!n); closesocket(sock); WSACleanup(); return 1; 七、实验运行结果:所以进入 dos, 并进入到该可执行文件的目录下后在命令提示行下输入:sendtcp 192.168.18.3 12 192.168.18.7 25,回车运行,运行截图如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 12 本课程设计小结:在对 TCP数据包头部进行填充时, 首先需要我们去充分了解它的数据结构,在这个过程中可以了解相应字节上应该存放的内容和它们的功能。由于本次的课程设计只要求填充一个TCP数据包,然后将其发送出去,使用的数据发送函数是 sendto(),成功地完成 sendto()调用只能保证数据已经从本地发送出去,并不意味着数据传送到达目的地。四、心得体会经过此次计算机网络原理课程设计我学到了很多知识和学习方法,更加深了我对计算机网络原理课程的理解。在此次的计算机网络课程设计中,我们一共做了三个程序设计的实验,帧封装、IP 数据包解析和发送TCP数据包。由于时间局限,最后我只选择了TCP数据包的发送作为课程设计答辩。在开始编写程序的时候,我们束手无策,后来在参考了别人的程序之后,我开始有了一点头绪,于是开始动手编写程序了,幸好我之前C+ 学得不错,在编写完部分程序以后,经调试慢慢的修改了一些错误,但是最终使得程序还是能够运行!此次课程设计,对我来说不仅是一种量的升级,更是一种质的升级。虽然在此次过程中我还是遇到了不少的问题,但是最后在组长和老师的帮助下,我终于完成了在这次课程设计中的任务。此次课程设计,在编写程序的过程中,我用到了很多的函数,这些函数的运用使得程序简便而且正确的运行出来。为了正确的实现这些函数,我们查阅了很多相关的资料,从中获得了大量的有用的信息,收获也颇丰富。总的来说,这次设计让我受益匪浅。此次课程设计不仅增强了我的思维能力,也增强了我的动手能力,为我以后的学习和工作奠定了良好的基础。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -