/ / Wie l√∂st das Betriebssystem eine Verbindungsanforderung f√ľr 0.0.0.0 auf? - Linux, Networking, IP

Wie l√∂st das Betriebssystem eine Verbindungsanforderung f√ľr 0.0.0.0 auf? - Linux, Networking, IP

Nach meinem Verständnis bedeutet 0.0.0.0 alle Netzwerkschnittstellen dieses Hosts (einschließlich 127.0.0.1).

Angenommen, ich habe drei Schnittstellen 192.0.2.40, 203.0.113.150 und 127.0.0.1 auf einem Host (OS Linux).

Am 192.0.2.40:777 habe ich ServerA. Am 203.0.113.150: 777, ich habe ServerB. Wie l√∂st das Betriebssystem eine Verbindungsanforderung f√ľr 0.0.0.0 auf? Ich meine, wenn der gleiche Port (777) auf verschiedenen Schnittstellen lauscht, welcher Server (ServerA oder ServerB) und warum wird verbunden, wenn ich in Terminal tun wird this Wirt telnet 0.0.0.0 777

Antworten:

6 f√ľr Antwort ‚ĄĖ 1

Dies bedeutet nur, dass als Quelladresse (d. H. Wann Bindung ein Socket zu einer lokalen Schnittstelle). Als Zieladresse hat es diese Bedeutung nicht - es ist technisch gesehen eine illegale Adresse.

Es scheint jedoch, dass urspr√ľnglich BSD es behandelt hat als Loopback-Verbindung und Linux macht weiter.

Bei IPv4 wird ein Ziel mit allen Nullen verarbeitet net/ipv4/route.c bei der Routensuche:

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;
}
...
}

Was bedeutet "Wenn das Ziel leer ist, f√ľllen Sie es mit 127.0.0.1 aus und leiten Sie √ľber die lo Schnittstelle ". Das Betriebssystem gibt vor, dass Sie versucht haben, eine Verbindung zu localhost herzustellen.

Dasselbe wird in IPv6 auf Protokollebene (einzeln von TCP und UDP) behandelt. Beispielsweise, net/ipv6/tcp_ipv6.c enthält:

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;
}
...
}

Währenddessen in 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) */
...
}