计算机网络茜茜Word文档格式.docx
- 文档编号:17701875
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:19
- 大小:131.78KB
计算机网络茜茜Word文档格式.docx
《计算机网络茜茜Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机网络茜茜Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
查阅资料,学习算法
第三、四天:
编程调试
第五天:
书写报告
指导教师签名:
年月日
系主任(或责任教师)签名:
目录
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设计题目
1.2设计目的
TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。
TCP协议在网络层IP协议的基础上,向应用层用户进程提供可靠的、全双工的数据传输流。
本课程设计的目的就是设计一个发送TCP数据包的程序,并根据本设计说明TCP数据包的结构以及TCP协议与IP协议的关系,使学生对TCP协议的工作原理有更深入的认识。
1.3设计要求
SendTCPsource_ipsource_portdest_ipdest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号,dest_ip为目的地址,dest_port为目的端口号。
3)数据字段为“Thisismyhomeworkofnetwork,Iamhappy!
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设计思想
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首部
//4位首部长度+4位IP版本号
//8位服务类型TOS
//16位总长度(字节)
//16位标识
//8位生存时间TTL
//8位协议(TCP,UDP或其他)
//16位IP首部校验和
//32位目的IP地址
typedefstructpsd_hdr//定义TCP伪首部
//没用
typedefstruct_tcphdr//定义TCP首部
//16位源端口
//16位目的端口
//32位序列号
//32位确认号
//4位首部长度/6位保留字
//6位标志位
//16位窗口大小
//16位校验和
//16位紧急数据偏移量
4.2程序流程图
5.程序调试分析和运行结果
5.1调试分析
本程序流程简单,调试过程中没有出现大的问题。
调试过程中没有出现重大的语法错误,主要是运行的结果不理想,和预期的结果有差距。
填充数据包的程序部分是不容易出错的。
至于数据包的发送,由于是利用函数sendto()来实现的,而sendto()是面向UDP的,将协议类型修改为UDP(Header.proto=IPPROTO_UDP;
)后,调试运行成功,问题得到解决。
调试时,要添加
#include<
winsock2.h>
ws2tcpip.h>
#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.附录(源程序)
stdio.h>
string.h>
time.h>
windows.h>
stdlib.h>
iostream.h>
#defineIPVER4//IP协议预定
#defineMAX_BUFF_LEN65500//发送缓冲区最大值
typedefstructip_hdr//定义IP首部
UCHARh_verlen;
//4位首部长度,4位IP版本号
UCHARtos;
USHORTtotal_len;
USHORTident;
USHORTfrag_and_flags;
UCHARttl;
UCHARproto;
//8位协议(TCP,UDP或其他)
USHORTchecksum;
ULONGsourceIP;
//32位源IP地址
ULONGdestIP;
typedefstructtsd_hdr//定义TCP伪首部
ULONGsaddr;
//源地址
ULONGdaddr;
//目的地址
UCHARmbz;
UCHARptcl;
//协议类型
USHORTtcpl;
//TCP长度
typedefstructtcp_hdr//定义TCP首部
USHORTth_sport;
//16位源端口
USHORTth_dport;
ULONGth_seq;
ULONGth_ack;
UCHARth_lenres;
UCHARth_flag;
USHORTth_win;
USHORTth_sum;
USHORTth_urp;
//CheckSum:
计算校验和的子函数
unsignedlongcksum=0;
while(size>
{
}
if(size)
}
cksum=(cksum>
cksum+=(cksum>
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)
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)!
WSAStartupError!
if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,
WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
SocketSetupError!
flag=true;
if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,
(char*)&
flag,sizeof(flag))==SOCKET_ERROR)
setsockoptIP_HDRINCLerror!
nTimeOver=1000;
if(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络