计算机网络茜茜.docx

上传人:b****6 文档编号:4759581 上传时间:2022-12-08 格式:DOCX 页数:19 大小:131.78KB
下载 相关 举报
计算机网络茜茜.docx_第1页
第1页 / 共19页
计算机网络茜茜.docx_第2页
第2页 / 共19页
计算机网络茜茜.docx_第3页
第3页 / 共19页
计算机网络茜茜.docx_第4页
第4页 / 共19页
计算机网络茜茜.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

计算机网络茜茜.docx

《计算机网络茜茜.docx》由会员分享,可在线阅读,更多相关《计算机网络茜茜.docx(19页珍藏版)》请在冰豆网上搜索。

计算机网络茜茜.docx

计算机网络茜茜

学号:

课程设计

 

题目

发送TCP数据包

学院

计算机科学与技术学院

专业

软件工程

班级

姓名

指导教师

周彩兰

 

2013

课程设计任务书

学生姓名:

专业班级:

指导教师:

工作单位:

计算机学院

题目六:

发送TCP数据包

初始条件:

(1)学习相关知识

(2)C/C++/VC/VB/JAVA语言

(3)PC机一台

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

本设计的功能是填充一个TCP数据包,并发送给目的主机。

1)以命令行形式运行:

SendTCPsource_ipsource_portdest_ipdest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号,dest_ip为目的地址,dest_port为目的端口号。

2)其他的TCP头部参数请自行设定。

3)数据字段为“Thisismyhomeworkofnetwork,Iamhappy!

”。

4)成功发送后在屏幕上输出“sendOK”。

时间安排:

第一、二天:

查阅资料,学习算法

第三、四天:

编程调试

第五天:

书写报告

指导教师签名:

年月日

系主任(或责任教师)签名:

年月日

目录

1.设计题目与要求1

1.1设计题目1

1.2设计目的1

1.3设计要求1

2.相关知识1

3.详细设计4

3.1工作环境4

3.2设计思想4

3.3使用原始套接字4

3.4构造IP头和TCP头5

3.5计算校验和6

3.6计算校验和的子函数7

4.数据结构与模块说明7

4.1数据结构7

4.2程序流程图9

5.程序调试分析和运行结果10

5.1调试分析10

5.2运行结果10

6.体会和总结11

7.参考文献12

8.附录(源程序)12

发送TCP数据包

1.设计题目与要求

1.1设计题目

发送TCP数据包

1.2设计目的

TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。

TCP协议在网络层IP协议的基础上,向应用层用户进程提供可靠的、全双工的数据传输流。

本课程设计的目的就是设计一个发送TCP数据包的程序,并根据本设计说明TCP数据包的结构以及TCP协议与IP协议的关系,使学生对TCP协议的工作原理有更深入的认识。

1.3设计要求

本设计的功能是填充一个TCP数据包,并发送给目的主机。

1)以命令行形式运行:

SendTCPsource_ipsource_portdest_ipdest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号,dest_ip为目的地址,dest_port为目的端口号。

2)其他的TCP头部参数请自行设定。

3)数据字段为“Thisismyhomeworkofnetwork,Iamhappy!

”。

4)成功发送后在屏幕上输出“sendOK”。

2.相关知识

互联网络层是TCP/IP协议参考模型中的关键部分。

当多信息的传输要求比较高时,我们才用TCP来实现数据的传输。

本程序是在windows环境下实现了发送TCP数据包的功能。

主要包括定义IP头部、TCP头部、和伪头部的数据结构,填充IP头部,计算IP头部校验和,构造TCP伪头部,填充TCP头部,计算TCP头部校验和,发送TCP数据报。

接着是对客户端程序的开发,程序结构与服务端程序类似,也包括定义IP头部、TCP头部、和伪头部的数据结构。

当应用进程需要通过TCP发送时,它就将此应用层报文传送给执行TCP协议的传输实体。

TCP传输实体将用户数据加上TCP报头,形成TCP数据包,在TCP数据包上增加IP头部,形成IP包。

TCP协议的数据传输单位称为报文段,报文段报头的长度是20B-60B,选项部分长度最多为40B。

TCP报文段主要包括:

(1)端口号:

端口号字段包括源端口号和目的端口号。

每个端口号的长度是16位,分别表示发送该TCP包的应用进程的端口号和接收该TCP数据包的应用进程端口号。

