发送TCP数据包_第1页
发送TCP数据包_第2页
发送TCP数据包_第3页
发送TCP数据包_第4页
发送TCP数据包_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上专心-专注-专业课程设计任务书课程设计任务书题目六题目六: : 发送发送 TCPTCP 数据包数据包初始条件:初始条件:1) 学习相关知识;2) C/C+/VC/VB/JAVA 语言;3) PC 机一台;要求完成的主要任务要求完成的主要任务: : (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)本设计的功能是填充一个 TCP 数据包,并发送给目的主机。程序具体要求如下:1) 以命令行形式运行:SendTCP、source_ip、source_port、dest_ip、dest_port,其中 SendTCP 是程序名,source_ip 为源端 IP 地址

2、,source_port 为源端口号,dest_ip 为目的地址,dest_port 为目的端口号;2) 其他的 TCP 头部参数请自行设定;3) 数据字段为“This is my homework of network ,I am happy !”4) 成功发送后在屏幕上输出“Send OK” 。时间安排:时间安排: 2008 年 6 月 22 日27 日 (第 18 周)第一、二天:查阅资料,学习算法第三、四天:编程调试第五天:书写报告指导教师签名:指导教师签名: 20082008 年年 6 6 月月 2020 日日系主任(或责任教师)签名:系主任(或责任教师)签名: 20082008 年

3、年 6 6 月月 2020 日日目目 录录精选优质文档-倾情为你奉上专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业发送 TCP 数据包摘要在这个课程设计中,主要多对 TCP 数据包的结构以及 TCP 协议与 IP 协议的关系进行了说明。在 Linux 环境下,用 C 语言编程,设计一个服务器程序(Server) ,一个客户端程序(Client) ,由服务器向客户端发送数据。在设计的过程中,需要对 IP 首部、TCP 首部和伪首部定义数据结构,并且填充 IP 数据包和 TCP 数据包。在填充数据包的过程中,需要调用两次计算校验和的函数,分别用于校验 IP 头和 TCP 头部(加上伪头

4、部) 。在发送数据包的过程中,要填充发送缓冲区并填入数据报的目的地址。这样整个发送过程就结束了。相对而言,客户端程序比较简单。关键字 TCP,IP,伪头部,校验和,源 IP 地址,源端口号,目的 IP 地址,目的端口号0引言计算机网络课程是一门很重要的专业课,它主要是对各个层的协议做了详细的介绍,学习这门课程我们就必须掌握各个层的协议的工作原理。OSI 模型有 7 个不同的层,分为两个组。上面三层定义了中断系统中的应用程序将被彼此通信,以及如何与用户通信。下面 4层定义了三怎样进行端到端的数据传输。FOSI 参考模型的 7 层和各层的功能 1. Application layer (应用层)文

5、件、打印、消息、数据库和应用程序 uvQ7 2. Presentation layer(表示层) 数据加密、压缩和转换服务?C6 3. Session layer (会话层)会话控制 vH 4. Transport layer(传输层) 端到端连接 lz6k 5. Network layer (网络层)路由选择 0 1 ) sum += *w+; nleft -= 2; if( nleft = 1 )精选优质文档-倾情为你奉上专心-专注-专业 *(u_char *)(&value) = *(u_char *)w; sum += value; sum = ( sum 16 ) + ( s

6、um & 0 xffff ); sum += ( sum 16 ); return value;43 填充数据包 在填充数据包的过程中,我们不仅要填充 TCP 头部,还要填充 IP 头部。同时,为了填充校验和,我们还要对 TCP 伪头部进行填充。/填充 IP 首部ip.h_verlen = ( 4 4 | sizeof(struct iphdr) / sizeof(unsigned long) ); ip.tos = 0; ip.total_len = htons(PACKLEN); ip.frag_and_flags = 0 x40; ip.ident = 13; ip.ttl =

