文档视界 最新最全的文档下载
当前位置:文档视界 › 发送和接收TCP数据包

发送和接收TCP数据包

发送和接收TCP数据包
发送和接收TCP数据包

湖北工业大学

计算机网络课程设计

设计题目:发送和接收TCP数据包班级:XXX

姓名:xxx

学号:XXX

指导老师:XXX

发送和接受TCP数据包

1.设计题目与要求

1.1设计题目

发送和接收TCP数据包

1.2技术要求

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

1)以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号,dest_ip 为目的地址,dest_port为目的端口号。

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

3)数据字段为“This is my homework of network,I am happy!”。

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

2.总的设计思想及系统平台、语言、工具等

2.1工作环境

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

2.2设计思想

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

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

SOCKET sock;

sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);

或者:

sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OV

ERLAPPED);

这里,我们设置了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.2构造IP头和TCP头

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

2.2.3计算校验和的子函数

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

USHORT checksum(USHORT *buffer, int size)

{

unsigned long cksum=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);

}

3.数据结构与模块说明(功能与流程图)3.1数据结构

typedef struct _iphdr //定义IP首部

{

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 sourceIP; //32位源IP地址

ULONG destIP; //32位目的IP地址

}IP_HEADER;

typedef struct psd_hdr //定义TCP伪首部

{

ULONG saddr; //源地址

ULONG daddr; //目的地址

UCHAR mbz; //没用

UCHAR ptcl;//协议类型

USHORT tcpl; //TCP长度

}PSD_HEADER;

typedef struct _tcphdr //定义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;

开始

构造原始套接字

并初始化

填充IP首部

计算IP首部校验和

构造TCP伪首部

填充TCP首部

计算TCP首部校验和

填充发送缓冲区

填入目的地址

发送数据包

结束

4.源程序

#include

#include #include #include

#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 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;

typedef struct tcp_hdr //定义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)

{

unsigned long cksum=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);

}

int main(int argc, char* argv[])

{

WSADATA WSAData;

SOCKET sock;

IP_HEADER ipHeader;

TCP_HEADER tcpHeader;

PSD_HEADER psdHeader;

char Sendto_Buff[MAX_BUFF_LEN]; //发送缓冲区

unsigned short check_Buff[MAX_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)!=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!\n");

return false;

}

nTimeOver=1000;

if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)

{

printf("setsockopt SO_SNDTIMEO error!\n");

return false;

}

//填充IP首部

ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long));

ipHeader.tos=(UCHAR)0;

ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tc p_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(argv[1]); //32位源IP地址

ipHeader.destIP=inet_addr(argv[3]); //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.tcpl=htons(sizeof(TCP_HEADER)+sizeof(tcp_send_data));

//填充TCP首部

tcpHeader.th_dport=htons(atoi(argv[4])); //16位目的端口号

tcpHeader.th_sport=htons(atoi(argv[2])); //16位源端口号

tcpHeader.th_seq=0; //SYN序列号

tcpHeader.th_ack=0; //ACK序列号置为0

//TCP长度和保留位

tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned

long)<<4|0);

tcpHeader.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),&tcpHeader,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_HEADER));

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_family=AF_INET;

dest.sin_addr.s_addr=inet_addr(argv[3]);

dest.sin_port=htons(atoi(argv[4]));

rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest));

if (rect==SOCKET_ERROR)

{

printf("send error!:%d\n",WSAGetLastError());

return false;

}

else

printf("send ok!\n");

closesocket(sock);

WSACleanup();

return 1;

}

5.运行结果与运行情况

在Microsoft Visual C++ 6.0下编写源程序,然后调试成功后运行,生成可执行文件123.exe。因为该程序是带参数的,所以进入dos,并进入到该可执行文件的目录下后在命令提示行下输入:sendtcp 202.114.181.1 202.114.181.2000,运行结果如下:

6.调试报告

6.1调试记录

第一、二天,主要是查阅资料,学习算法。该期间重点了解了IP首部、TCP 首部的结构,以及如何将它们和数据字段一起封装成数据包。同时也掌握了计算校验和的算法,从而通过该算法分别计算出IP首部和TCP首部的校验和。接着就是对网络编程接口socket套接字的学习,除了掌握它的初始化外,还对一些经常使用的高级套接字函数进行运用,例如WSAStartup()、WSASocket()、socket()、bind()、listen()、accept()、connect()、sendto()、send()等。当然根据课程设计的要求,有很多函数并不需要用到。第三、四天,主要是编程实现,调试源程序,不断发现问题并修改。

