TAHI报文“制作”简介
概述
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测试脚本撰写指南》
以上代码我已经测试通过。
组成一个IPv4的UDP报文也和上面的步骤类似。IPV6的报文组装在这套测试工具已些好的PERL代码中非常多,具有很好的参考价值。
其他说明
在自己组装报文的地址时,可以参考文档《IPv6 Verification Tool Users Manual(Rev.2.3)》第四章4.3部分中提到的一些函数,组装报文的data等部分也可以参考这篇文档第四章的其他部分。另外,这套开发工具中还已经定义好了很多地址、IPV6的报文的各个部分等等,都可以拿来使用。
具体的例子请参考TAHI这套开发工具已经撰写好的测试IPV6的PERL代码,参考资料的各个章节很有针对性,也都值得一看。
版权申明
所有版权规 喜玛拉雅(Hmilyajiao@yahoo.com.cn) 所有。欢迎转载,但转载时请务必注明原始出处并包含本版权申明。
参考资料
1. 《IPv6 Verification Tool Users Manual(Rev.2.3)》
2. 《TAHI测试脚本撰写指南》