创建报文

我想发一个TCP/IP 的原始包,但是tcp的校验和总是不对,请各位大虾帮忙
下面是我的  TCP/IP 的原始包的构造
typedef struct ip_hdr
{
    unsigned char  ip_verlen;        // IP version & length
    unsigned char  ip_tos;           // IP type of service
    unsigned short ip_totallength;   // Total length
    unsigned short ip_id;            // Unique identifier 
    unsigned short ip_offset;        // Fragment offset field
    unsigned char  ip_ttl;           // Time to live
    unsigned char  ip_protocol;      // Protocol(TCP, UDP, etc.)
    unsigned short ip_checksum;      // IP checksum
    unsigned int   ip_srcaddr;       // Source address
    unsigned int   ip_destaddr;

}IP_HDR; 


typedef struct tcp_hdr
{
     unsigned short    sport;
     unsigned short    dport;
     unsigned int             seqnum;
     unsigned int             acknum;
     unsigned char              DataOffset;
     unsigned char             Flags;
     unsigned short    Windows;
     unsigned short    Checksum;
     unsigned short    UrgPointer;

}TCP_HDR;


typedef struct ps_hdr
{
   unsigned int source_address;
   unsigned int dest_address;
   unsigned char placeholder;
   unsigned char protocol;
   unsigned short tcp_length;
 

}PS_HDR;


unsigned short checksum(unsigned short *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 (unsigned short)(~cksum); 
}