(2)序号:

长度为32位。

由于TCP协议是面向数据流的,它所传送的报文段可以视为连续的数据流,因此需要给每一个字节编号。

序号字段的“序号”指的是本报文段数据的第一个字节的序号。

(3)报文长度:

该字段长度为4位。

TCP报文长度是以4B为一个单元来计算的,实际上报文长度在20B-60B之间,因此这个字段的值在5-15之间。

(4)TCP头部数据:

包括源端口号、序号、确认号、报文长度、保留URG、ACK、PSH,数据包头部的格式RST、SYN目的端口号。

(5)FIN:

紧急指针,保留长度16位,留作以后使用,目前全部置0。

保留控制:

这个字段定义了6种不同的标识,每一个标志占一位或多位。

URG位为1时,表明应尽快把数据传送给应用程序,否则表明允许数据在缓存中存放一段时间。

RST位为1时,表明要强制切断连接。

SYN位1时,表明有确立连接的请求,这时,把序号字段的初始值作为序号字段的值,以便开始通信。

FIN位为1时,表明发送方已经没有数据发送了,长度为16位,指向必须紧急处理的位置,只有当标志URG=1时紧急指针才生效。

从TCP报头后面的报文数据开始,到紧急指针所指出长度的数据,就是必须紧急处理的数据。

下面分别给出IP头部、TCP头部、和伪头部的数据结构图示:

(1)TCP数据包和IP的关系如图1-1所示:

图1-1TCP数据包和IP的关系

 

(2)TCP协议的传输单元称为报文段、其格式如1-2所示:

 

图1-2TCP协议报文段格式

 

(3)伪头部的格式如图1-3所示:

08162431

源IP地址

目的IP地址

00000000

协议号(6)

TCP长度

图1-3伪头部数据格式

3.详细设计

3.1工作环境

软件:

MicrosoftVisualC++6.0;

硬件:

PC机一台。

3.2设计思想

本程序是在windows环境下实现了发送TCP数据包的功能。

主要包括定义IP头部、TCP头部、和伪头部的数据结构,填充IP头部,计算IP头部校验和,构造TCP伪头部,填充TCP头部,计算TCP头部校验和,发送TCP数据报。

3.3使用原始套接字

创建一个原始套接字,并设置IP头选项

SOCKETsock;

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_OVERLAPPED。

在本课程设计中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,设置IP头操作选项。

其中flag设置为ture,并设定IP_HDRINCL选项,表明自己来构造IP头。

注意,如果设置IP_HDRINCL选项,那么必须具有administrator权限,要不就必须修改注册表:

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

修改键:

DisableRawSecurity(类型为DWORD),把值修改为1。

如果没有,就添加。

BOOLFlag=TRUE;

setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&Flag,sizeof(Flag));

inttimeout=1000;

setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));

在这里我们使用基本套接字SOL_SOCKET,设置SO_SNDTIMEO表示使用发送超时设置,超时时间设置为1000ms。

3.4构造IP头和TCP头

这里,IP头和TCP头以及TCP伪部的构造请参考下面它们的数据结构。

//定义IP首部

typedefstruct_iphdr

{

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

UCHARtos;//8位服务类型TOS

USHORTtotal_len;//16位总长度(字节)

USHORTident;//16位标识

USHORTfrag_and_flags;//3位标志位

UCHARttl;//8位生存时间TTL

UCHARproto;//8位协议(TCP,UDP或其它)

USHORTchecksum;//16位IP首部校验和

ULONGsourceIP;//32位源IP地址

ULONGdestIP;//32位目的IP地址

}IP_HEADER;

//定义TCP伪首部

typedefstructpsd_hdr{

ULONGsaddr;//源地址

ULONGdaddr;//目的地址

UCHARmbz;//没用

UCHARptcl;//协议类型

USHORTtcpl;//TCP长度

}PSD_HEADER;

//定义TCP首部

typedefstruct_tcphdr

{

USHORTth_sport;//16位源埠

USHORTth_dport;//16位目的端口

ULONGth_seq;//32位序列号

ULONGth_ack;//32位确认号

UCHARth_lenres;//4位首部长度/6位保留字

UCHARth_flag;//6位标志位

USHORTth_win;//16位窗口大小

USHORTth_sum;//16位校验和

USHORTth_urp;//16位紧急数据偏移量

}TCP_HEADER;