调试过程中没有出现重大的语法错误,主要是运行的结果不理想,和预期的结果有差距。经分析,影响运行结果的主要因素是实现数据包发送的代码部分,相对而言,填充数据包的部分是不容易出错的,因为它是按照规定的格式自定义填充的,只要耐心一点都不会出错。至于数据包的发送,由于是利用函数sendto()

来实现的,最初运行程序时出现了这个错误:send error!10004 。查阅资料得知该错误的信息:case 10004: error = "Interrupted system call 中断的系统呼叫"; break;。起初甚至怀疑windows XP系统下不能正常调用sendto(),并向这个方向尝试了很多修改,问题依然没有得到解决。最后尝试性的将sendto()中的参数datasize修改位一个很小的具体的值是得到“send ok!”的运行结果,而只要超过一定值就依然出现以前的问题。这时我回到源程序中检查发现在自定义IP首部中将协议类型定义TCP(Header.proto=IPPROTO_TCP;),而sendto()是面向UDP的,将协议类型修改为UDP(Header.proto=IPPROTO_UDP;) 后,调试运行成功,问题得到解决。

6.2自我评析和总结

这次的课程设计让我学到了很多东西。我最大的收获是学会了TCP数据包的填充和发送。在对TCP数据包进行填充时,首先需要我们去充分了解它的数据结构,在这个过程中可以了解相应字节上应该存放的内容和它们的功能。在实现TCP数据包的发送中,我第一次深深接触了网络编程接口socket套接字的相关知识,虽然本次的课程设计只用到了其中一小部分知识,但这并不会影响到我对这方面知识的全面了解。总之这次的课程设计,让我对网络中的数据收发有了一定的了解,并激发了我对计算机网络的浓厚兴趣。

7.参考文献

(1)谢希仁编著,《计算机网络》,电子工业出版社,2003年。

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

(3)上网查询相关资料。

TCP数据包格式

TCP数据包格式(zz) 修改浏览权限| 删除TCP提供一种面向连接的、全双工的、可靠的字节流服务。 在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。 TCP的接收端必须丢弃重复的数据。 TCP对字节流的内容不作任何解释。对字节流的解释由TCP连接双方的应用层解释。TCP通过下列方式来提供可靠性: 应用数据被分割成TCP认为最适合发送的数据块,称为报文段或段。 TCP协议中采用自适应的超时及重传策略。 TCP可以对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 TCP的接收端必须丢弃重复的数据。 TCP还能提供流量控制。 TCP报文段格式

源端口和目的端口字段——各占2字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。 序号字段——占4字节。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。 确认号字段——占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。 数据偏移——占4bit,它指出TCP报文段的数据起始处距离CP报文段的起始处有多远。“数据偏移”的单位不是字节而是32bit字(4字节为计算单位)。 保留字段——占6bit,保留为今后使用,但目前应置为0。

紧急比特URG——当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。 确认比特ACK——只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。 复位比特RST(Reset) ——当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。 同步比特SYN——同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。 终止比特FIN(FINal)——用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。 窗口字段——占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。 检验和——占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP 报文段的前面加上12字节的伪首部。 紧急指针字段——占16bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。 选项字段——长度可变。TCP首部可以有多达40字节的可选信息,用于把附加信息传递给终点,或用来对齐其它选项。 填充字段——这是为了使整个首部长度是4字节的整数倍。 TCP首部的主要选项: 最大报文段长度MSS(Maximum Segment Size)是TCP报文段中的数据字段的最大长度。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”窗口扩大因子,用于长肥管道。 时间戳,可用于测量往返时延RTT。 TCP的数据编号与确认 TCP协议是面向字节的。TCP将所要传送的报文看成是字节组成的数据流,并使每一个字节对应于一个序号。 在连接建立时,双方要商定初始序号。TCP每次发送的报文段的首部中的序号字段数值表示该报文段中的数据部分的第一个字节的序号。 TCP的确认是对接收到的数据的最高序号表示确认。接收端返回的确认号是已收到的数据的最高序号加1。因此确认号表示接收端期望下次收到的数据中的第一个数据字节的序号。为提高效率,TCP可以累积确认,即在接收多个报文段后,一次确认。 一、TCP的流量控制 TCP采用大小可变的滑动窗口进行流量控制。窗口大小的单位是字节。 TCP报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。 发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。

TCP数据包的发送和接收设计报告

湖北工业大学 课程设计报告 设计题目:TCP数据包的发送和接收专业:计算机科学与技术 班级:10计科2班 学号:11 姓名:吕红杰 指导老师:涂军

