数据包发送和接受程序的实现计算机网络课程设计

上传人:bin****86 文档编号:38516642 上传时间:2018-05-03 格式:DOC 页数:13 大小:291.50KB
返回 下载 相关 举报
数据包发送和接受程序的实现计算机网络课程设计_第1页
第1页 / 共13页
数据包发送和接受程序的实现计算机网络课程设计_第2页
第2页 / 共13页
数据包发送和接受程序的实现计算机网络课程设计_第3页
第3页 / 共13页
数据包发送和接受程序的实现计算机网络课程设计_第4页
第4页 / 共13页
数据包发送和接受程序的实现计算机网络课程设计_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《数据包发送和接受程序的实现计算机网络课程设计》由会员分享,可在线阅读,更多相关《数据包发送和接受程序的实现计算机网络课程设计(13页珍藏版)》请在金锄头文库上搜索。

1、计算机网络课程设计题 目 数据包发送和接受程序的实现 学 院 计算机学院 专 业 软件工程 班 别 10 级(4)班 学 号 姓 名 2012 年 12 月 21 日数据包发送和接受程序的实现数据包发送和接受程序的实现一、设计题目与要求一、设计题目与要求1.设计题目发送 TCP 数据包2.设计要求本设计的功能是填充一个 TCP 数据包,并发送给目的主机。 1)以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port,其 中 SendTCP 是程序名,source_ip 为源端 IP 地址,source_port 为源端口号, dest_i

2、p 为目的地址,dest_port 为目的端口号。 2)其他的 TCP 头部参数请自行设定。 3)数据字段为“This is my homework of network,I am happy!” 。 4)成功发送后在屏幕上输出“send OK” 。三、详细设计三、详细设计本课程设计的目标是发送一个 TCP 数据包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送 TCP 数据包两个部分组成。当应用进程需要通过 TCP 发送时,它就将此应用层报文传送给执行 TCP 协议的传输实体。TCP 传输实体将用户数据加上 TCP 报头,形成 TCP 数据包,在 TCP 数据包上增加 I

3、P 头部,形成 IP 包。如图-1 显示的是 TCP 数据包和 IP 包得关系。TCP 协议的数据传输单位称为报文段,其格式如图-2 所示。报文段报头的长度是 20B60B,选项部分长度最多为40B。TCP 报文段主要包括以下字段。端口号端口号:端口号字段包括源端口号和目的端口号。每个端口号的长度是 16 位,分别表示发送该 TCP 包的应用进程的端口号和接收该 TCP 包的应用进程的端口号。IP 报头TCP 报头TCP 数据IP 数据图-1 TCP 数据包加上 IP 报头形成 IP 包序号序号:长度为 32 位。由于 TCP 协议是面向数据流的,它所传送的报文段可以视为连续的数据流,因此需要

4、给每一字节编号。序号字段的“序号”指的是本报文段数据的第一个字节的序号。确认号确认号:该字段的长度为 32 位,它表示接收端希望接收下一个 TCP 包的第一个字节的序号。报文长度报文长度:该字段长度为 4 位。TCP 报文长度是以 4B 为一个单元来计算的,实际上报文长度在 20B60B 之间。因此这个字段的值在 515 之间。TCP 头部数据源端口号目的端口号序号确认号报文长度 保留 URGACK PSHRSTSYNFIN窗口大小校验和紧急指针选项及填充图-2 TCP 数据包头部的格式保留保留:长度为 6 位,留做今后使用,目前全部置 0.控制控制:这个字段定义了 6 种不同的标志,每一个标

5、志占一位,在同一时间可以设置一位或多位。URG 位为 1 时,表明应尽快把数据传送给应用程序,否则表明允许数据在缓存中存放一段时间。RST 位为 1 时,表明要强制切断连接。SYN 位为 1 时,表明有确立连接的请求,这时,把序号字段的初始值作为序号字段的值,以便开始通信。FIN 位为 1 时,表明发送放已经没有数据发送了。窗口大小窗口大小:长度为 16 位,指向必须紧急处理的数据的位置,因此最多能够传送的数据为 65535B。紧急指针紧急指针:该字段长度为 16,指向必需紧急处理的位置,只有当标志 URG=1 时紧急指针才生效。从 TCP 报头后面的报文数据开始,到紧急指针所指出长度的数据,