3.5计算校验和

为了计算一份数据报的IP检验和,首先把检验和字段置为0。

然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。

当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。

由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。

如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。

但是不生成差错报文,由上层去发现丢失的数据报并进行重传。

校验和(checksum),在数据处理和数据通信领域中,用于校验目的的一组数据项的和。

这些数据项可以是数字或在计算检验的过程中看作数字的其它字符串。

本程序中,“in_cksum”为计算校验和的函数,在填充数据包的过程中,需要调用这个函数两次,分别用于校验IP头部和TCP头部(加上伪头部)。

3.6计算校验和的子函数

在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IP头和TCP头部(加上伪头部),其实现代码如下:

USHORTchecksum(USHORT*buffer,intsize)

{

unsignedlongcksum=0;

while(size>1)

{

cksum+=*buffer++;

size-=sizeof(USHORT);

}

if(size)

{

cksum+=*(UCHAR*)buffer;

}

cksum=(cksum>>16)+(cksum&0xffff);

cksum+=(cksum>>16);

return(USHORT)(~cksum);

}

4.数据结构与模块说明

4.1数据结构

typedefstruct_iphdr//定义IP首部

{

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

UCHARtos;//8位服务类型TOS

USHORTtotal_len;//16位总长度(字节)

USHORTident;//16位标识

USHORTfrag_and_flags;//3位标志位

UCHARttl;//8位生存时间TTL

UCHARproto;//8位协议(TCP,UDP或其他)

USHORTchecksum;//16位IP首部校验和

ULONGsourceIP;//32位源IP地址

ULONGdestIP;//32位目的IP地址

}IP_HEADER;

typedefstructpsd_hdr//定义TCP伪首部

{

ULONGsaddr;//源地址

ULONGdaddr;//目的地址

UCHARmbz;//没用

UCHARptcl;//协议类型

USHORTtcpl;//TCP长度

}PSD_HEADER;

typedefstruct_tcphdr//定义TCP首部

{

USHORTth_sport;//16位源端口

USHORTth_dport;//16位目的端口

ULONGth_seq;//32位序列号

ULONGth_ack;//32位确认号

UCHARth_lenres;//4位首部长度/6位保留字

UCHARth_flag;//6位标志位

USHORTth_win;//16位窗口大小

USHORTth_sum;//16位校验和

USHORTth_urp;//16位紧急数据偏移量

}TCP_HEADER;

4.2程序流程图

5.程序调试分析和运行结果

5.1调试分析

本程序流程简单,调试过程中没有出现大的问题。

调试过程中没有出现重大的语法错误,主要是运行的结果不理想,和预期的结果有差距。

填充数据包的程序部分是不容易出错的。

至于数据包的发送,由于是利用函数sendto()来实现的,而sendto()是面向UDP的,将协议类型修改为UDP(Header.proto=IPPROTO_UDP;)后,调试运行成功,问题得到解决。

调试时,要添加

#include

#include

#pragmacomment(lib,"ws2_32.lib")

不然编译出错。

5.2运行结果

1.输入:

sendtcp192.168.1.10280192.168.1.10280

 

2.输入要发送的字符串:

Thisismyhomeworkofnetwork,Iamhappy!

 

3.回车

6.体会和总结

这次的课程设计让我学到了很多东西。

我最大的收获是学会了TCP数据包的填充和发送。

在对TCP数据包进行填充时,首先需要我们去充分了解它的数据结构,在这个过程中可以了解相应字节上应该存放的内容和它们的功能。

在实现TCP数据包的发送中,我第一次深深接触了网络编程接口socket套接字的相关知识,虽然本次的课程设计只用到了其中一小部分知识,但这并不会影响到我对这方面知识的全面了解。

总之这次的课程设计,让我对网络中的数据收发有了一定的了解,并激发了我对计算机网络的浓厚兴趣。

在编写程序的过程中,用到了很多的函数,这些函数的运用使得程序简便而且正确的运行出来。

为了正确的实现这些函数,查阅了很多相关的资料,从中获得了大量的有用的信息,收获也颇丰富。

在这次的课程设计中,动手能力得到了很大的提高,而且将这学期所学的网络的知识和以前所学的编程的知识充分的联系起来,对这门课的认识又提高了一层。

