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