我正在编写一个实用程序来检查/ 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架构的情况.