发送TCP数据包

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四川理工学院

课程设计书

学院计算机学院

专业计算机科学与技术

班级09级04班

题目发送TCP数据包

教师王非,何绍荣,陈超

学生赵清勇,谭凯,唐红琴

实验分工:

程序设计、编写代码由全小组成员共同完成

谭凯:在vc下调试运行程序、文档编写

赵清勇:在dos下运行检查、初步完成课程设计报告唐红琴:查找资料、整理课程设计报告

目录

一课程设计准备 (4)

1.1课程设计目的 (4)

1.2课程设计的要求 (4)

1.3相关知识 (5)

1.4工作环境 (7)

二课程设计分析 (7)

2.1使用原始套接字 (7)

2.2定义IP头部、TCP头部和伪头部的数据结构 (8)

2.3计算校验和的子函数 (10)

2.4程序流程图 (11)

三源代码 (12)

四运行结果与运行情况 (18)

五自我评析和总结 (19)

六参考文献 (20)

发送TCP数据包

一课程设计准备

1.1课程设计目的

TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。TCP协议在网络层IP协议的基础上,向应用层用户进程提供可靠的、全双工的数据传输流。本课程设计的目的就是设计一个发送TCP数据包的程序,并根据本设计说明TCP数据包的结构以及TCP协议与IP协议的关系,使学生对TCP协议的工作原理有更深入的认识。

1.2课程设计的要求

本程序的功能是填充一个TCP数据包,并发送给目的主机。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”。

1.3相关知识

编制本程序前要对TCP协议有一定的了解。当应用程序有报文需要通过TCP发送时,它就将此应用层报文传送给执行TCP协议的传输实体。TCP传输实体将用户数据加上TCP报头,形成TCP 数据包,在TCP数据包上增加IP头部,形成IP包。下图显示的是TCP数据包和IP包的关系。

TCP协议的传输单元为报文段,其格式如图所示。报文段报头的长度为20B~60B。其中固定长度为20B,报文段长度最多为40B。TCP报文段主要包括以下字段。

·埠号:埠号字段包括源埠号和目的埠号。每个埠号的长度是16位,分别表示发送该TCP包的应用进程的埠号和接收该TCP包的应用进程的埠号。

·序号:长度为32位。由于TCP协议是面向数据流的,它所传送的报文段可以视为连续的数据流,因此需要给每一个字节编号。序号字段的“序号”指的是本报文段数据的第一个字节的顺序号。

·确认号:该字段的长度为32位,它表示接收端希望接收的下一个TCP包的第一个字节的序号。

·报头长度:该字段长度为4位。TCP报头长度是以4B为一个单元来计算的,实际上报头长度在20B~60B子间。因此这个字段的值在5~15之间。

·保留:长度为6位,留作今后使用,目前全部置0。

·控制:这个字段定义了6种不同的标志,每个标志占一位,在同一时间可以设置一位或多位。URG为1时,表明有需要紧急处理的数据。ACK为1时,表明确认号的字段有效。PST位为1时,表明要强制切断连接。SYN位为1时,表明有确立连接的请求,这时,把序号字段的初始值作为序号字段的值,以便开始通信。FIN 为1时,表明发送方已经没有资料发送了。

·窗口大小:长度为16位,窗口对应的数据是以字节为单位的数据,因此最多能够传送的数据为65535B。

·紧急指针:该字段的长度为16位,指向必须紧急处理的数据的位置,只有当标志URG=1时紧急指针才有效。从TCP报头后面的报文资料开始,到紧急指针所指出的长度的数据,就是必须紧急处理的数据。

·选项:该字段可以多达40B,包括单字节选项和多字节选项。

·校验和:该字段长度多达16位,校验和的校验范围包括伪头部、TCP报头以及应用层来的数据。其计算方法与IP协议头部的校验的计算方法一样。伪头部为12B,它本身并不是TCP数据包的真正头部,只是在计算校验和时,临时和TCP数据包连接在一起。伪头部的格式如下图所示。

1.4工作环境

软件:Microsoft Visual C++ 6.0;硬件:PC机一台。

二课程设计分析

本课程设计的目标是发送一个TCP资料包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送TCP数据包两个部分组成。

2.1使用原始套接字

SOCKET sock;

sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);

或者:

sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,W SA_FLAG_OVERLAPPED);

这里,我们设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。

为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。在本课程设计中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,设置IP头操作

选项。其中flag设置为ture,并设定IP_HDRINCL 选项,表明自己来构造IP头。注意,如果设置IP_HDRINCL 选项,那么必须具有administrator权限,要不就必须修改注册表:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\ Parameter\

修改键:DisableRawSecurity(类型为DWORD),把值修改为1。如果没有,就添加。

BOOL 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.2定义IP头部、TCP头部和伪头部的数据结构

//定义IP首部

typedef struct _iphdr

{

UCHAR h_lenver; //4位首部长度+4位IP版本号

UCHAR tos; //8位服务类型TOS

相关文档
最新文档