发送TCP数据包

上传人:飞*** 文档编号:3274163 上传时间:2017-08-01 格式:DOC 页数:20 大小:149KB
返回 下载 相关 举报
发送TCP数据包_第1页
第1页 / 共20页
发送TCP数据包_第2页
第2页 / 共20页
发送TCP数据包_第3页
第3页 / 共20页
发送TCP数据包_第4页
第4页 / 共20页
发送TCP数据包_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《发送TCP数据包》由会员分享,可在线阅读,更多相关《发送TCP数据包(20页珍藏版)》请在金锄头文库上搜索。

1、1四 川 理 工 学 院课 程 设 计 书学院 计算机学院 专业 计算机科学与技术 班级 09 级 04 班 题目 发送 TCP 数据包 教师 王非,何绍荣,陈超 学生 赵清勇,谭凯,唐红琴 2实验分工:程序设计、编写代码 由全小组成员共同完成谭 凯:在 vc 下调试运行程序、文档编写赵清勇:在 dos 下运行检查、初步完成课程设计报告唐红琴:查找资料、整理课程设计报告3目 录一 课程设计准备 .31.1 课程设计目的 .31.2 课程设计的要求 .41.3 相关知识 .41.4 工作环境 .6二 课程设计分析 .62.1 使用原始套接字 .722 定义 IP 头部、TCP 头部和伪头部的数据

2、结构 .82.3 计算校验和的子函数 .102.4 程序流程图 .11三 源代码 .12四 运行结果与运行情况 .18五 自我评析和总结 .19六 参考文献 .204发送 TCP 数据包一 课程设计准备1.1 课程设计目的TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。TCP 协议在网络层 IP 协议的基础上,向应用层用户进程提供可靠的、全双工的数据传输流。本课程设计的目的就是设计一个发送TCP 数据包的程序,并根据本设计说明 TCP 数据包的结构以及TCP 协议与 IP 协议的关系,使学生对 TCP 协议的工作原理有更深入的认识。1.2 课程设计的要求本程序的功能是填充一个 TCP

3、 数据包,并发送给目的主机。1)以命令行形式运行:SendTCP sourse_ip sourse_port dest_ip dest_port其中,SendTCP 为程序名;sourse_ip 为源端 IP 地址;sourse_port 为源埠; dest_ip 为目的 IP 地址;dest_port 为目的埠。2)其它的 TCP 头部参数请自行设定。3)数据字段为“This is my homework of network,I am happy!”。4)发送成功后在屏幕上输出”send OK” 。51.3 相关知识编制本程序前要对 TCP 协议有一定的了解。当应用程序有报文需要通过 TC

4、P 发送时,它就将此应用层报文传送给执行 TCP 协议的传输实体。TCP 传输实体将用户数据加上 TCP 报头,形成TCP 数据包,在 TCP 数据包上增加 IP 头部,形成 IP 包。下图显示的是 TCP 数据包和 IP 包的关系。TCP 报头 TCP 数据IP 数据 IP 报头TCP 协议的传输单元为报文段,其格式如图所示。报文段报头的长度为 20B60B。其中固定长度为 20B,报文段长度最多为40B。 TCP 报文段主要包括以下字段。埠号:埠号字段包括源埠号和目的埠号。每个埠号的长度是16 位,分别表示发送该 TCP 包的应用进程的埠号和接收该 TCP 包的应用进程的埠号。序号:长度为

5、 32 位。由于 TCP 协议是面向数据流的,它所传送的报文段可以视为连续的数据流,因此需要给每一个字节编号。序号字段的“序号”指的是本报文段数据的第一个字节的顺序号。TCP 头部 数据0 15 16 31源端口号 目的端口号序号确认号报头长度保留URG ACK PSH RST SYN FIN 窗口大小校验和 紧急指针6选项及填充确认号:该字段的长度为 32 位,它表示接收端希望接收的下一个 TCP 包的第一个字节的序号。报头长度:该字段长度为 4 位。TCP 报头长度是以 4B 为一个单元来计算的,实际上报头长度在 20B60B 子间。因此这个字段的值在 515 之间。保留:长度为 6 位,

6、留作今后使用,目前全部置 0。控制:这个字段定义了 6 种不同的标志,每个标志占一位,在同一时间可以设置一位或多位。URG 为 1 时,表明有需要紧急处理的数据。ACK 为 1 时,表明确认号的字段有效。PST 位为 1时,表明要强制切断连接。SYN 位为 1 时,表明有确立连接的请求,这时,把序号字段的初始值作为序号字段的值,以便开始通信。FIN 为 1 时,表明发送方已经没有资料发送了。窗口大小:长度为 16 位,窗口对应的数据是以字节为单位的数据,因此最多能够传送的数据为 65535B。紧急指针:该字段的长度为 16 位,指向必须紧急处理的数据的位置,只有当标志 URG=1 时紧急指针才

7、有效。从 TCP 报头后面的报文资料开始,到紧急指针所指出的长度的数据,就是必须紧急处理的数据。选项:该字段可以多达 40B,包括单字节选项和多字节选项。校验和:该字段长度多达 16 位,校验和的校验范围包括伪头部、TCP 报头以及应用层来的数据。其计算方法与 IP 协议头部的校验的计算方法一样。伪头部为 12B,它本身并不是 TCP 数据包的真正头部,只是在计算校验和时,临时和 TCP 数据包连接在一起。伪头部的格式如下图所示。源 IP 地址目的 IP 地址00000000 协议号(6) TCP 长度71.4 工作环境软件:Microsoft Visual C+ 6.0;硬件:PC 机一台。

8、二 课程设计分析本课程设计的目标是发送一个 TCP 资料包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送 TCP 数据包两个部分组成。2.1 使用原始套接字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 标志,表示我们声明的是一个原始套接字类型。为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAP

9、PED。在本课程设计中,发送 TCP 包时隐藏了自己的 IP 地址,因此我们要自己填充 IP 头,设置 IP 头操8作选项。其中 flag 设置为 ture,并设定 IP_HDRINCL 选项,表明自己来构造 IP 头。注意,如果设置 IP_HDRINCL 选项,那么必须具有 administrator 权限,要不就必须修改注册表: HKEY_LOCAL_MACHINESystemCurrentControlSetServicesAfdParameter 修改键:DisableRawSecurity(类型为 DWORD) ,把值修改为 1。如果没有,就添加。 BOOL Flag=TRUE; s

10、etsockopt(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。22 定义 IP 头部、TCP 头部和伪头部的数据结构/定义 IP 首部typedef struct _iphdr 9UCHAR h_lenver; /4 位

11、首部长度+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; /定义 TCP 伪首部typed

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

13、 /6 位标志位 USHORT th_win; /16 位窗口大小 USHORT th_sum; /16 位校验和 USHORT th_urp; /16 位紧急数据偏移量 TCP_HEADER; 2.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; cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); 11return (USHORT)(cksum); 122.4 程序流程 图开始结束构造原始套接字,并初始化发送 TCP 资料报计算 TCP 头部校验和填充 IP 头部计算 IP 头部校验和构造 TCP 伪头部填充 TCP 头部13三 源代码#include #include #include #include #include #in

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 咨询培训

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