发送TCP数据包

上传人:公**** 文档编号:562709532 上传时间:2023-01-28 格式:DOCX 页数:13 大小:75.23KB
返回 下载 相关 举报
发送TCP数据包_第1页
第1页 / 共13页
发送TCP数据包_第2页
第2页 / 共13页
发送TCP数据包_第3页
第3页 / 共13页
发送TCP数据包_第4页
第4页 / 共13页
发送TCP数据包_第5页
第5页 / 共13页
点击查看更多>>
资源描述

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

1、沈阳理工大学课程设计专用纸目录摘要1 课程设计目的 ii2 课程设计要求 13 相关知识 14 课程设计分析 45 程序代码 56 运行结果与分析 117 参考文献 11沈阳理工大学课程设计专用纸摘要发送TCP数据包这个程序是基于VC+环境设计的,以C+程序设计语 言设计的控制台程序,实现了发送TCP数据包的主要功能。根据题目需求分析,划分程序总体功能模块,设计类的数据成员及成员 函数,根据功能模块,设计程序流程图。在这个课程设计中 主要多对TCP数据包的结构以及TCP协议与IP协议的关 系进行了说明。在Linux环境下 用C语言编程 设计一个服务器程序Server 一个客户端程序Client

2、由服务器向客户端发送数据。在设计的过程中 需要 对IP首部、TCP首部和伪首部定义数据结构 并且填充IP数据包和TCP数据 包。在填充数据包的过程中需要调用两次计算校验和的函数 分别用于校验 IP头和TCP头部 加上伪头部。在发送数据包的过程中要填充发送缓冲区并 填入数据报的目的地址。这样整个发送过程就结束了。相对而言,客户端程 序比较简单。最后,是系统测试与分析,给出程序运行结果图,并分析运行的正确性。关键词:TCP数据包;IP;伪头部;校验和;源IP地址;源端口号;目的IP 地址;目的端口号;C+1 课程设计目的TCP协议是一种面向连接的、可靠的传输层协议,在网络层的IP协议的基 础上,向

3、应用层的用户进程提供可靠的、全双工的数据流传输。本课程设计 的主要目的是通过TCP数据包的发送,了解TCP协议的工作原理与TCP包的 基本格式。2 课程设计要求根据后面介绍的TCP包基本格式,编写程序向特定主机发送一个TCP包。1)以命令形式运行:SendTCP source_ip source_port dest_ip dest_port其中,SendTCP为程序名,source_ip为源主机的IP地址,source_port为 源主机的端口号,dest_ip为目的主机的IP地址,dest_port为目的主机的 端口。2)TCP头部的其他字段自行设定,数据字段内容为This is a TCP

4、 packet from source host destination host”。3)输出内容:Send OK。3 相关知识编译本程序前要对TCP协议有一定的了解。当应用进程有报文需要发送 时,它就将此应用层报文传送给执行TCP协议的传输实体。TCP传输实体将用 户数据加上TCP报头,形成TCP数据包,在TCP数据包上增加IP头部,形成 IP包。TCP协议的数据传输单元称为报文段,其格式如图1所示。报文段报头的 长度为20B60B。其中固定长度是20B,选项部分长度最多为40B。TCP报文 段主要包括以下字段。TCP报文段的首部格式a24311032位1620字节的图3-1端口号:端口号字

5、段包括源端口和目的端口号。每个端口号的长度是16 位,分别表示发送该TCP的应用进程的端口号和接收该TCP包的进程的端口 号。序号:长度为32位。由于TCP协议是面向数据流的,它传送的报文段可 以视为连续的数据流,因此需要给每一个字节编号。序号字段的“序号”指 的是本报文数据的第一个字节的顺序号。确认号:该字段的长度为32位,它表示接收端希望接收的下一个TCP包 的第一个字节序号。报头长度:该字段长度为4位。TCP报头长度是以4B为一个单元来计算, 实际上报头长度20B60B之间。因此这个字段的值在515之间。保留:长度为6位,留做今后使用,目前全部置零。控制:这个字段定义了6种不同的标志,每

