/ Proc / net / tcp6 neden :: 1 olarak :: 100: 0


13

Aktif protesto / proc / net / tcp ve tcp6'yı netstat çıktısını ayrıştırmaktan daha hızlı olarak kontrol etmek için bir yardımcı program yazıyordum.

Aslında ipv6 etkin olmadığı için esas olarak referans noktası olarak localhost kullanıyordum. İşte benim / 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

İşte eşleşen 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'dan 0-3 girişleri :: 'nin (tüm ipv6) ile eşleşir, ancak giriş 4'ün :: 1 için karşılık gelen giriş olduğu varsayılır.

İşte kafam karıştı ...

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

Ne zaman tam hex gösterimi oluşturmak için bazı kod aracılığıyla :: 1 çalıştırdığınızda:

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

Programlı olarak bu iki değeri sıralayamam, çünkü eşleşmiyorlar (belli ki). Neden uyuşmuyorlar? Çekirdek neden :: 100: 0 :: 1 olduğunu düşünüyor?

Yanıtlar:


11

Bu, içindeki sezgisel bayt sırasından kaynaklanmaktadır /proc/net/tcp6. Adres, her biri dört bayttan oluşan dört kelime olarak ele alınır. Bu dört kelimenin her birinde dört bayt ters sırada yazılır.

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

Bu muhtemelen endianlık farklılıklarından kaynaklanmaktadır. Günümüzde çoğu bilgisayar, IP'nin tasarlandığından ters endianiteyi kullanan IA32 veya AMD64 kullanıyor. / Proc / net / tcp6'ya her zaman böyle bakarsanız güvenebileceğinizden emin olmak için test edilecek başka sistemim yok. Ancak hem IA32 hem de AMD64 mimarileri için geçerli olduğunu doğruladım.


İyi cevap ama daha fazla açıklama yapmak daha iyi olabilir. İkinci cümleniz olabildiğince net değil, sanırım bunun mantıklı olmasının tek nedeni, başka birinin bana farklı bir şekilde açıklamış olmasıydı.
gregswift

@gregswift, OP hiç harekete geçmediği için, belki bunu kendiniz düzenleyebilirsiniz? Bu iyi bir soruya iyi bir cevaptır ve bu bilgi biraz değerli IMO olacaktır.
André Chalella

@kasperd dün düzenlemişti. Sadece örneği yeniden
sıraladım

3

/ Perc / net / tcp ayrıştırma amaçlı bu perl modülünü buldum http://search.cpan.org/~salva/Linux-Proc-Net-TCP-0.05/lib/Linux/Proc/Net/TCP.pm Alıntılar çekirdek belgeleri aşağıda gösterildiği gibi.

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

Android'de / proc / net / tcp, ayrıca / tcp6, / udp6'yı ayrıştırıyorum ve bu, Java'da dönüşüm için basit yöntemlerim. Bana bu çözüme rehberlik ettiğin için teşekkürler kasperd.

/**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();
}

Bu soruya cevap veriyor mu?
Andrew Schulman

Silmeli miyim? Belki gelecekte ipv6 ayrıştırma yapacak birine yardımcı olabilir ya da birileri gerçek koda bakarak daha iyi anlamak alabilirsiniz.
Jan Tancibok

Hedef kitlenin içinde hiç kimse Java veya başka bir dilde programlama yapmıyor olabilir.
Michael Hampton

@MichaelHampton Bu bir abartı. Hem sistem yönetimi hem de geliştirme yapan insanlar var. Ben onlardan biriyim. (Java'yı son yaptığımdan bu yana 9 yıl geçmesine rağmen.)
kasperd

@kasperd Mesele şu ki, insanlar kod örnekleri için Sunucu Hatası'na gelmeyi düşünmeyecekler . Bu diğer site. :)
Michael Hampton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.