一.设计题目 发送和接收TCP数据包 二.设计要求 1.正确理解题意; 2.具有良好的编程规范和适当的注释; 3.有详细的文档,文档中应包括设计题目涉及的基础知识、设计思路、程序流程图、程序清单、开发中遇到的问题及解决方法、设计中待解决的问题及改进方向。 三.需求分析 TCP是一种面向连接的、可靠的传输层协议。TCP协议工作在网络层IP协议的基础上。本课程设计的目的是设计一个发送和接收TCP数据包的程序,其功能是填充一个TCP数据包,发送给目的主机,并在目的主机接收此TCP数据包,将数据字段显示显示在标准输出上。 四.具体设计 1.创建一个原始套接字,并设置IP头选项 SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPE D); 这里,设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。 为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。在本课程设计中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,

设置IP头操作选项。其中flag设置为ture,并设定 IP_HDRINCL 选项,表明自己来构造IP头。 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.构造IP头和TCP头 这里, IP头和TCP头以及TCP伪部的构造请参考下面它们的数据结构。typedef struct _iphdr 算校验和的子函数 在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IP头和TCP头部(加上伪头部),其实现代码如下: USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(USHORT); } if(size ) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16);

利用Ethereal分析TCP数据包

利用Ethereal分析TCP数据包一.分析过程: 1.图1 TCP协议图 图2 TCP协议的内容 图3 TCP协议的数据包 2.数据分析 1) 分析:546代表的是Frame的序号,54 bytes代表的是54字节的数据包的长度

2) 分析:其中代表的是MAC地址 字节: 6 6 2 以太网的MAC帧格式 目的地址:00 e0 5c 15 f1 cd(十六进制) 源地址:00 1f d0 b8 da 78(十六进制) 类型:一般类型字段的值是0x0800是,就是宝石上层使用的是IP数据报。如果类型字段分值是0x8137则宝石该帧是由Novell IPX发过来的。

3)分析: 版本:使用的是IP协议版本号为4(即IPv4) 首部长度:20个字节的长度 服务类型(新版本称区分服务):00,这个字段只有在使用区分服务时,才起作用。在一般的情况下都不使用这个字段的。 总长度:40字节,总长度指的是首部和数据之和的长度 标识:d0 34(十六进制)IP软件在存储器中维持一个计时器,每产生一个数据报,计时器就加1,并将此值赋给标志字段。 标志:001(二进制),目前标志只有两位有意义: 标志最低位记为MF(More Fragment)。MF=1表示后面“还有分片”的数据报, MF=0表示这已是若干数据报片中的最后一个。 标志中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0 是才允许分片。 片偏移:0,0000,0000,0000(二进制) 生存时间:80(十进制128s)生存时间表明的是数据报在网络中的寿命,一般以秒作为其单元。 协议:协议字段指出次此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分交给那个处理过程。 首部检验和:5167(二进制:0101,0001,0110,0111)这个字段值检验数据报的首部,但不包括数据部分。 源IP地址:192.168.1.3 目的IP地址:219.133.60.3 4)

发送TCP数据包

四川理工学院 课程设计书 学院计算机学院 专业计算机科学与技术 班级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”。

TCP数据包格式

TCP数据包格式 TCP协议也是建立在IP协议之上的,不过TCP协议是可靠的.按照顺序发送的.TCP的数据结构比前面的结构都要复杂. 每行32位=4字节。 Source Port (16) | Destination Port (16) Sequence Number (32) Acknowledgment Number (32) Data Offset(4) | Reserved (6)|UGR|ACK|PSH|RST|SYN|FIN|Window(16) Checksum (16) | Urgent Pointer (16) Options (0 or more 32 bit words + padding) DATA TCP各字段的含义 Source Port & Destination Port 如果我们将IP比喻成地址那麽Port可以说是门口了试想一下一座大楼有前门後门侧门送货的门出货的门倒垃圾的门扔死尸的门等等乱七八糟的门...... 那麽一个IP地址也有着好多个各种功能的port而每一个port都被不同的服务倾听着就好比看门人一样。 下面是一些常用port和其对应的服务有兴趣的朋友可以在Linux的/etc/services这个档案找到它们 ftp-data 20/tcp ftp 21/tcp telnet 23/tcp smtp 25/tcp mail www 80/tcp http # WorldWideWeb HTTP www 80/udp # HyperText Transfer Protocol pop-3 110/tcp # POP version 3 pop-3 110/udp

TCP数据包的封装与发送