6、个标志占一位,在同一时间 可以设置一位或多位。URG位为1时,表明有需要紧急处理的数据。ACK位为 1时,表明确认号的字段有效。PSH位为1时,表明应尽快把数据传送给应用 程序,否则表明允许数据在缓存中存放一段时间ORST位为1时,表明要强制 切断连接。SYN位为1时,表明有确切连接的请求,这时,把序号字段的初始 值作为序号字段的值,以便开始通信oFIN位为1时,表明发送方已经没有数 据发送了。校验和:该字段长度为16位,校验和的校验范围包括伪头部、TCP报头 以及应用层来的数据。其计算方法与IP协议头部校验和的计算方法一样。4 课程设计分析本课程设计的目的是发送一个TCP包,我利用原始套接字

7、来完成这个工作。 整个程序由初始化原始套接字和填充TCP包两部分组成。下面结合核心代码 对程序的具体实现进行介绍,同时为使程序流程更加清晰,去掉了错误检查 等保护性代码。1. 使用原始套接字实现TCP数据报发送的常见方法是利用原始套接字,创建原始套接字的 代码如下:SOCKET sockRaw;sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_TP,MULL,WSA_FLAG_OVERLA PPED);同时,我们还要设置发送超时。BOOL Flag=TRUE; setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char*)&

8、Flag,sizeof(Flag) );int timeout=1000;setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(t imeout);2. 定义IP头部、TCP头部和TCP头部的数据结构除了定义IP头部和TCP头部的数据结构用于数据包填充之外,我们还需 要定义一个TCP伪头部的数据结构来计算校验码。3. 填充数据包在填充数据包的过程中,我们不仅要填充TCP头部,还要填充IP头部。 同时,为了填充校验和,我们还要对TCP伪头部进行填充。4. 发送数据包填充完TCP包后,最后的工作就是把数据包发送出去。后文一

9、部分所编写的代码完成这三个工作:填充发送缓冲区,发送数据包的目的地址,发送 数据包。5. 本程序的流程图:构造原始套接字,并初始化填充IP头部计算IP头部校验和构造TCP伪头部填充TCP头部计算TCP头部校验和发送TCP数据包结束图415 程序代码#include#include #include#pragma comment (lib,ws2_32.lib)using namespace std;/定义IP头部结构typedef struct IP_HEADunionunsigned char Version; unsigned char HeadLen;unsigned char Serv

10、iceType; unsigned short TotalLen;unsigned short Identifier;unionunsigned short Flags;/版本(字节的前4位)/头部长度(字节的后4位)/服务类型/总长度/标识符unsigned short FragOffset;unsigned char TimeToLive; unsigned char Protocol;unsigned short HeadChecksum;unsigned int SourceAddr;unsigned int DestinAddr;ip_head;/定义TCP伪头部结构typedef

11、struct PSD_HEAD/标志位(字的前3位)/片偏移(字的后13位)/生存周期/协议/头部校验和/源IP地址/目的IP地址unsigned int SourceAddr; unsigned int DestinAddr; unsigned char Reserved;unsigned char Protocol; unsigned short TcpLen;psd_head;/定义TCP头部结构/源IP地址 /目的IP地址/保留位/协议类型/TCP长度typedef struct TCP_HEADunsigned short SourcePort;/源端口unsigned short

12、DestinPort;/目的端口unsigned int Sequence;/序列号unsigned int Acknowledge;/确认号unionunsigned short HeadLen; unsigned short Reserved; unsigned short Flags;unsigned short WindowsLen;unsigned short TcpChecksum; unsigned short UrgePoint;tcp_head;unsigned short check65535; char send_buffer65535;/头部长度(字节的前4位)/保留位

13、(字的中6位)/标志位(字的后6位)/窗口大小/TCP校验和/紧急指针/设置校验缓冲区大小/设置发送缓冲区大小const char tcp_data=This isa test of tcp packet encapsule and send!;/校验和计算函数 unsigned short checksum(unsigned short *buffer,int size) unsigned long cksum=0;while(size1)cksum+=*buffer+;size-=sizeof(unsigned short);if(size)cksum+=*(unsigned char*)

14、buffer;cksum=(cksum16)+(cksum&0xffff);cksum+=(cksum16);return (unsigned short)(cksum);void main(int argc,char* argv)/检验输入命令格式if(argc!=3)coutPleaseinputcommand:SendTCPsource_addressdest_addressendl; return;/建立与Socket库绑定WSADATA WSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)coutWSAStartup error!endl; return;/创建原始SocketSOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);if(sock=INVALID_SOCKET)coutCreate socket error!endl; return;/设置发送超时时间int timeout=1000;if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout) =SOCKET_ERROR)coutSet send tim

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

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

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