IP数据包头部,TCP头部,伪TCP头部结构定义

我自己整理出来的汇编版本

;;IP数据包头部结构定义
ip_head struct
     h_lenver db ? ;4位IP版本号+4位首部长度
     TOS db ? ;8位服务类型
     tcp_len dw ? ;16位TCP数据包总长度
    ident dw ? ;16位标识
    frag_and_flags dw ? ;3位分片标志+13位分片偏移
    ttl db ? ;8位生存时间
     proto db ? ;8位协议类型
     checksum dw ? ;16位校验和
    sourceIP dd ? ;32位源IP
     destIP dd ? ;32位目的IP
ip_head ends

;;TCP头部结构定义
tcp_head struct
    th_sport dw ? ;16位源端口
     th_dport dw ? ;16位目的端口
     th_seq dd ? ;32位序列号
    th_ack dd ? ;32位确认号
    th_lenres db ? ;4位首部长度+6位保留字,注意这个字段和下面的标志共16位,因6位保留为0,为了定义方便所以填充时可按8位填充两个字段
     th_flag db ? ;6位标志位
     th_win dw ? ;16位窗口大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验三 发送TCP数据包 实验目的: 设计一个发送TCP数据包的程序,并根据本设计说明TCP数据包结构以及TCP协议与 IP协议的关系,使大家对TCP协议的工作原理有更深入的认识。 实验要求: 本程序的功能是填充一个TCP数据包,并发送给目的主机。 以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port 其中SendTCP为程序名;source_ip为源IP地址; source_port为源端口; dest_ip为目的IP地址; dest_port为目的端口。 其他的TCP头部参数自行设定。 数据字段为"This is my homework of network!". 成功发送后在屏幕上输出"send OK"。 课程设计分析: 使用原始套接字 定义IP头部TCP头部头部的数据结构 填充数据包 发送数据包 设计思想: 本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整个程 序由初始化原始套接字和发送TCP数据包两个部分组成。 创建一个原始套接字,并设置IP选项 SOCKET sock; 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。如果没有,就添加。 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。 构造IPTCP 这里, IPTCP以及TCP部的构造请参考下面它们的数据结构。 计算校验和的子函数 在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IPTCP头部(加上头部),其实现代码如下: 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); } 程序流程图: 源程序代码: #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> #include <time.h> #include <windows.h> #include <string.h> #include <stdlib.h> #include <iostream.h> #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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值