Tại sao / Proc / net / tcp6 đại diện cho :: 1 là :: 100: 0


13

Tôi đã viết một tiện ích để kiểm tra / Proc / net / tcp và tcp6 cho các kết nối hoạt động vì nó nhanh hơn so với phân tích đầu ra netstat.

Vì tôi không thực sự kích hoạt ipv6 nên tôi chủ yếu sử dụng localhost làm điểm tham chiếu. Đây là bản sao của tôi / 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

Đây là netstat phù hợp -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      -      

Các mục nhập 0-3 từ tcp6 tương ứng với :: (tất cả ipv6), nhưng mục 4 được cho là mục tương ứng cho :: 1.

Đây là nơi tôi bối rối ...

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

Khi tôi chạy :: 1 thông qua một số mã để tạo đại diện hex đầy đủ, tôi nhận được:

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

Tôi không thể lập trình hai giá trị này theo cách lập trình, vì chúng không khớp (rõ ràng). Tại sao chúng không khớp? Tại sao kernel nghĩ :: 100: 0 là :: 1?

Câu trả lời:


11

Điều này là do thứ tự byte phản trực giác trong /proc/net/tcp6. Địa chỉ được xử lý như bốn từ bao gồm bốn byte mỗi. Trong mỗi bốn từ đó, bốn byte được viết theo thứ tự ngược lại.

2001:0db8       :: 0123:4567:89ab:cdef would thus come out as:
B80D 0120 00000000 6745 2301 EFCD AB89 (with spaces inserted for clarity).

Điều này có lẽ là do sự khác biệt về endianness. Hầu hết các PC ngày nay sử dụng IA32 hoặc AMD64 đang sử dụng độ bền ngược với IP được thiết kế. Tôi không có bất kỳ hệ thống nào khác để thử nghiệm để tìm hiểu xem bạn có thể dựa vào / Proc / net / tcp6 luôn trông như thế không. Nhưng tôi đã xác minh rằng đó là trường hợp trên cả kiến ​​trúc IA32 và AMD64.


Câu trả lời tốt nhưng có thể tốt hơn để cung cấp rõ ràng hơn. Câu thứ hai của bạn không hoàn toàn rõ ràng như nó có thể, tôi nghĩ lý do duy nhất có ý nghĩa là người khác đã giải thích nó cho tôi khác đi.
gregswift

@gregswift kể từ khi OP không bao giờ hành động, có lẽ bạn có thể tự chỉnh sửa điều này? Đây là một câu trả lời tốt cho một câu hỏi hay và một chút thông tin này sẽ có giá trị IMO.
André Chalella

@kasperd đã chỉnh sửa nó ngày hôm qua. Tôi vừa sắp xếp lại ví dụ và thêm một số định dạng để hy vọng cung cấp bất kỳ bối cảnh bổ sung nào
gregswift

3

Đã tìm thấy mô-đun perl này dành cho phân tích cú pháp / Proc / net / tcp http://search.cpan.org/~salva/Linux-Proc-Net-TCP-0.05/lib/Linux/Proc/Net/TCP.pm Nó trích dẫn tài liệu kernel như dưới đây.

This document describes the interfaces /proc/net/tcp and
/proc/net/tcp6.  Note that these interfaces are deprecated in favor
of tcp_diag.

These /proc interfaces provide information about currently active TCP
connections, and are implemented by tcp4_seq_show() in
net/ipv4/tcp_ipv4.c and tcp6_seq_show() in net/ipv6/tcp_ipv6.c,
respectively.

It will first list all listening TCP sockets, and next list all
established TCP connections. A typical entry of /proc/net/tcp would
look like this (split up into 3 parts because of the length of the
line):

46: 010310AC:9C4C 030310AC:1770 01 
|      |      |      |      |   |--> connection state
|      |      |      |      |------> remote TCP port number
|      |      |      |-------------> remote IPv4 address
|      |      |--------------------> local TCP port number
|      |---------------------------> local IPv4 address
|----------------------------------> number of entry

00000150:00000000 01:00000019 00000000  
  |        |     |     |       |--> number of unrecovered RTO timeouts
  |        |     |     |----------> number of jiffies until timer expires
  |        |     |----------------> timer_active (see below)
  |        |----------------------> receive-queue
  |-------------------------------> transmit-queue