TCP数据包的封装与发送 一、实验目的 1.掌握TCP的工作特点; 2.熟悉TCP数据包的结构; 3.深刻理解网络体系结构中传输层与上下层之间的关系; 二、实验环境 1.PC机一台 2.Windows 操作系统 三、实验准备 1.复习TCP协议的相关内容; 2.熟练掌握TCP数据包中各自段的作用; 四、实验内容(二选一) 1.编写程序构造TCP包结构,并填写各字段,将封装后的TCP包的内容在屏幕上输出并写入指定的文件中; 2.TCP包的数据字段内容额长度自定; 五、实验报告要求 1.报告内容要有主程序的流程图和程序代码; 2.报告内容要有运行结果的截图; 3.对实验过程进行分析,对存在的问题分析。 实验相关代码 #include #include #include #include #include #pragma comment(lib,"ws2_32.lib") //数据结构及宏定义: #define IPVER 4 //IP协议预定 #define MAX_BUFF_LEN 65500 //发送缓冲区最大值 #define DEST_PORT 5050 //目的端口号

#define SOUR_PORT 8080 //源端口号 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 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; typedef struct tcp_hdr //定义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; using namespace std; //主要函数: //CheckSum:计算校验和的子函数 USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(USHORT);

网络课程设计-tcp数据包的发送和接收

目录 一、软件概要简介 (6) 二、概要设计 (6) 1 6 2类图 (6) 3.数据结构的定义 (6) 4.程序截图 (7) 三、详细设计 (8) 1关键性代码 (8) 1.1内存映射文件读 (9) 1.2内存映射文件写 (9) 1.3文件的发送 (9) 1.4文件的接收 (9) 1.4.1客户端接收套接字 (9) 1.4.2 客户端把接收到的文件写人自己的文件..10 四、调试分析及测试结果 (15)

一、软件概要简介 我们做的是基于tcp数据包发送和接收的文件传输,采用的是客户/服务器模式,首先客户端连接到服务器,然后服务器端就可以选择需要传输的文件,开始传输。 二、概要设计1 1.1内存映射文件 我们首先是用内存映射文件的方法把文件一块一块的从磁盘映射到内存,每映射一块,就传输一块,直到把整个文件都传输完毕为止。内存映射文件内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。内存映射文件并不是简单的文件I/O操作,实际用到了Windows的核心编程技术--内存管理。所以,如果想对内存映射文件有更深刻的认识,必须对Windows操作系统的内存管理机制有清楚的认识,内存管理的相关知识非常复杂,超出了本文的讨论范畴,在此就不再赘述,感兴趣的读者可以参阅其他相关书籍。下面给出使用内存映射文件的一般方法: 首先要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件。在用CreateFile()将文件映像在物理存储器的位置通告给操作系统后,只指定了映像文件的路径,映像的长度还没有指定。为了指定文件映射对象需要多大的物理存储空间还需要通过CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。在创建了文件映射对象后,还必须为文件数据保留一个地址空间区域,并把文件数据作为映射到该区域的物理存储器进行提交。由MapViewOfFile()函数负责通过系统的管理而将文件映射对象的全部或部分映射到进程地址空间。此时,对内存映射文件的使用和处理同通常加载到内存中的文件数据的处理方式基本一样,在完成了对内存映射文件的使用时,还要通过一系列的操作完成对其的清除和使用过资源的释放。这部分相对比较简单,可以通过UnmapViewOfFile()完成从进程的地址空间撤消文件数据的映像、通过CloseHandle()关闭前面创建的文件映射对象和文件对象。 1.2基于socket的tcp数据包的接收和发送 Tcp的Socket编程的步骤基本就是这样:首先客户端请求连接服务器,服务器接受连接,服务器记住客户端的ip地址之后就可以进行通信了。

发送TCP数据包设计说明书

发送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 包的第一个字节的序号。

tcp抓包分析

TCP抓包分析 一TCP格式 源端口:数据发起者的端口号;? 目的端口:数据接收方的端口号; 32bit序列号:标识当前数据段的唯一性; 32bit的确认号:接收数据方返回给发送方的通知; TCP头部长度为20字节,若TCP头部的Options选项启用,则会增加首部长度,因此TCP是首部变长的传输层协议; Reserved、Reserved、Nonce、CWR、ECN-Echo:共6bit,保留待用。? URG:1bit紧急指针位,取值1代表这个数据是紧急数据需加速传递,取值0代表这是普通数据;? ACK:1bit确认位,取值1代表这是一个确认的TCP包,取值0则不是确认包;PSH:1bit紧急位,取值1代表要求发送方马上发送该分段,而接收方尽快的将报文交给应用层,不做队列处理。取值0阿迪表这是普通数据;? RST:1bit重置位,当TCP收到一个不属于该主机的任何一个连接的数据,则向对方发一个复位包,此时该位取值为1,若取值为0代表这个数据包是传给自己的;? SYN:1bit请求位,取值1代表这是一个TCP三次握手的建立连接的包,取值为0就代表是其他包;?

