ওএস কীভাবে 0.0.0.0 এ সংযোগ স্থাপনের জন্য একটি অনুরোধ সমাধান করে?


1

আমি যেমন বুঝতে পেরেছি 0.0.0.0 এর অর্থ এই হোস্টের সমস্ত নেটওয়ার্ক ইন্টারফেস (127.0.0.1 সহ)।

ধরুন আমার কয়েকটি হোস্টে (ওএস লিনাক্স) তিনটি 192.0.2.40, 203.0.113.150 এবং 127.0.0.1 রয়েছে।

192.0.2.40:777 এ, আমার সার্ভারএ রয়েছে। 203.0.113.150:777 এ, আমার সার্ভারবি আছে। ওএস কীভাবে 0.0.0.0 এ সংযোগ স্থাপনের জন্য একটি অনুরোধ সমাধান করে? আমি বোঝাতে চাইছি যখন একই পোর্টটি () 777) বিভিন্ন ইন্টারফেসে শুনছে কী সার্ভার (সার্ভারএ বা সার্ভারবি) এবং কেন thisহোস্টের টার্মিনালে করবো কেন সংযুক্ত হবে?telnet 0.0.0.0 777


@ ডেভিডপস্টিল আপনি কি বলতে পারেন যে লিনাক্স ওএস আপনাকে 0.02.0.0 লোকালহোস্টে যে নকল দিয়েছে তা পুনর্নির্দেশ করে কেন? আমি দেখছি না, তাই না?
পাভেল

সম্মত, তথাকথিত সদৃশ কিছুই কিন্তু।
প্লাগওয়াশ

উত্তর:


5

এর অর্থ কেবলমাত্র উত্স ঠিকানা হিসাবে (যেমন কোনও স্থানীয় ইন্টারফেসে সকেটকে আবদ্ধ করার সময়)। গন্তব্য ঠিকানা হিসাবে এর এর অর্থ নেই - এটি প্রযুক্তিগতভাবে একটি অবৈধ ঠিকানা।

তবে মনে হয় মূলত বিএসডি এটিকে একটি লুপব্যাক সংযোগ হিসাবে গণ্য করেছে এবং লিনাক্স এটি বহন করে।

আইপিভি 4-এর জন্য, একটি অল-জিরো গন্তব্যটি net/ipv4/route.cরুট দেখার সময় পরিচালনা করা হয়:

struct rtable *ip_route_output_key_hash_rcu(...) {
    ...
    if (!fl4->daddr) {
        fl4->daddr = fl4->saddr;
        if (!fl4->daddr)
            fl4->daddr = fl4->saddr = htonl(INADDR_LOOPBACK);
        dev_out = net->loopback_dev;
        fl4->flowi4_oif = LOOPBACK_IFINDEX;
        res->type = RTN_LOCAL;
        flags |= RTCF_LOCAL;
        goto make_route;
    }
    ...
}

যা "গন্তব্য শূন্য থাকলে, এটি 127.0.0.1 দিয়ে পূরণ করুন এবং loইন্টারফেসের মাধ্যমে রুট করুন " এ অনুবাদ করে। ওএস ভান করে যে আপনি লোকালহোস্টের সাথে সংযোগ স্থাপনের চেষ্টা করেছিলেন।

আইপিভি 6-তে একই প্রোটোকল স্তরে পরিচালনা করা হয় (স্বতন্ত্রভাবে টিসিপি এবং ইউডিপি দ্বারা)। উদাহরণস্বরূপ, net/ipv6/tcp_ipv6.cরয়েছে:

static int tcp_v6_connect(...) {
    ...
    /*
     *  connect() to INADDR_ANY means loopback (BSD'ism).
     */
    if (ipv6_addr_any(&usin->sin6_addr)) {
        if (ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))
            ipv6_addr_set_v4mapped(htonl(INADDR_LOOPBACK),
                           &usin->sin6_addr);
        else
            usin->sin6_addr = in6addr_loopback;
    }
    ...
}

এদিকে net/ipv6/udp.c:

int udpv6_sendmsg(...) {
    ...
    if (!ipv6_addr_any(daddr))
        fl6.daddr = *daddr;
    else
        fl6.daddr.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */
    ...
}

আপনার ব্যাখ্যার জন্য ধন্যবাদ. সুতরাং, আমার উদাহরণে আমি যখন করব তখন আমি telnet 0.0.0.0 777সংযোগ প্রত্যাখ্যান করব। তবে, আমার যদি একটি সার্ভারসিও থাকে তবে 127.0.0.0:777আমি সার্ভারকে সংযোগ করব would আমি কি এটা ঠিক বুঝতে পারি?
পাভেল

আমি আপনার উত্তরটি গ্রহণ করি না কারণ এটি তত্ত্ব, তবে কংক্রিট প্রশ্নের সুনির্দিষ্ট উত্তর নয়।
পাভেল

2
"ওএস কীভাবে [...]" একটি প্রশ্নের জন্য, সেই ওএসের উত্স কোডটি যতটা সম্ভব পারা যায় concrete
মাধ্যাকর্ষণ

@ পাভেলক উত্তরটি উভয়ই কংক্রিট এবং সঠিক এবং আপনার এটি গ্রহণ করা উচিত।
জেনি ডি

@ জেনিডি আপনি কখনও হাল ছেড়ে দেন না, তাই না? তবে, এটি যথেষ্ট। আপনি ডাউনভিট করতে পারেন তবে আমি করব না।
পাভেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.