[原创] TAHI报文“制作”简介

TAHI报文“制作”简介

报文“制作”简介... 1

概述... 1

链路层... 2

Packet_IPv4. 2

Packet_IPv6. 3

Packet_ARP. 4

Packet_RARP. 4

TCP. 4

UDP. 5

举例... 6

IPv4 TCP报文... 6

其他说明... 7

版权申明... 8

参考资料... 8

 

概述

TAHI这套开发工具的报文各个字段相当于一个个的类,你可以分别填充类中各个字段的值来生成一个对象,即组成一个你想要的报文。如果你不指定某些字段的值,那么这些字段会采用默认值,默认值请参考文档《IPv6 Verification Tool Users Manual(Rev.2.3)》第六章中列表出的默认值。

下面各个部分中的图表,开头的为该“类”的名字,下面各部分为“类”中的各个变量。有些变量后面有“()”,表示这个变量的类型是这个括号中的某个“类”。例如,图1表示类“Frame_Ether”,这个类有两个变量“header”和“packet”。“header”的类型是“Hder_Ether”,“packet”的类型可以是“Packet_IPv6”、“Packet_IPv4”、“Packet_ARP”或“Packet_RARP”。

在类“Hdr_IPv4”和“Hdr_IPv6”的下面都有一个大框框,里面放了多个变量,因为变量太多,没有将这些变量分开。

链路层

1

 

2

Packet_IPv4

3

 

4

 

Packet_IPv6

5

 

6

Packet_ARP

Packet_RARP

TCP

7

 

8

 

9

TCP举例:

FEM_tcp6(

    send_tcp, //packet name

    _HETHER_tn2nut, //link-layer address

    {//ipv6 address

       _SRC(tnv6());

       _DST(nutv6());

    },

    {//tcp header

       _SPORT(CPP_LOCAL_PRT);

       _DPORT(CPP_RMT_PRT);

       SequenceNumber       = CPP_SEQ_NO;

       AcknowledgmentNumber = CPP_ACK_NO;

       URGFlag           = CPP_URG_SEND;

       ACKFlag           = CPP_ACK_SEND;

       PSHFlag           = CPP_PSH_SEND;

       RSTFlag           = CPP_RST_SEND;

       SYNFlag           = CPP_SYN_SEND;

       FINFlag           = CPP_FIN_SEND;

    },

    {

       //tcp header

       header = _HDR_TCP_NAME(send_tcp);

       //tcp payload

       payload    = payload8;

    }

)

Payload示例:

Payload payload8 {

    data   = hexstr("0123456789abcdef", 8);

}

所以,所有的TCP报文都可以通过自己构造一个Payload来实现。但是这样做非常傻。。。

上面TCP举例采用了TAHI工具中已经撰写好的一些宏,请参阅这套工具中的“stdpacket.def”文件。

UDP

10

 

11

 

 

举例

这里的举例是我自己撰写的最朴实的例子,没有采用这套工具中提供的一些现成的宏,所以可能阅读起来比较直观,希望能对你理解本文有所帮助。

IPv4 TCP报文

我们要组装的TCP报文非常简单,TCP中所带的数据为“0x123456789abcdef”。

我们从最上层做起,首先组装好payload

Payload tcp_payload {

    data   = hexstr("0123456789abcdef", 8);

}

组装好TCP头:

Hdr_TCP tcp_header {

       SourcePort = 23;

       DestinationPort = 2152;

       SequenceNumber       = 0;

       AcknowledgmentNumber = 0;

       URGFlag           = 0;

       ACKFlag           = 0;

       PSHFlag           = 0;

       RSTFlag           = 0;

       SYNFlag           = 0;

       FINFlag           = 0;

}

TCP头中省略的字段采用默认值。

通过以上两步,根据7即可组成一个“Upp_TCP”:

Upp_TCP upper_tcp {

    header = tcp_header;

    payload = tcp_payload;

}

 

上面几步已经将传输层及其上层部分填充好了,下面开始填充网络层和链路层部分。

我们这个报文是IPv4报文,所以根据3来填充。

我们忽略“exthdr”,而“upper”责采用我们刚刚做好的“upper_tcp”,我们还需要一个“Hdr_IPv4”,即IPv4的头部,这个头部根据4来填充:

Hdr_IPv4 ip4_header {

    SourceAddress = v4("192.168.10.1");

    DestinationAddress = v4("192.168.10.2");

}

忽略的字段采用默认值。上面调用的“v4(xxx)”为将字符串转换成地址的函数,请参阅IPv6 Verification Tool Users Manual(Rev.2.3)4.3.3部分。

于是我们可以做好整个网络层(及其上层)了,根据3

Packet_IPv4 ip4_packet {

    header = ip4_header;

    upper = upper_tcp;

}

下面我们在来构建链路层。根据1,“packet”我们在上面已经构建好了,现在还差一个链路层的头部“header”,类型为“Hdr_Ether”。我们根据2来构建这个头部:

Hdr_Ether ether_header {

    SourceAddress = ether("00:e0:4c:5a:78:eb");

DestinationAddress = ether("00:e0:4c:6a:59:ab");

    Type = 0x0800;

}

上面调用的“ether(xxx)”请参考文档IPv6 Verification Tool Users Manual(Rev.2.3)4.3.1部分。

我们的报文的各个组件已经就绪完毕,下面我们根据1来组装从链路层开始的完整的报文:

Frame_Ether my_packet {

    header = ether_header;

    packet = ip4_packet;

}

 

这个报文的名字就是“my_packet”。

将以上代码写进一个“.def”文件,然后在“.seq”文件就可以调用“my_packet”来发送这个报文。对于“.def”和“.seq”文件请参考我写的另一篇文章TAHI测试脚本撰写指南》

以上代码我已经测试通过。

 

组成一个IPv4UDP报文也和上面的步骤类似。IPV6的报文组装在这套测试工具已些好的PERL代码中非常多,具有很好的参考价值。

其他说明

在自己组装报文的地址时,可以参考文档IPv6 Verification Tool Users Manual(Rev.2.3)》第四章4.3部分中提到的一些函数,组装报文的data等部分也可以参考这篇文档第四章的其他部分。另外,这套开发工具中还已经定义好了很多地址、IPV6的报文的各个部分等等,都可以拿来使用。

具体的例子请参考TAHI这套开发工具已经撰写好的测试IPV6PERL代码,参考资料的各个章节很有针对性,也都值得一看。

版权申明

所有版权规 喜玛拉雅(Hmilyajiao@yahoo.com.cn 所有。欢迎转载,但转载时请务必注明原始出处并包含本版权申明。

参考资料

1.      IPv6 Verification Tool Users Manual(Rev.2.3)

2.      TAHI测试脚本撰写指南》

 

 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值