FIN:1bit完成位,取值1代表这是一个TCP断开连接的包,取值为0就代表是其他包;? Window?Size:16bit窗口大小,表示准备收到的每个TCP数据的大小;? Checksum:16bit的TCP头部校验,计算TCP头部,从而证明数据的有效性;? Urgent?Pointer:16bit紧急数据点,当功能bit中的URG取值为1时有效;? Options:TCP的头部最小20个字节。如果这里有设置其他参数,会导致头部增大;? Padding:当TCP头部小于20字节时会出现,不定长的空白填充字段,填充内容都是0,但是填充长度一定会是32的倍数;? Data:被TCP封装进去的数据,包含应用层协议头部和用户发出的数据。 二数据截图 1.第一个TCP报文: 2.第二个TCP报文: 3.第三个TCP报文: 二分析 上面截图的三个TCP报文段表示了TCP连接时的三次握手阶段。 1.第一个TCP报文 这是要建立连接的客户(我)向服务器发出连接请求段

TCP数据包及连接建立过程分析

字节是什么意思 1. 学习并分析TCP数据包的结构、含义 2.分析TCP连接的建立过程和数据传输过程。 1.Wireshark网络分析软件 2.实验文件“计算机网络-实验文件.cap” ●一个 TCP 数据报由首部和数据两部分组成。 ●首部的前一部分是固定长度,共 20 字节,是所有TCP数据报必须具有的。 ●在首部的固定部分的后面是一些可选字段,其长度是可变的。 ● A 的 TCP 向 B 发出连接请求报文段,其首部中的同步比特 SYN 应置为 1,并选择序号 x (为了防止TCP syn 攻击,分组选择的是经过较复杂运算后得到的初始化序号,当然其相对序号应该视作是1),表明传送数据时的第一个数据字节的序号是 x。 ● B 的 TCP 收到连接请求报文段后,如同意,则发回确认。 ● B 在确认报文段中应将 SYN 置为 1,其确认号应为 x 1,同时也为自己选择序号 y(为了防止TCP syn 攻击,分组选择的是经过较复杂运算后得到的初始化序号,当然其相对序号应该视作是1)。 ● A 收到此报文段后,向 B 给出确认,其确认号应为 y 1。 ● A 的 TCP 通知上层应用进程,连接已经建立。 4.1 TCP数据包的结构和含义分析 打开文件“计算机网络-实验文件.cap”,这是一个包括204个分组的网络通信记录,详细记录了分组的序号、相对时间、源地址、目标地址、协议类型、内容,如图1是对第29个分组的详细信息。 图1 第29个分组的TCP数据包的解析 观察文件内第29个分组的TCP数据包详细信息,见图1。 ●它的前16位是1668,表示源端口是1668,是客户端的一般端口,(本机是客户端) ●它的目的端口是0050(H)=8080,表明是访问服务器端的HTTP应用。 ●当前发送的数据首字节是0(相对值),表示为首发字节。它携带的数据包长度是0字节,64(IP包全长,见IP包头的长度字段值)-20(IP首部长度)-44(TCP首部长度)=0

TCPIP中数据包的传输

路由信息协议(RIP)是一种在网关与主机之间交换路由选择信息的标准。RIP 是一种内部网关协议。在国家性网络中如当前的因特网,拥有很多用于整个网络的路由选择协议。作为形成网络的每一个自治系统,都有属于自己的路由选择技术,不同的 AS 系统,路由选择技术也不同。 TCP/IP协议叫做传输控制/网际协议,它是Internet国际互联网络的基础。TCP/IP是网络中使用的基本的通信协议。 虽然从名字上看TCP/IP包括两个协议,传输控制协议(TCP)和网际协议(IP),但TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。 TCP/IP协议的基本传输单位是数据包(datagram),TCP协议负责把数据分成若干个数据包,并给每个数据包加上包头(就像给一封信加上信封),包头上有相应的编号,以保证在数据接收端能将数据还原为原来的格式,IP协议在每个包头上再加上接收端主机地址,这样数据找到自己要去的地方,如果传输过程中出现数据丢失、数据失真等情况,TCP协议会自动要求数据重新传输,并重新组包。总之,IP协议保证数据的传输,TCP协议保证数据传输的质量。TCP/IP协议数据的传输基于TCP/IP协议的四层结构:应用层、传输层、网络层、接口层,数据在传输时每通过一层就要在数据上加个包头,其中的数据供接收端同一层协议使用,而在接收端,每经过一层要把用过的包头去掉,这样来保证传输数据的格式完全一致。 TCP/IP协议介绍 TCP/IP的通讯协议 这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP 协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。 TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为: 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。 互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。

