
Когда TCP-соединение устанавливается между двумя сокетами, предположим, что в компьютере есть несколько сетевых карт, поэтому к какому IP-адресу будет привязан сокет [или - какой IP-адрес будет передан в функцию bind() ] до установления связи. Это решает ОС?
В общем, у меня есть несколько сомнений:
- Вызывается ли функция socket(), bind(), connect() ОС? Если да, то какой IP-адрес передается в функцию bind() в случае, если в машине несколько сетевых карт? Я знаю, что могу ошибаться в некоторых местах, пожалуйста, поправьте меня
решение1
Вызываются ли функции socket(), bind(), connect() операционной системой?
Их не зовуткОС – оничастьОС, так их называет программа.
Если да, то какой IP-адрес передается в функцию bind() в случае, если в машине несколько сетевых карт?
Большинство программ не указывают адрес.
Когда программы вызывают bind() для выбора локального порта для приема входящих подключений, они могут использовать специальные значения
[::]
(они же IN6ADDR_ANY_INIT) и0.0.0.0
(они же INADDR_ANY), указывающие, что они будут принимать подключения квсеадреса (текущие и будущие) на всех локальных сетевых картах.При создании исходящих соединений программы обычно не вызывают bind()совсем, позволяя ОС определять как локальный адрес, так и локальный порт.
Каждая ОС имеет немного различную логику выбора исходного адреса. (Например, начиная с Windows 7/Srv2008, ОС будет выбирать наименьший по номеру адрес из исходящего интерфейса. В Linux отдельные записи таблицы маршрутизации могут иметь «предпочтительный» исходный адрес для использования, если программа не выберет его.)
Когда программыделатьуказать локальный адрес, часто он выбирается пользователем, а не программой. (Например, большинство служб имеют настройку «адрес прослушивания» в своей конфигурации.)