Является ли ::ffff:127.0.0.1 локальным хостом?

Я знакомлюсь с IPv6 и читал, что адреса IPv4 можно сопоставить с IPv6 с помощью префикса ::ffff:. Это заставило меня задуматься о том, относится ли адрес ::ffff:127.0.0.1 к localhost, поэтому я написал простую программу на C, которая использует getaddrinfo() и IN6_IS_ADDR_LOOPBACK макрос для проверки, является ли возвращаемый адрес петлевым.

Я протестировал программу с ::1 и другими вариациями петлевого адреса, и, как и ожидалось, программа говорит, что это петлевой адрес. Но, к моему удивлению, когда я пробую ::ffff:127.0.0.1, программа говорит, что это не так! Как это возможно? Я что-то упустил?

Вот упрощенная версия исходного кода моей программы:

struct addrinfo hints, *servinfo;
int rv;

memset(&hints, 0, sizeof(hints));

hints.ai_family = AF_UNSPEC; // IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM;

/* hostname_or_ip is entered from the command line */
if ( (rv = getaddrinfo(hostname_or_ip, NULL, &hints, &servinfo)) != 0) {
    exit(1);
}

struct addrinfo *p = servinfo;
struct sockaddr_in6 *h = (struct sockaddr_in6 *) p->ai_addr;
int is_loopback = IN6_IS_ADDR_LOOPBACK(&h->sin6_addr) ? 1 : 0;

printf("%s\n", is_loopback ? "YES!" : "NO!");

person Claudix    schedule 12.04.2018    source источник


Ответы (1)


Если вы принимаете входящие соединения IPv4 через сокет IPv6, адрес IPv4 должен быть дополнен до 128 бит. Это делается путем добавления ::ffff:. Итак, вы видите петлевой адрес IPv4.

При проверке, является ли адрес петлевым адресом IPv6, ответ будет отрицательным, потому что ::1 — это петлевой адрес IPv6. Адрес, который вы видите, классифицируется как адрес IPv6, сопоставленный с IPv4. Сопоставленный адрес IPv4 просто является петлевым адресом IPv4, но с точки зрения стека IPv6 это просто сопоставленный адрес.

person Sander Steffann    schedule 12.04.2018
comment
Итак, если у меня есть сокет IPv6, прослушивающий локальный хост, никакие соединения, направленные на :ffff:127.0.0.1, не будут приняты, потому что это просто другой IPv6-адрес, отличный от ::1. Благодарю вас! - person Claudix; 14.04.2018
comment
Сопоставленный адрес обычно встречается при прослушивании неопределенного адреса IPv6. При создании нескольких сокетов для прослушивания определенного адреса проще явно создать сокеты для протокола каждого адреса. - person Sander Steffann; 14.04.2018