tcp协议包头

竭诚为您提供优质文档/双击可除 tcp协议包头 篇一:tcp包头格式 tcp包头格式 tcp数据被封装在一个ip数据包中: |—————————————————ip数据包———————————————| |————————tcp报文段——————————| tcp包头数据格式。如果不计可选项字段,它通常是20个字节。 源端口和目的端口: 每个tcp段都包含源端和目的端的端口号,用于寻找发起端和拉收端应用进程。这两个值加 上ip首部中的源ip地址和目的ip地址唯一确定一个tcp连接。有时,一个ip地址和一个端口 号也称为一个套接字(socket)。这个术语出现在最早的tcp规范(RFc793)中。套接字对 (socketpair)(包含客户ip地址、客户端口号、服务器ip地址和服务器端口号的四元组)可

唯一确定互联网络中每个tcp连接的双方。 序列号: 序列号用来标识从tcp发起端向tcp接收端发送的数据字节流,它表示在这个报文段中的 第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则tcp用序列号对每 个字节进行计数。序列号是32bit的无符号数,序号到达232-1后又从0开始。 确认序列号: 当建立一个新的连接时,syn标志变1。序列号字段包含由这个主机选择的该连接的初始 序号isn(initialsequencenumber)。该主机要发送数据的第一个字节序号为这个isn加1,因为syn标志消耗了一个序号(Fin标志也要占用一个序号)。既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加1。只有ack标志为1时确认序号字段才有效。 发送ack无需任何代价,因为32bit的确认序号字段和ack标志一样,总是tcp首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置,ack标志也总是被设置为1。 头部长度:

实验4-TCP数据包及连接建立过程分析

实验4TCP数据包及连接建立过程分析1.实验目的 1. 学习并分析TCP数据包的结构、含义 2.分析TCP连接的建立过程和数据传输过程。 2.实验设备与环境 1.Wireshark网络分析软件 2.实验文件“计算机网络-实验文件.cap” 3.相关知识 3.1 TCP 数据报结构 ●一个TCP 数据报由首部和数据两部分组成。 ●首部的前一部分是固定长度,共20 字节,是所有TCP数据报必须具有的。 ●在首部的固定部分的后面是一些可选字段,其长度是可变的。 3.2 TCP 连接的建立过程

● A 的TCP 向B 发出连接请求报文段,其首部中的同步比特SYN 应置为1,并选择 序号x (为了防止TCP syn 攻击,分组选择的是经过较复杂运算后得到的初始化序号,当然其相对序号应该视作是1),表明传送数据时的第一个数据字节的序号是x。 ● B 的TCP 收到连接请求报文段后,如同意,则发回确认。 ● B 在确认报文段中应将SYN 置为1,其确认号应为x + 1,同时也为自己选择序号 y(为了防止TCP syn 攻击,分组选择的是经过较复杂运算后得到的初始化序号,当然其相对序号应该视作是1)。 ● A 收到此报文段后,向B 给出确认,其确认号应为y + 1。 ● A 的TCP 通知上层应用进程,连接已经建立。 ●当运行服务器进程的主机B 的TCP 收到主机A 的确认后,也通知其上层应用进程, 连接已经建立。 4.实验内容 4.1 TCP数据包的结构和含义分析 打开文件“计算机网络-实验文件.cap”,这是一个包括204个分组的网络通信记录,详细记录了分组的序号、相对时间、源地址、目标地址、协议类型、内容,如图1是对第29个分组的详细信息。 图1 第29个分组的TCP数据包的解析 观察文件内第29个分组的TCP数据包详细信息,见图1。 ●它的前16位是1668,表示源端口是1668,是客户端的一般端口,(本机是客户端)●它的目的端口是0050(H)=8080,表明是访问服务器端的HTTP应用。 ●当前发送的数据首字节是0(相对值),表示为首发字节。它携带的数据包长度是0字 节,64(IP包全长,见IP包头的长度字段值)-20(IP首部长度)-44(TCP首部长度)=0字节,该TCP数据包未携带数据。 ●确认号字段为0,结合后面的ACK = 0,表明未携带确认信息。

