เหตุใด / proc / net / tcp6 แสดงถึง :: 1 เป็น :: 100: 0


13

ฉันเขียนยูทิลิตี้เพื่อตรวจสอบ / 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      -      

รายการ 0-3 จาก tcp6 สอดคล้องกับ :: (ipv6 ทั้งหมด) แต่รายการ 4 เป็นรายการที่สอดคล้องกันสำหรับ :: 1

ที่นี่ฉันสับสน ...

000000000000000000000000000001000000 => 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

คำตอบ:


11

นี่คือสาเหตุที่ counterintuitive /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).

นี่อาจเป็นเพราะความแตกต่างของ endianness พีซีส่วนใหญ่ในปัจจุบันใช้ IA32 หรือ AMD64 ซึ่งใช้ endianness ตรงกันข้ามกับสิ่งที่ IP ออกแบบไว้ ฉันไม่มีระบบอื่น ๆ ที่จะทดสอบว่าคุณสามารถพึ่งพา / proc / net / tcp6 ได้หรือไม่ แต่ฉันยืนยันว่าเป็นกรณีของทั้งสถาปัตยกรรม IA32 และ AMD64


คำตอบที่ดี แต่อาจดีกว่าที่จะให้คำอธิบายที่ชัดเจนยิ่งขึ้น ประโยคที่สองของคุณไม่ค่อยชัดเจนเท่าที่ควรฉันคิดว่าเหตุผลเดียวที่ทำให้รู้สึกได้คือมีคนอื่นเพิ่งอธิบายให้ฉันแตกต่าง
gregswift

@gregswift เนื่องจาก OP ไม่เคยดำเนินการบางทีคุณสามารถแก้ไขได้ด้วยตัวเอง? นี่เป็นคำตอบที่ดีสำหรับคำถามที่ดีและข้อมูลนี้จะเป็น IMO ที่มีค่า
André Chalella

@kasperd ทำการแก้ไขเมื่อวานนี้ ฉันเพิ่งเรียงตัวอย่างใหม่และเพิ่มการจัดรูปแบบบางอย่างเพื่อหวังว่าจะให้บริบทเพิ่มเติม
gregswift

3

พบโมดูล Perl นี้มีไว้สำหรับแยก / proc / net / tcp http://search.cpan.org/~salva/Linux-Proc-Net-TCP-0.05/lib/Linux/Proc/Net/TCP.pm มันคำพูด เอกสารประกอบเคอร์เนลที่แสดงด้านล่าง

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

ฉันกำลังแยกวิเคราะห์ / proc / net / tcp, ยัง / tcp6, / udp6 บน Android และนี่คือวิธีง่าย ๆ สำหรับการแปลงใน Java ขอบคุณ 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();
}

นี่ตอบคำถามหรือไม่
Andrew Schulman

ฉันควรลบหรือไม่ อาจช่วยคนที่จะทำการแยกวิเคราะห์ ipv6 ในอนาคตหรือบางคนสามารถเข้าใจรหัสจริงได้ดีขึ้น
Jan Tancibok

ไม่มีใครในกลุ่มเป้าหมายที่น่าจะทำการเขียนโปรแกรมใด ๆ ใน Java หรือภาษาอื่น ๆ
Michael Hampton

@MichaelHampton พูดเกินจริง มีคนที่ทำทั้งการบริหารระบบและการพัฒนา ฉันเป็นหนึ่งในพวกเขา (แม้ว่ามันจะได้รับ 9 ปีตั้งแต่ฉันสุดท้ายไม่ Java.)
kasperd

@kasperd ประเด็นก็คือผู้คนจะไม่คิดว่าจะมาที่Server Faultสำหรับตัวอย่างโค้ด นั่นคือเว็บไซต์อื่น ๆ :)
Michael Hampton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.