IPv4 TCP कनेक्शन tcp6 के रूप में क्यों दिखाई दे रहे हैं?


30

यहाँ netsat -tupnमेरे डेबियन जेसी सर्वर का आउटपुट है :

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 10.0.0.12:445           10.0.0.20:49729         ESTABLISHED 26277/smbd      
tcp        0      0 10.0.0.12:443           10.0.0.21:44162         ESTABLISHED 1400/nginx: worker 
tcp        0      0 10.0.0.12:445           10.0.0.21:46650         ESTABLISHED 23039/smbd      
tcp        0      0 10.0.0.12:443           10.0.0.20:54584         ESTABLISHED 1400/nginx: worker 
tcp        0      0 10.0.0.12:139           10.0.0.225:10425        ESTABLISHED 23701/smbd      
tcp        0      0 10.0.0.12:445           10.0.0.217:49179        ESTABLISHED 21535/smbd      
tcp        0      0 10.0.0.12:445           10.0.0.217:49178        ESTABLISHED 21534/smbd      
tcp        0      0 10.0.0.12:445           10.0.0.20:64636         ESTABLISHED 21470/smbd      
tcp        0      0 10.0.0.12:443           10.0.0.21:44198         ESTABLISHED 1400/nginx: worker 
tcp        0      0 10.0.0.12:2049          10.0.0.16:752           ESTABLISHED -               
tcp        0      0 10.0.0.12:222           10.0.0.21:55514         ESTABLISHED 23111/sshd: redacted
tcp6       0      0 10.0.0.12:4243          10.0.0.20:64702         ESTABLISHED 31307/java      
tcp6       0      0 10.0.0.12:48932         162.222.40.93:443       ESTABLISHED 31307/java      
tcp6       0      0 10.0.0.12:49093         216.17.8.47:443         ESTABLISHED 31307/java 

पीआईडी ​​31307 क्रैशप्लान बैकअप इंजन, जावा संस्करण है 1.7.0_45। दो गैर- RFC1918 IPv4 पते CrashPlan के सर्वर हैं और 10.0.0.20:64702क्लाइंट को चलाने वाला मेरा कंप्यूटर है।

अंतिम तीन कनेक्शन tcp6 के रूप में क्यों दिखाते हैं भले ही वे IPv4 पते हों?

जवाबों:


33

यह इसलिए हो रहा है क्योंकि डिफ़ॉल्ट रूप से, AF_INET6 सॉकेट वास्तव में IPv4 और IPv6 दोनों के लिए काम करेंगे। देखें अनुभाग 3.7 - IPv6 के लिए बेसिक सॉकेट इंटरफ़ेस एक्सटेंशन - आरएफसी 3493 के आईपीवी 4 नोड्स के साथ संगतता

यहाँ कोड का एक छोटा उदाहरण है जो इस प्रकार की स्थिति उत्पन्न कर सकता है:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define TEST_PORT 5555

#define xstr(s) str(s)
#define str(x) #x

int main (int argc, char **argv)
{
    int v6server;
    int v4client;
    int rc;

    struct sockaddr_in6 s6addr = {
        .sin6_family = AF_INET6,
        .sin6_flowinfo = 0,
        .sin6_port = htons(TEST_PORT),
        .sin6_addr = in6addr_any
    };

    struct sockaddr_in c4addr = {
        .sin_family = AF_INET,
        .sin_port = htons(TEST_PORT),
        .sin_addr = inet_addr("127.0.0.1")
    };

    // Open an IPv6 listener
    v6server = socket(AF_INET6, SOCK_STREAM, 0);
    if (v6server < 0) perror("socket()");

    rc = bind(v6server, (struct sockaddr *)&s6addr, sizeof(s6addr));
    if (rc != 0) perror("bind()");

    rc = listen(v6server, 0);
    if (rc != 0) perror("listen()");

    // Connect to the listener with an IPv4 socket
    v4client = socket(AF_INET, SOCK_STREAM, 0);
    if (v4client < 0) perror("socket()");

    rc = connect(v4client, (struct sockaddr *)&c4addr, sizeof(c4addr));
    if (rc != 0) perror("connect()");

    // inspect open sockets
    system("netstat -tan | grep " xstr(TEST_PORT));

    close(v4client);
    close(v6server);
}

मेरे उबंटू मशीन पर आउटपुट है:

$ make v4v6
cc     v4v6.c   -o v4v6
$ ./v4v6 
tcp        0      0 127.0.0.1:46518         127.0.0.1:5555          ESTABLISHED
tcp6       0      0 :::5555                 :::*                    LISTEN     
tcp6       0      0 127.0.0.1:5555          127.0.0.1:46518         ESTABLISHED
$ 
  • tcp6 LISTENप्रवेश बंदरगाह पर सॉकेट सुन 5555. ध्यान दें कि यह एक AF_INET6 सॉकेट है, इसलिए यह दोनों IPv4 और IPv6 इनकमिंग कनेक्शन स्वीकार करेंगे के लिए है।
  • tcp ESTABLISHEDप्रवेश श्रोता (सक्रिय कनेक्शन) के लिए एक AF_INET4 सॉकेट जोड़ने का परिणाम है।
  • tcp6 ESTABLISHEDप्रवेश श्रोता सॉकेट से पैदा की निष्क्रिय कनेक्शन के लिए है। यह दिखाता है कि tcp6, चूंकि यह एक tcp6श्रोता से लिया गया है; हालाँकि यह एक IPv4 से एक कनेक्शन का प्रतिनिधित्व करता है।

निम्नलिखित ध्यान देने योग्य है:

  • यह व्यवहार AF_INET6 सॉकेट के लिए विशेष है। AF_INET (IPv4) सॉकेट बस नहीं कर सकते हैं और कुछ भी IPv6 के साथ सौदा नहीं करेंगे।
  • इस व्यवहार को IPV6_V6ONLY सॉकेट विकल्प के साथ ओवरराइड किया जा सकता है । इस विकल्प को सेट करने से सॉकेट केवल IPv6 को हैंडल करेगा और IPv4 को कुछ भी अनुमति नहीं देगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.