计算机网络课程设计TCP数据包

《计算机网络》实验报告题目发送TCP数据包 成绩 学院名称 专业班级 学生姓名 学号 指导教师 二○一五年七月一日

目录 摘要 (3) 关键词 (3) 一、背景概述 (3) 二、设计内容 (4) 三、设计要求 (4) 四、需求分析 (4) 五、总体设计 (4) 程序流程图 (5) 设计思路 (5) 设计环境 (5) 基本功能 (7) 详细设计 (7) 六、总结与体会 (9) 七、参考文献 (10)

摘要 Internet是网络的集合,包括ARPANET、NSFNET、分布在各地的局域网、以及其它类型的网络,如(DDN,Defense Data Network美国国防数据网络),这些统称为Internet。所有这些大大小小的网络互联在一起。(因为大多数网络基本协议是由DDN组织开发的,所以以前有时DDN与Internet在某种意义上具有相同的含义)。网络上的用户可以互相传送信息,除一些有授权限制和安全考虑外。一般的讲,互联网协议文档案是Internet委员会自己采纳的基本标准。TCP/IP标准与其说由委员会指定,倒不如说由\"舆论\"来开发的。任何人都可以提供一个文档,以RFC(Request for Comment需求注释) 方式公布。 TCP/IP的标准在一系列称为RFC的文档中公布。文档由技术专家、特别工作组、或RFC编辑修订。公布一个文档时,该文档被赋予一个RFC量,如RFC959说明FTP、RFC793说明TCP、RFC791说明IP等。最初的RFC一直保留而从来不会被更新,如果修改了该文档,则该文档又以一个新号码公布。因此,重要的是要确认你拥有了关于某个专题的最新RFC文档。文后会列出主要的RFC文档号。 本课主要致力于发送TCP数据包。 关键词TCP 一、背景概述 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

TCP数据包的抓取与分析

计算机网络课程设计报告 课程设计题目:TCP数据包的抓取与分析 专业: 班级: 姓名: 学号: 指导教师: 年月日

目录 1.摘要 (3) 2.引言 (4) 3.目录 (2) 4.TCP数据包抓取 (5) 5.TCP数据包分析 (7) 6.程序设计 (8) 7.出现的错误和解决方法 (12) 8.结束语 (13) 9.参考文献 (14)

1.摘要 本课程设计通过Ethereal捕捉实时网络数据包,并根据网络协议分析流程对数据包在TCP/IP各层协议中进行实际解包分析,让网络研究人员对数据包的认识上升到一个感性的层面,为网络协议分析提供技术手段。最后根据Ethereal的工作原理,用Visual C++编写一个简单的数据包捕获与分析软件。 2.引言 本课程设计通过技术手段捕获数据包并加以分析,追踪数据包在TCP/IP各层的封装过程,对于网络协议的研究具有重要的意义。 Wireshark是当前较为流行的图形用户接口的抓包软件,是一个可以用来监视所有在网络上被传送的包,并分析其内容的程序。它通常被用来检查网络工作情况,或是用来发现网络程序的bugs。通过 Wireshark对TCP、UDP、SMTP、telnet和FTP等常用协议进行分析,非常有助于网络故障修复、分析以及软件和协议开发。,它以开源、免费、操作界面友好等优点广为世界各地网络研究人员使用为网络协议分析搭建了一个良好的研究平台。

3.TCP数据包的抓取1.首先运行Wireshark抓包软件 2.然后选取一个接口进行抓包

3.对TCP 包进行过滤 4.选取其中一个TCP数据包进行查看

TCP抓包分析

