Что такое AF_INET и зачем мне это нужно?

201

Я начинаю программировать сокеты и продолжаю видеть это AF_INET.

Тем не менее, я никогда не видел, чтобы что-то еще использовалось на его месте. Мои лекторы не очень полезны и просто говорят: «Тебе это просто нужно».

Итак, мои вопросы:

  • Какова цель AF_INET?
  • Что-нибудь еще используется вместо этого?
    • Если нет, то почему это там? Для возможных изменений в будущем?
    • Если так, то что и почему?
Smashery
источник

Ответы:

269

AF_INETэто семейство адресов, которое используется для обозначения типа адресов, с которыми может взаимодействовать ваш сокет (в данном случае это адреса Internet Protocol v4). Когда вы создаете сокет, вы должны указать его семейство адресов, и тогда вы можете использовать только адреса этого типа с сокетом. Например, ядро ​​Linux поддерживает 29 других семейств адресов, таких как AF_UNIXсокеты UNIX ( ) и IPX ( AF_IPX), а также связь с IRDA и Bluetooth ( AF_IRDAи AF_BLUETOOTH, но сомнительно, что вы будете использовать их на таком низком уровне).

По большей части, AF_INETбезопаснее всего использовать программирование сокетов по сети. Существует также AF_INET6для интернет-протокола v6 адресов.

Надеюсь это поможет,

Джордж Шор
источник
43

Основной целью AF_INET было разрешение других возможных сетевых протоколов или семейств адресов (AF для семейства адресов; PF_INET для семейства интернет-протоколов (IPv4)). Например, вероятно, еще есть несколько сетей Netware SPX / IPX; Существовали и другие сетевые системы, такие как DECNet, StarLAN и SNA, не говоря уже о непорожденном ISO OSI (Взаимодействие открытых систем), и они не обязательно использовали вездесущий IP-адрес для идентификации однорангового хоста в сетевых соединениях.

Вездесущей альтернативой AF_INET (который, ретроспективно, должен был называться AF_INET4) является AF_INET6 для семейства адресов IPv6. IPv4 использует 32-битные адреса; IPv6 использует 128-битные адреса.

Вы можете увидеть некоторые другие значения - но они необычные. Это там, чтобы учесть альтернативы и будущие направления. Интерфейс сокетов на самом деле очень общий - и это одна из причин его процветания, когда другие сетевые интерфейсы засохли.

Жизнь (в основном) стала проще - будь благодарен.

Джонатан Леффлер
источник
Спасибо за ваш ответ - я полагаю, что ваш ответ на мой первый вопрос заключается в том, что его цель - определить, какой сетевой протокол использовать? Не могли бы вы, пожалуйста, быть более конкретными по другим вопросам?
Smashery
Хороший вопрос об AF_INET6; другие семейства адресов поддерживаются в некоторых ОС.
MarkR
15

Вам нужны такие аргументы, как AF_UNIX или AF_INET, чтобы указать, какой тип адресации сокета вы будете использовать для реализации связи через сокет IPC. AF обозначает адрес семьи.

Как и в стандартном BSD сокете (принятом в модуле сокетов Python), адреса представлены следующим образом:

  1. Одна строка используется для семейства адресов AF_UNIX / AF_LOCAL. Эта опция используется для IPC на локальных машинах, где IP-адрес не требуется.

  2. Пара (хост, порт) используется для семейства адресов AF_INET, где хост - это строка, представляющая либо имя хоста в нотации интернет-домена, например, «daring.cwi.nl», либо IPv4-адрес, например, «100.50.200.5», а порт: целое число Используется для связи между процессами через Интернет.

AF_UNIX, AF_INET6, AF_NETLINK, AF_TIPC, AF_CAN, AF_BLUETOOTH, AF_PACKET, AF_RDS - это другая опция, которую можно использовать вместо AF_INET .

Эта ветка о различиях между AF_INET и PF_INET также может быть полезной.

Ави Мехенвал
источник
14

Сокеты характеризуются своим доменом, типом и транспортным протоколом. Общие домены:

  1. AF_UNIX: формат адреса - UNIX путь

  2. AF_INET: формат адреса - хост и номер порта

(на самом деле есть много других опций, которые можно использовать здесь для специальных целей). обычно мы используем AF_INET для программирования сокетов

Ссылка: http://www.cs.uic.edu/~troy/fall99/eecs471/sockets.html

Асиш П Мэтью
источник