linux – 为什么/ proc / net / tcp6将:: 1表示为:: 100:0

前端之家收集整理的这篇文章主要介绍了linux – 为什么/ proc / net / tcp6将:: 1表示为:: 100:0前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个实用程序来检查/ proc / net / tcp和tcp6以查找活动连接,因为它比解析netstat输出更快.

因为我实际上没有启用ipv6,所以我主要使用localhost作为我的参考点.这是我的/ proc / net / tcp6的副本

sl  local_address                         remote_address                        st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
 0: 00000000000000000000000000000000:006F 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 19587 1 ffff880262630000 100 0 0 10 -1
 1: 00000000000000000000000000000000:0050 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 22011 1 ffff880261c887c0 100 0 0 10 -1
 2: 00000000000000000000000000000000:0016 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 21958 1 ffff880261c88000 100 0 0 10 -1
 3: 00000000000000000000000001000000:0277 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 28592 1 ffff88024eea0000 100 0 0 10 -1

这是匹配的netstat -6 -pant

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp6       0      0 :::111                  :::*                    LISTEN      -                   
tcp6       0      0 :::80                   :::*                    LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -                   
tcp6       0      0 ::1:631                 :::*                    LISTEN      -

来自tcp6的条目0-3对应于::’s(所有ipv6),但条目4应该是:: 1的对应条目.

这是我困惑的地方……

00000000000000000000000001000000 => 0000:0000:0000:0000:0000:0000:0100:0000 => :: 100:0

当我通过一些代码运行:: 1来生成完整的十六进制表示时,我得到:

import binascii
import socket
print binascii.hexlify(socket.inet_pton(socket.AF_INET6,'::1'))
00000000000000000000000000000001

我不能以编程方式将这两个值排成一行,因为它们不匹配(显然).他们为什么不匹配?为什么内核认为:: 100:0是:: 1?

解决方法

这是由于/ proc / net / tcp6中的违反直觉的字节顺序.地址被处理为四个字,每个字由四个字节组成.在这四个字的每一个中,四个字节以相反的顺序写入.
2001:0db8       :: 0123:4567:89ab:cdef would thus come out as:
B80D 0120 00000000 6745 2301 EFCD AB89 (with spaces inserted for clarity).

这可能是由于字节序差异造成的.如今大多数PC都使用IA32或AMD64,它们使用与设计IP相反的字节序.我没有任何其他系统可以测试你是否可以依赖/ proc / net / tcp6看起来像这样.但我验证了IA32和AMD64架构的情况.

猜你在找的Linux相关文章