TCP抓包分析 一TCP 格式 源端口:数据发起者的端口号;? 目的端口:数据接收方的端口号; 32bit 序列号: 标识当前数据段的唯一性; 32bit 的确认号:接收数据方返回给发送方的通知; TCP头部长度为20字节,若TCP头部的Options选项启用,则会增加首部长度,因此TCP是首部变长的传输层协议; Reserved、Reserved、No nee CWR ECN-Echo 共6bit,保留待用。? URG1bit 紧急指针位,取值1代表这个数据是紧急数据需加速传递,取值0代表这 是普通数据;? ACK 1bit确认位,取值1代表这是一个确认的TCP包,取值0则不是确认包;PSH 1bit 紧急位,取值 1 代表要求发送方马上发送该分段,而接收方尽快的将报文交给应用层,不做队列处理。取值0 阿迪表这是普通数据;? RST 1bit重置位,当TCP收到一个不属于该主机的任何一个连接的数据,则向对方 发一个复位包,此时该位取值为1,若取值为0代表这个数据包是传给自己的;? SYN 1bit请求位,取值1代表这是一个TCP三次握手的建立连接的包,取值为0 就代表是其他包;? FIN : 1bit完成位,取值1代表这是一个TCPI断开连接的包,取值为0就代表是其他包;? Window?Size: 16bit窗口大小,表示准备收到的每个TCP数据的大小;? Checksum 16bit的TCP头部校验,计算TCP头部,从而证明数据的有效性;? Urgent?Pointer : 16bit紧急数据点,当功能bit中的URG取值为1时有效;? Options : TCP的头部最小20个字节。如果这里有设置其他参数,会导致头部增大;? Padding :当TCP头部小于20字节时会出现,不定长的空白填充字段,填充内容都 是0,但是填充长度一定会是32 的倍数;? Data :被TCP封装进去的数据,包含应用层协议头部和用户发出的数据。 二数据截图 1. 第一个TCP M文: 2. 第二个TCP M文: 3. 第三个TCP M文: 二分析 上面截图的三个TCP报文段表示了TCP连接时的三次握手阶段。 1. 第一个TCP报文 这是要建立连接的客户(我)向服务器发出连接请求段 在TRANSMISSION CONTROL PR0TOCO截图中我们可以知道源端口号也就是主机端口号为50590,而目的端口号为HTTP的80端口,确认号为0 (相对的),而首部长度为32字节,在标志位FLAGS( 0x0002)中,只设置了SYN也就是位同步标志,表示请求建立连接。窗口大小WINDOW SIZ为8192,校验和CHECKSUM 0x553a,说明是正确的。选项是12字节,里面的内容有最大段(MSS大小为1440字节,占4个字节。 2. 第二个TCP报文 这是服务器在收到请求后,发回确认(SYN+ACK。

TCP和UDP数据包发送与接收

实验6 TCP和UDP数据包发送与接收 一、实验目的 TCP协议是TCP/IP协议族的核心协议之一。熟悉TCP包结构对于理解网络层次结构,以及TCP协议与IP协议的关系有着重要意义。根据TCP协议的基本原理,通过封装与发送一个标准的TCP数据包,了解TCP包结构中各字段的含义与用途,从而深入理解传输层与下面各层的关系。 二、实验要求 (1)掌握TCP/UDP报头结构、各字段含义以及校验和计算方法; (2)使用Wincap(Lipcap)构造并发送TCP,UDP数据包; (3)使用原始套接字(Raw Socket)发送自定义的TCP,UDP数据包; (4)使用NDIS协议驱动发送自定义的TCP/UDP数据包。 三、实验内容 实验一SOCKET编程实验 实验内容 1、通过调试、运行“UDPClient”和“UDPServer”实验程序,加强对网络通讯原理 的了解。(或“简单Client”和“简单Server”实验程序,下同) 2、学习分析实验程序功能结构,了解基于SOCKET编程的网络通信软件的基本设计 方法。 3、在所提供的”UDPClient”和“UDPServer”实验程序基础上,完善程序功能。 4、通过实验学习和了解SOKCET通信的实现方法。 实验结果分析与总结 (1)总结运行”UDPClient”和“UDPServer”实验程序的运行情况。 UDPClient运行结

UDPServer运行结果 (2)设计交互程序的运行结果如下:

(3)总结程序设计的情况,列出所设计或修改部分的源代码清单。附上程序源代码。Client端修改的代码如下: //(3)开始接收或发送过程 printf("\n------------- waiting for message from Seaver -------------\n"); //进入一个循环 while (1) { //输入并发送信息给服务器 buffer[0]='\0'; //先清空发送缓冲区 printf("\n Input datagram send info ( quit 退出 ): "); //输入发送字符串 scanf("%s",buffer); sendto(socketid,buffer,sizeof buffer,0,(struct sockaddr*)&server,server_len); //发送信息 //控制循环退出 if(strcmp(buffer,"quit") == 0) //输入为quit则结束 { printf("\n send info quit"); return 0; } //接收服务器返回信息 buffer[0]='\0'; //先清空接收缓冲区 if(recvfrom(socketid,buffer,sizeof buffer,0,(struct sockaddr*)&server,&server_len)!=SOCKET_ERROR) //接收返回信息{

相关文档