1000        0 54165785 4 cd1e6040 25 4 27 3 -1
|          |    |     |    |     |  | |  | |--> slow start size threshold, 
|          |    |     |    |     |  | |  |      or -1 if the threshold
|          |    |     |    |     |  | |  |      is >= 0xFFFF
|          |    |     |    |     |  | |  |----> sending congestion window
|          |    |     |    |     |  | |-------> (ack.quick<<1)|ack.pingpong
|          |    |     |    |     |  |---------> Predicted tick of soft clock
|          |    |     |    |     |              (delayed ACK control data)
|          |    |     |    |     |------------> retransmit timeout
|          |    |     |    |------------------> location of socket in memory
|          |    |     |-----------------------> socket reference count
|          |    |-----------------------------> inode
|          |----------------------------------> unanswered 0-window probes
|---------------------------------------------> uid

timer_active:
0  no timer is pending
1  retransmit-timer is pending
2  another timer (e.g. delayed ack or keepalive) is pending
3  this is a socket in TIME_WAIT state. Not all fields will contain 
 data (or even exist)
4  zero window probe timer is pending

0

Im phân tích cú pháp / Proc / net / tcp, cũng / tcp6, / udp6 trên Android và đây là phương thức đơn giản để chuyển đổi, trong Java. Cảm ơn kasperd đã hướng dẫn tôi giải pháp này.

/**B80D01200000000067452301EFCDAB89 -> 2001:0db8:0000:0000:0123:4567:89ab:cdef
 * */
public static String toRegularHexa(String hexaIP){
    StringBuilder result = new StringBuilder();
    for(int i=0;i<hexaIP.length();i=i+8){
        String word = hexaIP.substring(i,i+8);
        for (int j = word.length() - 1; j >= 0; j = j - 2) {
            result.append(word.substring(j - 1, j + 1));
            result.append((j==5)?":":"");//in the middle
        }
        result.append(":");
    }
    return result.substring(0,result.length()-1).toString();
}
/**0100A8C0 -> 192.168.0.1*/
public static String hexa2decIPv4 (String hexa) {
    StringBuilder result = new StringBuilder();
    //reverse Little to Big
    for (int i = hexa.length() - 1; i >= 0; i = i - 2) {
        String wtf = hexa.substring(i - 1, i + 1);
        result.append(Integer.parseInt(wtf, 16));
        result.append(".");
    }
    //remove last ".";
    return result.substring(0,result.length()-1).toString();
}
/**0000000000000000FFFF00008370E736 -> 0.0.0.0.0.0.0.0.0.0.255.255.54.231.112.131
  0100A8C0 -> 192.168.0.1
*/
public static String hexa2decIP (String hexa) {
    StringBuilder result = new StringBuilder();
    if(hexa.length()==32){
        for(int i=0;i<hexa.length();i=i+8){
            result.append(hexa2decIPv4(hexa.substring(i, i + 8)));
            result.append(".");
        }
    }else {
        if(hexa.length()!=8){return "0.0.0.0";}
        return hexa2decIPv4(hexa);
    }
    //remove last ".";
    return result.substring(0,result.length()-1).toString();
}

/**Simple hexa to dec, for ports 
 * 01BB -> 403
 * */
public static String hexa2decPort(String hexa) {
    StringBuilder result = new StringBuilder();
    result.append(Integer.parseInt(hexa, 16));
    return result.toString();
}

Điều này có trả lời câu hỏi không?
Andrew Schulman

Tôi có nên xóa nó? Có lẽ nó giúp ai đó sẽ thực hiện phân tích cú pháp ipv6 trong tương lai hoặc ai đó có thể hiểu rõ hơn khi xem mã thực.
Jan Tancibok

Không ai trong đối tượng mục tiêu có khả năng thực hiện bất kỳ chương trình nào trong Java hoặc bất kỳ ngôn ngữ nào khác.
Michael Hampton

@MichaelHampton Đó là một cường điệu. Có những người làm cả quản trị hệ thống và phát triển. Tôi là một trong số họ. (Mặc dù đã 9 năm kể từ lần cuối tôi làm Java.)
kasperd

@kasperd Vấn đề là, mọi người sẽ không nghĩ đến Server Fault để lấy mẫu mã. Đó là trang web khác . :)
Michael Hampton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.