DNS协议报文(RFC1035)
<DIV><DIV style="MARGIN: 15px" id=art width="100%">
<DIV id=blog_text class=cnt>
<P><STRONG><SPAN><FONT face=宋体>一、域名和资源记录的定义</FONT></SPAN></STRONG></P>
<P><STRONG><SPAN><FONT face=宋体>1、Name space definitions<BR>2、资源记录定义(RR definitions)</FONT></SPAN></STRONG><SPAN><BR><FONT face=宋体> </FONT><FONT face=宋体><STRONG>2.1 格式<BR></STRONG> 后面分析报文的时候详细解释。<BR> </FONT><FONT face=宋体><STRONG>2.2 类型值(TYPE values)<BR></STRONG> 类型主要用在资源记录中,注意下面的值是QTYPE的一个子集。<BR><STRONG> 类型 值和含义</STRONG><BR> A 1 a host address<BR> NS 2 an authoritative name server<BR> MD 3 a mail destination (Obsolete - use MX)<BR> MF 4 a mail forwarder (Obsolete - use MX)<BR> CNAME 5 the canonical name for an alias<BR> SOA 6 marks the start of a zone of authority<BR> MB 7 a mailbox domain name (EXPERIMENTAL)<BR> MG 8 a mail group member (EXPERIMENTAL)<BR> MR 9 a mail rename domain name (EXPERIMENTAL)<BR> NULL 10 a null RR (EXPERIMENTAL)<BR> WKS 11 a well known service description<BR> PTR 12 a domain name pointer<BR> HINFO 13 host information<BR> MINFO 14 mailbox or mail list information<BR> MX 15 mail exchange<BR> TXT 16 text strings<BR> </FONT><FONT face=宋体><STRONG>2.3 查询类型(QTYPE values)<BR></STRONG> 查询类型出现在问题字段中,查询类型是类型的一个超集,所有的类型都是可用的查询类型,其他查询类型如下:<BR> AXFR 252 A request for a transfer of an entire zone<BR> MAILB 253 A request for mailbox-related records (MB, MG or MR)<BR> MAILA 254 A request for mail agent RRs (Obsolete - see MX)<BR> * 255 A request for all records<BR> <STRONG>2.4 类(CLASS values)</STRONG><BR> IN 1 the Internet<BR> CS 2 the CSNET class (Obsolete - used only for examples in some obsolete RFCs)<BR> CH 3 the CHAOS class<BR> HS 4 Hesiod <BR> <STRONG>2.5 查询类(QCLASS values)</STRONG><BR> 查询类是类的一个超集<BR> * 255 any class<BR> 3、Standard RRs<BR> 3.1 CNAME RDATA format<BR> 3.2 HINFO RDATA format<BR> 3.3 MB RDATA format (EXPERIMENTAL)<BR> 3.4 MD RDATA format (Obsolete)<BR> 3.5 MF RDATA format (Obsolete)<BR> 3.6 MG RDATA format (EXPERIMENTAL)<BR> 3.7 MINFO RDATA format (EXPERIMENTAL)<BR> 3.8 MR RDATA format (EXPERIMENTAL)<BR> 3.9 MX RDATA format<BR> 3.10 NULL RDATA format (EXPERIMENTAL)<BR> 3.11 NS RDATA format<BR> 3.12 PTR RDATA format<BR> 3.13 SOA RDATA format<BR> 3.14 TXT RDATA format<BR> 4、ARPA Internet specific RRs<BR> 4.1 A RDATA format<BR> 4.2 WKS RDATA format<BR>5、IN-ADDR.ARPA domain<BR>6、Defining new types, classes, and special namespaces<BR><BR></FONT></SPAN><STRONG><SPAN><FONT face=宋体>二、报文</FONT></SPAN></STRONG></P>
<P><FONT face=宋体><SPAN><STRONG>1、报文格式(Format)<BR></STRONG> dns请求和应答都是用相同的报文格式,分成5个段(有的报文段在不同的情况下可能为空),如下:<BR> +---------------------+<BR> | Header | 报文头<BR> +---------------------+<BR> | Question | 查询的问题<BR> +---------------------+<BR> | Answer | 应答<BR> +---------------------+<BR> | Authority | 授权应答<BR> +---------------------+<BR> | Additional | 附加信息<BR> +---------------------+<BR> Header段是必须存在的,它定义了报文是请求还是应答,也定义了其他段是否需要存在,以及是标准查询还是其他。<BR> Question段描述了查询的问题,包括查询类型(QTYPE),查询类(QCLASS),以及查询的域名(QNAME)。剩下的3个段包含相同的格式:一系列可能为空的资源记录(RRs)。Answer段包含回答问题的RRs;授权段包含授权域名服务器的RRs;附加段包含和请求相关的,但是不是必须回答的RRs。<BR> <STRONG>1.1 Header的格式</STRONG><BR> 报文头包含如下字段:<BR> 1 1 1 1 1 1<BR> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | ID |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> |QR| Opcode |AA|TC|RD|RA| Z | RCODE |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | QDCOUNT |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | ANCOUNT |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | NSCOUNT |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | ARCOUNT |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 各字段分别解释如下:<BR> <STRONG>ID</STRONG> 请求客户端设置的16位标示,服务器给出应答的时候会带相同的标示字段回来,这样请求客户端就可以区分不同的请求应答了。<BR> <STRONG>QR</STRONG> 1个比特位用来区分是请求(0)还是应答(1)。<BR> <STRONG>OPCODE</STRONG> 4个比特位用来设置查询的种类,应答的时候会带相同值,可用的值如下:<BR> 0 标准查询 (QUERY)<BR> 1 反向查询 (IQUERY)<BR> 2 服务器状态查询 (STATUS)<BR> 3-15 保留值,暂时未使用<BR> <STRONG>AA</STRONG> 授权应答(Authoritative Answer) - 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器。<BR> 注意因为别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或者应答中的第一个主域名。<BR> <STRONG>TC</STRONG> 截断(TrunCation) - 用来指出报文比允许的长度还要长,导致被截断。<BR> <STRONG>RD</STRONG> 期望递归(Recursion Desired) - 这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。<BR> <STRONG>RA</STRONG> 支持递归(Recursion Available) - 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。</SPAN><BR></FONT><SPAN><FONT face=宋体> <STRONG>Z</STRONG> 保留值,暂时未使用。在所有的请求和应答报文中必须置为0。<BR> <STRONG>RCODE</STRONG> 应答码(Response code) - 这4个比特位在应答报文中设置,代表的含义如下:<BR> 0 没有错误。<BR> 1 报文格式错误(Format error) - 服务器不能理解请求的报文。<BR> 2 服务器失败(Server failure) - 因为服务器的原因导致没办法处理这个请求。<BR> 3 名字错误(Name Error) - 只有对授权域名解析服务器有意义,指出解析的域名不存在。<BR> 4 没有实现(Not Implemented) - 域名服务器不支持查询类型。<BR> 5 拒绝(Refused) - 服务器由于设置的策略拒绝给出应答。比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer)。<BR> 6-15 保留值,暂时未使用。<BR> <STRONG>QDCOUNT</STRONG> 无符号16位整数表示报文请求段中的问题记录数。<BR> <STRONG>ANCOUNT</STRONG> 无符号16位整数表示报文回答段中的回答记录数。<BR> <STRONG>NSCOUNT</STRONG> 无符号16位整数表示报文授权段中的授权记录数。<BR> <STRONG>ARCOUNT</STRONG> 无符号16位整数表示报文附加段中的附加记录数。<BR> <STRONG>1.2 Question的格式</STRONG><BR> 在大多数查询中,Question段包含着问题(question),比如,指定问什么。这个段包含QDCOUNT(usually 1)个问题,每个问题为下面的格式:<BR> 1 1 1 1 1 1<BR> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | |<BR> / QNAME /<BR> / /<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | QTYPE |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | QCLASS |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 字段含义如下<BR> <STRONG>QNAME</STRONG> 域名被编码为一些labels序列,每个labels包含一个字节表示后续字符串长度,以及这个字符串,以0长度和空字符串来表示域名结束。注意这个字段可能为奇数字节,不需要进行边界填充对齐。<BR> <STRONG>QTYPE</STRONG> 2个字节表示查询类型,.取值可以为任何可用的类型值,以及通配码来表示所有的资源记录。<BR> <STRONG>QCLASS</STRONG> 2个字节表示查询的协议类,比如,IN代表Internet。<BR> </FONT><FONT face=宋体><STRONG>1.3 资源记录格式(Resource record)<BR></STRONG> 应答,授权,附加段都共用相同的格式:多个资源记录,资源记录的个数由报文头段中对应的几个数值确定,每个资源记录格式如下:<BR> 1 1 1 1 1 1<BR> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | |<BR> / /<BR> / NAME /<BR> | |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | TYPE |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | CLASS |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | TTL |<BR> | |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | RDLENGTH |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|<BR> / RDATA /<BR> / /<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 各字段含义如下:<BR> <STRONG>NAME</STRONG> 资源记录包含的域名<BR> <STRONG>TYPE</STRONG> 2个字节表示资源记录的类型,指出RDATA数据的含义<BR> <STRONG>CLASS</STRONG> 2个字节表示RDATA的类<BR> <STRONG>TTL</STRONG> 4字节无符号整数表示资源记录可以缓存的时间。0代表只能被传输,但是不能被缓存。<BR> <STRONG>RDLENGTH</STRONG> 2个字节无符号整数表示RDATA的长度<BR> <STRONG>RDATA</STRONG> 不定长字符串来表示记录,格式根TYPE和CLASS有关。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一个4个字节的ARPA网络地址。<BR> </FONT><FONT face=宋体><STRONG>1.4 报文压缩<BR></STRONG> 为了减小报文,域名系统使用一种压缩方法来消除报文中域名的重复。使用这种方法,后面重复出现的域名或者labels被替换为指向之前出现位置的指针。<BR> 指针占用2个字节,格式如下:<BR> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> | 1 1| OFFSET |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 前两个比特位都为1。因为lablels限制为不多于63个字节,所以label的前两位一定为0,这样就可以让指针与label进行区分。(10 和 01 组合保留,以便日后使用) 。偏移值(OFFSET)表示从报文开始的字节指针。偏移量为0表示ID字段的第一个字节。<BR> 压缩方法让报文中的域名成为:<BR> - 以0结尾的labels序列<BR> - 一个指针<BR> - 指针结尾的labels序列<BR> 指针只能在域名不是特殊格式的时候使用,否则域名服务器或解析器需要知道资源记录的格式。目前还没有这种情况,但是以后可能会出现。<BR> 如果报文中的域名需要计算长度,并且使用了压缩算法,那么应该使用压缩后的长度,而不是压缩前的长度。<BR> 程序可以自由选择是否使用指针,虽然这回降低报文的容量,而且很容易产生截断。不过所有的程序都应该能够理解收到的报文中包含的指针。<BR> 比如,一个报文需要使用域名F.ISI.ARPA,FOO.F.ISI.ARPA,ARPA,以及根。忽略报文中的其他字段,应该编码为:<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 20 | 1 | F |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 22 | 3 | I |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 24 | S | I |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 26 | 4 | A |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 28 | R | P |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 30 | A | 0 |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</FONT></SPAN></P>
<P><SPAN><FONT face=宋体> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 40 | 3 | F |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 42 | O | O |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 44 | 1 1| 20 |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</FONT></SPAN></P>
<P><SPAN><FONT face=宋体> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 64 | 1 1| 26 |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</FONT></SPAN></P>
<P><SPAN><FONT face=宋体> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+<BR> 92 | 0 | |<BR> +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+</FONT></SPAN></P>
<P><SPAN><FONT face=宋体> 偏移20的是域名F.ISI.ARPA。域名FOO.F.ISI.ARPA偏移40; 这样表示FOO的label后面跟着一个指向之前F.ISI.ARPA的指针。域名ARPA偏移64,使用一个指针指向F.ISI.ARPA的ARPA。注意可以用这个指针是因为ARPA是从偏移位置20开始的labels序列中的最后一个label。 根域名在位置92定义为一个0,没有labels。<BR></FONT></SPAN></P>
<P><SPAN><FONT face=宋体><STRONG>2、传输(Transport)<BR></STRONG> DNS假设报文以数据报,或者从虚链路上以字节流进行传输。虚链路可以用来任何的DNS的传输,数据报可以减少代价提高传输性能。区域刷新必须使用虚链路,因为需要一个可靠的传输。<BR> 因特网中DNS支持端口53的TCP和端口53的UDP 传输。<BR> </FONT><FONT face=宋体><STRONG>2.1 使用UDP<BR></STRONG> 消息通过UDP的53端口进行传输。<BR> UDP传输的消息严格要求限制在512字节内(不包括IP和UDP头)。长报文被截断,同时置报文头的TC标志位。<BR> UDP不能用于区域传输,主要用在标准的域名查询。报文通过UDP可能会丢失,所以重传机制是需要的,请求和应答可能在网络中或者服务器处理的时候被重新排序,所以解析客户端不能依赖请求的发送顺序。<BR> UDP的最优重传策略会因为网络的性能,客户的需要而不同,但是下面是推荐的:<BR> - 客户端在对一台固定的服务器重试之前,尝试一下其他的服务器。<BR> - 如果可能的话,重传的时间间隔需要建立在统计分析数据的基础上,太快的重试可能因为量太大导致服务器响应慢。建议的重试时间为2-5秒。<BR> <STRONG>2.2 使用TCP</STRONG><BR> 通过TCP发送的报文使用53端口,报文的前面有个字节表示后面报文的长度,长度不包括自己占用的2个字节,这个长度使得底层收取完整的报文后在交给上层处理。<BR> 很多连接管理策略如下:<BR> - 服务器不能阻塞其他传输TCP数据的请求。<BR> - 服务器需要支持多连接</FONT></SPAN><BR><SPAN><FONT face=宋体> - 服务器要等客户端主动关闭连接,除非所有的数据都已经传输完了。<BR> - 如果服务器想关闭没有通讯的连接来释放资源,那么需要等待大约2分钟的时间。特别是要等SOA和AXFR(刷新操作中)在一个连接上传输完。服务器关闭连接的时候可以单方面的关闭,或者直接reset掉连接。</FONT></SPAN></P>
<P><SPAN><FONT face=宋体>三、实例<BR>1、请求解析www.baidu.com.<BR> 在linux下使用tcpdump port 53抓包,同时使用dig进行解析测试,得到结果如下:<BR> ; (1 server found)<BR> ;; global options: +cmd<BR> ;; Got answer:<BR> ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1169<BR> ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 0</FONT></SPAN></P>
<P><SPAN><FONT face=宋体> ;; QUESTION SECTION:<BR> ;www.baidu.com. IN A</FONT></SPAN></P>
<P><SPAN><FONT face=宋体> ;; ANSWER SECTION:<BR> </FONT><a href="http://www.baidu.com/" target="_blank"><FONT face=宋体>www.baidu.com</FONT></A><FONT face=宋体>. 1200 IN CNAME </FONT><a href="http://www.a.shifen.com/" target="_blank"><FONT face=宋体>www.a.shifen.com</FONT></A><FONT face=宋体>.<BR> </FONT><a href="http://www.a.shifen.com/" target="_blank"><FONT face=宋体>www.a.shifen.com</FONT></A><FONT face=宋体>. 600 IN A 121.14.88.76<BR> </FONT><a href="http://www.a.shifen.com/" target="_blank"><FONT face=宋体>www.a.shifen.com</FONT></A><FONT face=宋体>. 600 IN A 121.14.89.10</FONT></SPAN></P>
<P><SPAN><FONT face=宋体> ;; AUTHORITY SECTION:<BR> a.shifen.com. 86411 IN NS ns5.a.shifen.com.<BR> a.shifen.com. 86411 IN NS ns6.a.shifen.com.<BR> a.shifen.com. 86411 IN NS ns1.a.shifen.com.<BR> a.shifen.com. 86411 IN NS ns3.a.shifen.com.<BR> 1.1 请求报文<BR>0x0000: 4500 003b f8cf 0000 4011 f9ae xxxx xxxx E..;....@......r<BR>0x0010: xxxx xxxx 92b8 0035 0027 23ed <SPAN style="COLOR: rgb(255,0,0)">0491</SPAN> <SPAN style="COLOR: rgb(255,0,255)">0100</SPAN> ...q...5.'#.....<BR>0x0020: <SPAN style="COLOR: rgb(128,0,128)">0001 0000 0000 0000</SPAN> <SPAN style="COLOR: rgb(255,0,0)">0377 7777 0562 6169</SPAN> .........www.bai<BR>0x0030: <SPAN style="COLOR: rgb(255,0,0)">6475 0363 6f6d </SPAN><SPAN style="COLOR: rgb(255,0,0)">00</SPAN><SPAN style="COLOR: rgb(0,0,255)">00 0100 01</SPAN> du.com.....<BR> <SPAN style="COLOR: rgb(255,0,0)">0491</SPAN>:报文ID,也就是十进制的1169<BR> <SPAN style="COLOR: rgb(255,0,255)">0100</SPAN>:标志,置了RD字段,也就是期望递归的请求<BR> <SPAN style="COLOR: rgb(128,0,128)">0001 0000 0000 0000</SPAN>:分别为问题数,应答数,授权记录数,附加记录数,也就是1个问题<BR> <SPAN style="COLOR: rgb(255,0,0)">0377 7777 0562 6169 <SPAN style="COLOR: rgb(255,0,0)">6475 0363 6f6d </SPAN><SPAN style="COLOR: rgb(255,0,0)">00</SPAN></SPAN>:也就是</FONT><a href="http://www.baidu.com/" target="_blank"><FONT face=宋体>www.baidu.com</FONT></A><FONT face=宋体>的编码<BR> <SPAN style="COLOR: rgb(0,0,255)">00 0100 01</SPAN>:查询类型和查询类都为1,也就是internet的A记录查询<BR> 1.2 应答报文<BR>0x0000: 4500 00be 0016 4000 4011 b1e5 xxxx xxxx </FONT><a href="mailto:E.....@.@......q" target="_blank"><FONT face=宋体>E.....@.@......q</FONT></A><BR><FONT face=宋体>0x0010: xxxx xxxx 0035 92b8 00aa 33e1 <SPAN style="COLOR: rgb(255,0,0)">0491</SPAN> <EM><SPAN style="COLOR: rgb(255,0,255)">8180</SPAN></EM> ...r.5....3.....<BR>0x0020: <SPAN style="COLOR: rgb(128,0,128)">0001 0003 0004 0000</SPAN> <SPAN style="COLOR: rgb(255,0,0)">0377 7777 0562 6169</SPAN> .........www.bai<BR>0x0030: <SPAN style="COLOR: rgb(255,0,0)">6475 0363 6f6d</SPAN><SPAN style="COLOR: rgb(255,0,0)"><SPAN> </SPAN><SPAN><SPAN>00</SPAN></SPAN></SPAN><SPAN style="COLOR: rgb(0,0,255)">00 0100 01</SPAN>c0 0c00 0500 du.com..........<BR>0x0040: 0100 0004 b000 0f03 7777 7701 6106 7368 ........www.a.sh<BR>0x0050: 6966 656e <SPAN style="BACKGROUND-COLOR: rgb(255,255,0)">c016 c02b </SPAN>0001 0001 0000 0258 ifen...+.......X<BR>0x0060: 0004 790e 584c c02b 0001 0001 0000 0258 ..y.XL.+.......X<BR>0x0070: 0004 790e 590a <SPAN style="BACKGROUND-COLOR: rgb(255,255,0)">c02f</SPAN> 0002 0001 0001 518b ..y.Y../......Q.<BR>0x0080: 0006 <SPAN style="BACKGROUND-COLOR: rgb(255,255,0)">036e 7335 c02f c02f</SPAN> 0002 0001 0001 ...ns5././......<BR>0x0090: 518b 0006 <SPAN style="BACKGROUND-COLOR: rgb(255,255,0)">036e 7336 c02f c02f</SPAN> 0002 0001 Q....ns6././....<BR>0x00a0: 0001 518b 0006 <SPAN style="BACKGROUND-COLOR: rgb(255,255,0)">036e 7331 c02f c02f</SPAN> 0002 ..Q....ns1././..<BR>0x00b0: 0001 0001 518b 0006 <SPAN style="BACKGROUND-COLOR: rgb(255,255,0)">036e 7333 c02f</SPAN> ....Q....ns3./<BR> 注意<SPAN style="COLOR: rgb(255,0,255)"><EM>8180</EM></SPAN>,也就是二进制的 1 0000 0 0 1 1 000 0000 ,说明是应答,置了RD和RA位<BR> 黄色背景为压缩编码,比如<SPAN style="BACKGROUND-COLOR: rgb(255,255,0)">c016</SPAN>就代表第22个字节,也就是com。</FONT></SPAN></P></DIV></DIV></DIV>
页:
[1]