收藏 分销(赏)

发送TCP数据包.pdf

上传人:二*** 文档编号:4598124 上传时间:2024-10-03 格式:PDF 页数:13 大小:140.82KB
下载 相关 举报
发送TCP数据包.pdf_第1页
第1页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、1发送发送 TCP 数据包数据包1.31.3 相关知识相关知识 编制本程序前要对 TCP 协议有一定的了解。当应用程序有报文需要通过 TCP 发送时,它就将此应用层报文传送给执行 TCP 协议的传输实体。TCP 传输实体将用户数据加上TCP 报头,形成 TCP 数据包,在 TCP 数据包上增加 IP 头部,形成 IP 包。下图显示的是TCP 数据包和 IP 包的关系。TCP 报头TCP 数据IP 数据 IP 报头TCP 协议的传输单元为报文段,其格式如图所示。报文段报头的长度为 20B60B。其中固定长度为 20B,报文段长度最多为 40B。TCP 报文段主要包括以下字段。埠号:埠号字段包括源

2、埠号和目的埠号。每个埠号的长度是 16 位,分别表示发送该 TCP 包的应用进程的埠号和接收该 TCP 包的应用进程的埠号。序号:长度为 32 位。由于 TCP 协议是面向数据流的,它所传送的报文段可以视为连续的数据流,因此需要给每一个字节编号。序号字段的“序号”指的是本报文段数据的第一个字节的顺序号。TCP 头部数据0 15 16 31源端口号目的端口号序号确认号2报头长度保留URGACKPSHRSTSYNFIN窗口大小校验和紧急指针选项及填充确认号:该字段的长度为 32 位,它表示接收端希望接收的下一个 TCP 包的第一个字节的序号。报头长度:该字段长度为 4 位。TCP 报头长度是以 4

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

4、为 65535B。紧急指针:该字段的长度为 16 位,指向必须紧急处理的数据的位置,只有当标志URG=1 时紧急指针才有效。从 TCP 报头后面的报文资料开始,到紧急指针所指出的长度的数据,就是必须紧急处理的数据。选项:该字段可以多达 40B,包括单字节选项和多字节选项。校验和:该字段长度多达 16 位,校验和的校验范围包括伪头部、TCP 报头以及应用层来的数据。其计算方法与 IP 协议头部的校验的计算方法一样。伪头部为 12B,它本身并不是 TCP 数据包的真正头部,只是在计算校验和时,临时和 TCP 数据包连接在一起。伪头部的格式如下图所示。源 IP 地址目的 IP 地址00000000协

5、议号(6)TCP 长度31.41.4 工作环境工作环境 软件:Microsoft Visual C+6.0;硬件:PC 机一台。二二 课程设计分析课程设计分析本课程设计的目标是发送一个 TCP 资料包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送 TCP 数据包两个部分组成。2.12.1 使用原始套接字使用原始套接字SOCKET sock;sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);这里

6、,我们设置了 SOCK_RAW 标志,表示我们声明的是一个原始套接字类型。为使用发送接收超时设置,必须将标志位置位置为 WSA_FLAG_OVERLAPPED。在本课程设计中,发送 TCP 包时隐藏了自己的 IP 地址,因此我们要自己填充 IP 头,设置 IP 头操作选项。其中 flag 设置为 ture,并设定 IP_HDRINCL 选项,表明自己来构造 IP 头。注意,如果设置 IP_HDRINCL 选项,那么必须具有 administrator 权限,要不就必须修改注册表:HKEY_LOCAL_MACHINESystemCurrentControlSetServicesAfdParame

7、ter 修改键:DisableRawSecurity(类型为 DWORD),把值修改为 1。如果没有,就添加。4BOOL 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。2 22 2 定义定义

8、IPIP 头部、头部、TCPTCP 头部和伪头部的数据结构头部和伪头部的数据结构/定义 IP 首部typedef struct _iphdr UCHAR h_lenver;/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

9、sourceIP;/32 位源 IP 地址 ULONG destIP;/32 位目的 IP 地址 IP_HEADER;/定义 TCP 伪首部5typedef struct psd_hdr ULONG saddr;/源地址 ULONG daddr;/目的地址 UCHAR mbz;/没用UCHAR ptcl;/协议类型 USHORT tcpl;/TCP 长度 PSD_HEADER;/定义 TCP 首部typedef struct _tcphdr USHORT th_sport;/16 位源埠 USHORT th_dport;/16 位目的端口 ULONG th_seq;/32 位序列号 ULONG

10、 th_ack;/32 位确认号 UCHAR th_lenres;/4 位首部长度/6 位保留字 UCHAR th_flag;/6 位标志位 USHORT th_win;/16 位窗口大小 USHORT th_sum;/16 位校验和 USHORT th_urp;/16 位紧急数据偏移量 TCP_HEADER;2.32.3 计算校验和的子函数计算校验和的子函数在填充数据包的过程中,需要调用计算校验和的函数 checksum 两次,分别用于校验 IP头和 TCP 头部(加上伪头部),其实现代码如下:USHORT checksum(USHORT*buffer,int size)6 unsigned

11、 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);72.4 程序流程程序流程图图开始结束构造原始套接字,并初始化发送 TCP 资料报计算 TCP 头部校验和填充 IP 头部计算 IP 头部校验和构造 TCP 伪头部填充 TCP 头部8三三 源代码源代码#include#include#include#includ

12、e#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

13、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;9typedef struct tcp_hdr/定义

14、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 位窗口大小 USHORT th_sum;/16 位校验和 USHORT th_urp;/16 位紧急数据偏移量 TCP_HEADER;/CheckSum:计算校验和的子函数 USHORT checksum(USHORT*buffer,int size)u

15、nsigned 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)WSADATA WSAData;SOCKET sock;10 IP_HEADER ipHeader;TCP_HEADER tcpHeader;PSD_HEADER psdHeader;char

16、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)printf(Useage:SendTcp soruce_ip source_port dest_ip dest_port n);return false;if(WSAStartup(MAKEWORD(2,2),&WSAData)

17、!=0)printf(WSAStartup Error!n);return false;if(sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,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

18、!n);return false;nTimeOver=1000;if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeOver,sizeof(nTimeOver)=SOCKET_ERROR)11 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(

19、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)

20、;/32 位目的 IP 地址 /计算 IP 头部检验和 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.tc

21、pl=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 序列号置为 012 /TCP 长度和保留位 tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)4|0);tcpHead

22、er.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),&tcpH

23、eader,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_HEAD

24、ER);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;memset(&dest,0,sizeof(dest);dest.sin

25、_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();13 return false;else printf(send ok!n);closesocket(sock);WSACleanup();return 1;谢谢大家下载,本文档下载后可根据实际情况进行编辑修改.再次谢谢大家下载.翱翔在知识的海洋吧.

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 初中其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服