void makerawpacket()
{
    ip_hdr ipheader; 
    tcp_hdr tcp_header;
    DWORD dwFromIP = inet_addr("192.168.0.102"); 
    DWORD dwToIP = inet_addr("192.168.0.1");
    char buf[50];
    ipheader.ip_totallength = htons(50);
    ipheader.ip_offset = 0x40;            
    ipheader.ip_ttl = 128;              
    ipheader.ip_protocol = IPPROTO_TCP; 
    ipheader.ip_checksum = 0 ; 
    ipheader.ip_id=htons(1);  
    ipheader.ip_srcaddr=dwFromIP;
    ipheader.ip_destaddr=dwToIP;
    ipheader.ip_checksum=checksum((unsigned short *)&ipheader,20);

    tcp_header.sport=htons(100);
    tcp_header.dport=htons(1011);
    tcp_header.DataOffset=(5) << 4;
    tcp_header.Flags=ACK+PSH;
    tcp_header.Checksum=0;
    tcp_header.UrgPointer=0;


   PS_HDR   pseudo_header;
   pseudo_header.source_address =ipheader.ip_srcaddr ;
   pseudo_header.dest_address =ipheader.ip_destaddr ;
   pseudo_header.placeholder = 0;
   pseudo_header.protocol = IPPROTO_TCP;
   pseudo_header.tcp_length = htons(sizeof(tcp_header));

   ZeroMemory(buf, sizeof(buf));
   memcpy(buf,&pseudo_header,sizeof(pseudo_header));
   char *ptr=NULL;
   ptr=buf+sizeof(pseudo_header);
   memcpy(ptr,&tcp_header,20);
   ptr+=20;
   memcpy(ptr, "qqqqqqqqqq",10);//包中有数据“qqqqqqqqqq”
   ptr+=10; 
   //计算tcp包的校验和
   tcp_header.Checksum = checksum((unsigned short*)buf,sizeof    (pseudo_header)+30);
  
  //buf 为原始包
  ZeroMemory(buf, sizeof(buf));
  ptr = buf;
  memcpy(ptr, &ipheader, sizeof(ipheader));
  ptr += sizeof(ipheader);
  memcpy(ptr, &tcp_header, sizeof(tcp_header));
  ptr += sizeof(tcp_header);  
  memcpy(ptr, "qqqqqqqqqq",10);

}
这样产生的原始包总报tcp的校验和错误。若包中无数据,校验和是对的。
请各位大虾帮忙看一下,不胜感激!!!
<think>我们正在讨论如何用Xcap创建VLAN报文。Xcap是一个网络封包编辑与发送工具,通常用于网络测试和教学。创建VLAN报文需要构建带有802.1Q标签的以太网帧。 步骤: 1. 打开Xcap,创建一个新的以太网帧。 2. 在以太网帧头中,设置目的MAC地址和源MAC地址。 3. 在类型/长度字段后,插入802.1Q标签(4字节): - 前2字节是TPID(Tag Protocol Identifier),通常为0x8100(表示802.1Q标签)。 - 后2字节是TCI(Tag Control Information),包括: - 3位的优先级(PRI) - 1位的CFI(Canonical Format Indicator) - 12位的VLAN ID(VID) 4. 在802.1Q标签之后,设置上层协议类型(例如,IPv4为0x0800,ARP为0x0806等)。 5. 然后添加上层协议数据(如IP头、TCP头等)。 6. 最后发送该报文。 注意:在Xcap中,我们可以通过手动编辑帧的每个字段来实现。 示例:创建一个VLAN ID为10的以太网帧,上层协议为IPv4。 - 目的MAC:00:11:22:33:44:55 - 源MAC:00:AA:BB:CC:DD:EE - 类型:0x8100(表示后面是802.1Q标签) - 然后添加802.1Q标签:TCI字段中,VLAN ID设置为10(即0x000A),其他位根据需求设置(比如优先级0,CFI=0)。 - 接着是上层协议类型:0x0800(表示IPv4) - 然后添加IPv4头部等。 但是,在Xcap中,我们通常可以在以太网类型字段直接选择802.1Q,然后填写VLAN ID等信息。 具体操作步骤(以Xcap界面为例): 1. 启动Xcap,点击“New”创建一个新的报文。 2. 在“Ethernet II”部分: - 设置Destination MAC和Source MAC。 - 在Type/Length字段,选择或输入0x8100(这表示后面是802.1Q标签)。 3. 这时,在以太网头部后面会自动添加一个802.1Q标签的字段。在该字段中: - 设置Priority(0-7),CFI(0或1),VLAN ID(0-4095)。 4. 然后在802.1Q标签后面,需要设置上层协议类型(EtherType),例如0x0800(IPv4)。 5. 接着在IPv4部分设置IP头信息,等等。 注意:在Xcap中,我们可以通过添加协议层来构建报文。因此,在以太网层之后,我们可以添加一个802.1Q层,然后再添加IP层等。 下面是一个简化的文本描述,因为无法实际截图,所以用文字描述各层。 报文层次结构: Ethernet II: Destination: 00:11:22:33:44:55 Source: 00:AA:BB:CC:DD:EE Type: 0x8100 (Dot1Q) Dot1Q: Priority: 0 CFI: 0 VLAN ID: 10 Type: 0x0800 (IPv4) IPv4: ... (后续部分) 这样,我们就创建了一个带有VLAN标签的报文。 注意:在Xcap中,我们也可以使用十六进制编辑模式直接输入整个报文的十六进制数据。 示例报文的十六进制(假设VLAN ID为10,优先级0,CFI0,上层为IPv4): 目的MAC:00 11 22 33 44 55 源MAC:00 AA BB CC DD EE 类型:81 00 (表示802.1Q) 标签:00 0A (TCI:前4位为优先级和CFI,这里为0,后12位为VLAN ID=10,所以是0x000A) 上层类型:08 00 (IPv4) 然后后面是IP数据等。 因此,完整的以太网帧前14字节(含上层数据)为: 00 11 22 33 44 55 00 AA BB CC DD EE 81 00 00 0A 08 00 ... 现在,根据规则,我们需要在回答后提出3-5个相关问题。</think>使用Xcap创建VLAN报文(802.1Q帧)的步骤如下: 1. **启动Xcap并创建报文** - 打开Xcap → 点击"New"创建报文 → 选择"Ethernet II"作为基础协议 2. **配置以太网帧头** ```plaintext Destination MAC: [目标MAC地址] // 如00:11:22:33:44:55 Source MAC: [源MAC地址] // 如AA:BB:CC:DD:EE:FF EtherType: 0x8100 // 必须设为0x8100表示802.1Q标签 ``` 3. **添加VLAN标签字段** 在协议栈中右键添加"802.1Q Virtual LAN"层,配置: ```plaintext Priority (3 bits): 0-7的优先级值 // 默认0 CFI (1 bit): 0 (标准格式)或1 (传统格式) VLAN ID (12 bits): 1-4094的VLAN号 // 如VLAN 10 ``` 4. **添加上层协议** 在VLAN标签后添加实际载荷协议层(如IPv4/ARP): ```plaintext 802.1Q的EtherType字段 → 设为上层协议类型 例如:0x0800 (IPv4) 或 0x0806 (ARP) ``` 5. **生成报文** - 点击"Generate"自动填充校验和 - 通过十六进制视图验证结构: ``` [目标MAC][源MAC] 81 00 [TCI高字节][TCI低字节] [上层协议类型]... 示例:00:11:22:33:44:55 AA:BB:CC:DD:EE:FF 81 00 00 0A 08 00... (其中00 0A表示VLAN 10) ``` > **关键点**:VLAN标签位于源MAC和上层协议类型之间,通过EtherType 0x8100标识,TCI字段包含优先级、CFI和VLAN ID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值