NBT Name Service虽然有17种不同的包类型,但是其组成都只有三个部分。
- A Header
- Query Records
- Resource Records
1. Name Service Headers
头部是由6个16bit的数据组成的,其组成如下。
0 NAME_TRN_ID
1 FLAGS
2 QDCOUNT
3 ANCOUNT
4 NSCOUNT
5 ARCOUNT
这里要单独的说一下FLAGS域,这个域很特别。它由下面的几个部分组成
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
R | OPCODE | NM_FLAGS | RCODE | ||||||||||||
0 | 0 1 1 1 | 0 0 0 0 0 0 0 | 0 0 0 0 |
其中的OPCODE表示操作码,NM_FLAGS表示标志位,RCODE为返回码。
最后还要考虑的是大小端的问题,由于NBT使用的是网络字节序,也就是大端字节序。所以,下面这些函数是,我们转换字节序的
工具, htonl() , htons() , ntohl() , and ntohs()。特别注意SMB是使用的小端字节序。
2. Name Service Resource Records
我们通常将Resource Records部分分为三个子部分。
- the Name section
- the TTL field
- the Resource Data section