6、就是必须紧急处理的数据。选项选项: 该字段可以多达 40B,包括单字节选项和多字节选项。校验和校验和:该字段长度为 16 位,校验和的校验范围包括伪头部,TCP 报头以及应用层来的数据。其计算方法与 IP 协议头部校验和的计算方法一样。伪头部为 12B,它本身并不是TCP 数据包的真头部,只是在计算校验和时,临时和 TCP 数据包连接在一起。伪头部的格式如图-3 所示0 8 16 24 31源 IP 地址目的 IP 地址协议号(6)TCP 长度1.创建一个原始套接字,并设置 IP 头选项 SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_I

7、P); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPE D); 这里,设置了 SOCK_RAW 标志,表示我们声明的是一个原始套接字类型。 为使用发送接收超时设置,必须将标志位置位置为 WSA_FLAG_OVERLAPPED。在本课程 设计中,发送 TCP 包时隐藏了自己的 IP 地址,因此我们要自己填充 IP 头,设置 IP 头操作 选项。其中 flag 设置为 ture,并设定 IP_HDRINCL 选项,表明自己来构造 IP 头。 setsockopt(sock, IPPROTO_IP,

8、IP_HDRINCL, (char *) int timeout=1000; setsockopt(sock, SOL_SOCKET,SO_SNDTIMEO,(char*) 在这里我们使用基本套接字 SOL_SOCKET,设置 SO_SNDTIMEO 表示使用发送超时设置, 超时时间设置为 1000ms。 2.构造 IP 头和 TCP 头 这里, IP 头和 TCP 头以及 TCP 伪部的构造请参考下面它们的数据结构。typedef struct _iphdr /定义 IP 首部 UCHAR h_lenver; /4 位首部长度+4 位 IP 版本号 UCHAR tos; /8 位服务类型 T

9、OS 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 psd_hdr /定义 TCP 伪首部 ULONG saddr; /源地址 U

10、LONG daddr; /目的地址 UCHAR mbz; /没用 UCHAR ptcl; /协议类型 USHORT tcpl; /TCP 长度 PSD_HEADER; typedef struct _tcphdr /定义 TCP 首部 USHORT th_sport; /16 位源端口 USHORT th_dport; /16 位目的端口 ULONG th_seq; /32 位序列号 ULONG th_ack; /32 位确认号 UCHAR th_lenres; /4 位首部长度/6 位保留字 UCHAR th_flag; /6 位标志位 USHORT th_win; /16 位窗口大小 US

11、HORT th_sum; /16 位校验和 USHORT th_urp; /16 位紧急数据偏移量 TCP_HEADER; 3.计算校验和的子函数 在填充数据包的过程中,需要调用计算校验和的函数 checksum 两次,分别用于校验 IP 头和 TCP 头部(加上伪头部) ,其实现代码如下: USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); if(size ) cksum += *(UCHAR*)buffer

12、; cksum = (cksum 16) + (cksum cksum += (cksum 16); return (USHORT)(cksum); 4.流程图 I P I P TC P TC P TC P 4 4、调试分析调试分析本程序流程简单,调试过程中没有出现大的问题。调试过程中没有出现重大的语法错误,主要是运行的结果不理想,和预期的结果有差距。填充数据包的程序部分是不容易出错的。至于数据包的发送,由于是利用函数sendto()来实现的,而 sendto()是面向 UDP 的,将协议类型修改为UDP(Header.proto=IPPROTO_UDP;)后,调试运行成功,问题得到解决。调试

13、时,要添加#include #include #pragma comment(lib,“ws2_32.lib“)不然编译出错。5 5、使用说明使用说明输入:sendtcp 192.168.1.123 100 192.168.1.124 200 ,然后回车,出现 send ok!表示已经正确发送。6 6、源代码源代码#include #include #include #include #include #include #include #include #pragma comment(lib,“ws2_32.lib“)#define IPVER 4 /IP 协议预定 #define MAX_

14、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 伪首部

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号