7、255; to = IPPROTO_TCP; ip.sourceIP = inet_addr(src_ip); ip.destIP = inet_addr(dst_ip); ip.checksum = 0; /填充 TCP 首部 tcp.th_sport = htons(atoi(src_port); tcp.th_dport = htons(atoi(dst_port);精选优质文档-倾情为你奉上专心-专注-专业 tcp.th_seq = htonl(SEQ); tcp.th_ack = htonl(0); tcp.th_lenres= (sizeof(struct tcphdr

8、) / 4 4 | 0 ); tcp.th_flag = 2; tcp.th_win = htons(512); tcp.th_sum = 0; tcp.th_urp = 0; /构造 TCP 伪首部 pseuhdr.saddr = ip.sourceIP; pseuhdr.daddr = ip.destIP; pseuhdr.reserved = 0 ; to = to; pseuhdr.len = htons( TCPLEN + TROJANLEN ); /TCP 校验和tcp.th_sum = in_cksum( (unsigned short *)da

9、ta_buf,( PSELEN + TCPLEN + TROJANLEN + data_len ) );44 发送数据包 填充完 TCP 包后,最后的工作就是把数据包发送出去。 /填充发送缓冲区 memcpy(data_buf,&pseuhdr,PSELEN); memcpy(data_buf + PSELEN,&tcp,TCPLEN); memcpy(data_buf + PSELEN + TCPLEN,&trojan,TROJANLEN); memcpy(data_buf,&ip,IPLEN);精选优质文档-倾情为你奉上专心-专注-专业 memcpy(dat

10、a_buf + IPLEN,&tcp,TCPLEN); memcpy(data_buf + IPLEN + TCPLEN,&trojan,TROJANLEN); /发送数据报的目的地址 remote.sin_family = AF_INET; remote.sin_port = tcp.th_dport; remote.sin_addr.s_addr = ip.destIP; if( (s_len = sendto( sock_id,data_buf,PACKLEN,0,(struct sockaddr *)&remote,sizeof(struct sockaddr)

11、 ) 0 ) perror(- sendto); exit(1); /发送成功printf(+ Packet Successfuly Sending %d size.n,s_len);45 执行程序451先写文件 hello.txt 输入内容,放在/root 下。文字如下:This is my homework of network,I am happy!452打开客户端,使用命令./client hello2.txt 后面那个参数是传送给这个文件使用这个命令后,就会在/root 目录下生成一个新的文件 hello2.txt。453客户端等待信号:精选优质文档-倾情为你奉上专心-专注-专业45

12、4打开服务器端,键入 ./ server 12345 12345 hello.txt455传送数据,服务器端显示:456传送成功,客户端显示:457看 hello2.txt 里面的数据:46 分析程序没文件的错误,或者 ip 填错了,则会显示如果提示:精选优质文档-倾情为你奉上专心-专注-专业如果键入的参数不符合,程序也会做出提示,重新输入参数:在运行程序的过程中,先打开客户端程序,等待信号的输入,然后再打开服务器端,准备发送数据。5. 设计中遇到的问题51首先得熟悉 linux 的命令,这是在 linux 下编程的基础。编译 gcc目标文件名源文件名运

13、行 ./*.out52发送 TCP 数据包的程序内容多,但是结构简单清晰。要对包的每项内容搞清楚,并定义相应的数据结构,从而对 IP 首部,TCP 首部和 TCP 伪头部给予相应的数据结构定义。另外在数据包的填充过程中,也要对 IP 首部,TCP 首部和伪首部分别填充。设计到的一个子函数,计算校验和,在老师所给的资料中已有,可以引用。6设计后的感想及收获61 设计后对计算机网络课程的认识计算机网络是一门比较重要的专业课,它设计的内容主要就是协议。对各个层的协议搞清楚了,并对其相应的算法有一定的了解就掌握了计算机网络这门课程。TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。TCP 协议

14、在网络层 IP 协议的基础上,向应用层用户进程提供可靠的、全双工的数据流传输。TCP 传输实体将用户数精选优质文档-倾情为你奉上专心-专注-专业据加上 TCP 报头,形成 TCP 数据包,在 TCP 数据包上增加 IP 头部,形成 IP 包,这就是 TCP数据包和 IP 数据包的关系。62 自己此次课程设计的收获在做这个实验的过程中,我查阅了很多资料,自己收获颇深。通过做发送 TCP 数据包的课程设计,让我对刚刚熟悉的 Linux 有了进一步了解,对 Linux 下 C 编程更加熟悉了。同时,我还对 TCP 数据包的传送有了更深刻的认识,了解了 TCP 数据包、IP 数据包的格式,并了解了 T

15、CP 协议与 IP 协议的关系,让我对 TCP 协议的工作原理有了更深入的认识。7. 致谢首先感谢学校及老师给了我们这次上机实习的机会。虽然它与实际生活联系不是太密切,但毕竟让我们感到了实战的感觉。在实践编程过程中积累了宝贵的经验。与此同时,在编程序过程中,进一步提高了对操作系统的认识,发现了许多问题,更学到了许多知识。 在这次课程设计中,我不但出现的错误主要是在同学的指导下得到解决的,同学热情帮助,而且不厌其烦地为我解答问题。在此,我真诚地向他们表达最深诚的谢意。参考文献1 谢希仁编, 计算机网络 ,电子工业出版社。2 吴功宣编, 计算机网络课程设计 ,机械工业出版社。3 杨树青编, Lin

16、ux 环境下 C 编程指南 ,清华大学出版社。精选优质文档-倾情为你奉上专心-专注-专业源程序/* SERVER: by cecily*/#include #include #include #include #include #include #include #define MAXSIZE 65535#define DATASIZE 1024#define SEQ 12345#define TROJAN_ID 6789#define IPLEN sizeof(struct iphdr)#define TCPLEN sizeof(struct tcphdr)#define PACKLEN s

17、izeof(struct iphdr) + sizeof(struct tcphdr) + sizeof(unsigned int) + sizeof(unsigned int) + strlen(trojan.data)#define PSELEN sizeof(struct psehdr)#define TROJANLEN sizeof(unsigned int) + sizeof(unsigned int) + strlen(trojan.data)/ip 数据报首部struct iphdr unsigned char h_verlen; /版本首部长度 unsigned char to

18、s; /服务类型 unsigned short total_len; /总长度 unsigned short ident; /标识 unsigned short frag_and_flags; /标志和片偏移 unsigned char ttl; /生存时间 unsigned char proto; /协议 unsigned short checksum; /校验和 unsigned int sourceIP; /源端 IP 地址 unsigned int destIP; /目的地址;精选优质文档-倾情为你奉上专心-专注-专业struct tcphdr /tcp 数据报首部 unsigned

19、short th_sport; /源端口 unsigned short th_dport; /目的端口 unsigned int th_seq; /序号 unsigned int th_ack; /确认号 unsigned char th_lenres; /数据偏移&保留 unsigned char th_flag; /标志 unsigned short th_win; /窗口 unsigned short th_sum; /校验和 unsigned short th_urp; /紧急指针;struct psehdr /伪首部 unsigned long saddr; unsigned

20、 long daddr; unsigned char reserved; unsigned char proto; unsigned short len;struct trojan_packet unsigned int trojan_id; unsigned int datalen; char dataDATASIZE;void usage(char *pro);unsigned short in_cksum(unsigned short *addr,int len);int tcpsend(char *src_ip,char *src_port,char *dst_ip,char *dst

21、_port,char *data);void usage(char *pro) fprintf(stdout,%s n,pro); exit(0);unsigned short in_cksum(unsigned short *addr,int len) /计算校验和 register int sum = 0; register u_short *w = addr; register int nleft = len;精选优质文档-倾情为你奉上专心-专注-专业 u_short value =0; while( nleft 1 ) sum += *w+; nleft -= 2; if( nleft

22、 = 1 ) *(u_char *)(&value) = *(u_char *)w; sum += value; sum = ( sum 16 ) + ( sum & 0 xffff ); sum += ( sum 16 ); return value;int tcpsend(char *src_ip,char *src_port,char *dst_ip,char *dst_port,char *data) /发送 tcp 数据包 struct iphdr ip; struct tcphdr tcp; struct psehdr pseuhdr; struct trojan_

23、packet trojan; struct sockaddr_in remote; char data_bufMAXSIZE; int sock_id; int data_len; int flag=1; int s_len; if( ( sock_id = socket(AF_INET,SOCK_RAW,IPPROTO_TCP) ) -1 ) perror(- socket); exit(1); if( setsockopt(sock_id,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(flag) 0 ) perror(- setsockopt

24、); exit(1); trojan.trojan_id = htons(TROJAN_ID); data_len = strlen(data); strcpy(trojan.data,data);精选优质文档-倾情为你奉上专心-专注-专业 trojan.datalen = data_len; ip.h_verlen = ( 4 4 | sizeof(struct iphdr) / sizeof(unsigned long) ); ip.tos = 0; ip.total_len = htons(PACKLEN); ip.frag_and_flags = 0 x40; ip.ident = 1

25、3; ip.ttl = 255; to = IPPROTO_TCP; ip.sourceIP = inet_addr(src_ip); ip.destIP = inet_addr(dst_ip); ip.checksum = 0; tcp.th_sport = htons(atoi(src_port); tcp.th_dport = htons(atoi(dst_port); tcp.th_seq = htonl(SEQ); tcp.th_ack = htonl(0); tcp.th_lenres= (sizeof(struct tcphdr) / 4 4 | 0 ); tcp.t

26、h_flag = 2; tcp.th_win = htons(512); tcp.th_sum = 0; tcp.th_urp = 0; pseuhdr.saddr = ip.sourceIP; pseuhdr.daddr = ip.destIP; pseuhdr.reserved = 0 ; to = to; pseuhdr.len = htons( TCPLEN + TROJANLEN ); memcpy(data_buf,&pseuhdr,PSELEN); memcpy(data_buf + PSELEN,&tcp,TCPLEN); me

27、mcpy(data_buf + PSELEN + TCPLEN,&trojan,TROJANLEN); tcp.th_sum = in_cksum( (unsigned short *)data_buf,( PSELEN + TCPLEN + TROJANLEN + data_len ) ); memcpy(data_buf,&ip,IPLEN); memcpy(data_buf + IPLEN,&tcp,TCPLEN); memcpy(data_buf + IPLEN + TCPLEN,&trojan,TROJANLEN); remote.sin_family

28、 = AF_INET; remote.sin_port = tcp.th_dport; remote.sin_addr.s_addr = ip.destIP;精选优质文档-倾情为你奉上专心-专注-专业 if( (s_len = sendto( sock_id,data_buf,PACKLEN,0,(struct sockaddr *)&remote,sizeof(struct sockaddr) ) 0 ) perror(- sendto); exit(1); printf(+ Packet Successfuly Sending %d size.n,s_len);/ printf(%

29、s,trojan.data); close(sock_id);int main(int argc,char *argv) char bufferDATASIZE = 0; char tempDATASIZE; int fd; int fd1; int n_char; if( argc 6 ) usage(argv0); if( (fd = open(argv5,O_RDONLY) 0 ) buffern_char = 0; tcpsend(argv1,argv2,argv3,argv4,buffer); close(fd); printf(+ Done.n); return 0;/* CLIE

30、NT: by cecily 精选优质文档-倾情为你奉上专心-专注-专业*/#include #include #include #include #include #define DEBUG#define DATASIZE 1024#define SEQ 12345#define TROJAN_ID 6789#define PACKETLEN sizeof(struct iphdr) + sizeof(struct tcphdr) + sizeof(struct trojan_packet)#define PORT 61#define PID 14844struct iphdr unsigne

31、d char h_verlen; unsigned char tos; unsigned short total_len; unsigned short ident; unsigned short frag_and_flags; unsigned char ttl; unsigned char proto; unsigned short checksum; unsigned int sourceIP; unsigned int destIP;struct tcphdr unsigned short th_sport; unsigned short th_dport; unsigned int

32、th_seq; unsigned int th_ack; unsigned char th_lenres; unsigned char th_flag; unsigned short th_win; unsigned short th_sum; unsigned short th_urp;精选优质文档-倾情为你奉上专心-专注-专业struct trojan_packet unsigned int trojan_id; unsigned int datalen; char dataDATASIZE;struct tpacket struct iphdr ip; struct tcphdr tcp; struct trojan_packet trojan;void usage(char *help);void wait_tcp_signal(int fd);void usage(char *pro) fprintf(stdout, usage : %s n,pro); exit(0);void wait_tcp_signal(int fd) struct tpacket *packet; int sock_id; int

温馨提示

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

评论

0/150

提交评论