7.参考文献

[1]吴功宜、胡晓英等编著.《计算机网络课程设计》.北京:

机械工业出版社,2010.8

[2]谢希仁编著.《计算机网络》.电子工业出版社,2008.1

[3]陈坚、陈伟编著.《VisualC++网络高级编程》.北京:

人民邮电出版社,2001

[4]周明天、汪文勇编著,“TCP/IP网络原理与技术”,清华大学出版社,1993年

[5]施炜、李铮、秦颍编著,“WindowsSockets规范及应用-Windows网络编程接口”,Document,1995年

 

8.附录(源程序)

#include

#include

#include

#include

#include

#include

#include

#include

#pragmacomment(lib,"ws2_32.lib")

#defineIPVER4//IP协议预定

#defineMAX_BUFF_LEN65500//发送缓冲区最大值

typedefstructip_hdr//定义IP首部

{

UCHARh_verlen;//4位首部长度,4位IP版本号

UCHARtos;//8位服务类型TOS

USHORTtotal_len;//16位总长度(字节)

USHORTident;//16位标识

USHORTfrag_and_flags;//3位标志位

UCHARttl;//8位生存时间TTL

UCHARproto;//8位协议(TCP,UDP或其他)

USHORTchecksum;//16位IP首部校验和

ULONGsourceIP;//32位源IP地址

ULONGdestIP;//32位目的IP地址

}IP_HEADER;

typedefstructtsd_hdr//定义TCP伪首部

{

ULONGsaddr;//源地址

ULONGdaddr;//目的地址

UCHARmbz;//没用

UCHARptcl;//协议类型

USHORTtcpl;//TCP长度

}PSD_HEADER;

typedefstructtcp_hdr//定义TCP首部

{

USHORTth_sport;//16位源端口

USHORTth_dport;//16位目的端口

ULONGth_seq;//32位序列号

ULONGth_ack;//32位确认号

UCHARth_lenres;//4位首部长度/6位保留字

UCHARth_flag;//6位标志位

USHORTth_win;//16位窗口大小

USHORTth_sum;//16位校验和

USHORTth_urp;//16位紧急数据偏移量

}TCP_HEADER;

//CheckSum:

计算校验和的子函数

USHORTchecksum(USHORT*buffer,intsize)

{

unsignedlongcksum=0;

while(size>1)

{

cksum+=*buffer++;

size-=sizeof(USHORT);

}

if(size)

{

cksum+=*(UCHAR*)buffer;

}

cksum=(cksum>>16)+(cksum&0xffff);

cksum+=(cksum>>16);

return(USHORT)(~cksum);

}

intReadData(char*str,intmaxlen)

{

intreadlen=0;

charch=NULL;

if(str==NULL||maxlen<=0)

{

printf("ReadDataError!

!

!

\n");

return0;//failed

}

printf("InputData(EndByCtrl+Z):

\n");

while(maxlen)

{

ch=getchar();

if(ch==EOF)break;

str[readlen++]=ch;

maxlen--;

}

str[readlen]=NULL;

returnreadlen;

}

intmain(intargc,char*argv[])

{

WSADATAWSAData;

SOCKETsock;

IP_HEADERipHeader;

TCP_HEADERtcpHeader;

PSD_HEADERpsdHeader;

charSendto_Buff[MAX_BUFF_LEN];//发送缓冲区

unsignedshortcheck_Buff[MAX_BUFF_LEN];//检验和缓冲区

chartcp_send_data[1000];

intread_data_len=0;

BOOLflag;

intrect,nTimeOver;

if(argc!

=5)

{

printf("Usage:

SendTcpsoruce_ipsource_portdest_ipdest_port\n");

returnfalse;

}

read_data_len=ReadData(tcp_send_data,1000);

if(read_data_len<=0)return1;

if(WSAStartup(MAKEWORD(2,2),&WSAData)!

=0)

{

printf("WSAStartupError!

\n");

returnfalse;

}

if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,

WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)

{

printf("SocketSetupError!

\n");

returnfalse;

}

flag=true;

if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,

(char*)&flag,sizeof(flag))==SOCKET_ERROR)

{

printf("setsockoptIP_HDRINCLerror!

\n");

returnfalse;

}

nTimeOver=1000;

if(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1